obtendo tipo inválido de elementos EM SELENIUM

Sep 09 2020

trabalhando no Linux ubuntu 20.04 com intellij IDEA última versão da comunidade com firefox e geckodriver

Estou tentando obter alguns horários de uma página da web e copiá-los para um arquivo .txt (ou uma lista não importa)

Estou tentando isso:

WebDriver driver = new FirefoxDriver();
    driver.manage().timeouts().implicitlyWait(2000, TimeUnit.MILLISECONDS); //MAXIMUM WAIT TIME
    driver.get("http://telematics.oasa.gr/#main");
    driver.findElement(By.xpath("//option[contains(.,'021')]")).click();//selecting trip

    List<WebElement> oas = driver.findElements(By.xpath("//div/ul/li"));
    System.out.println(oas.size());
    System.out.println(oas);

link da página : http://telematics.oasa.gr/#lineDetails_1151_021%20:%20%CE%A0%CE%9B%CE%91%CE%A4%CE%95%CE%99%CE%91%20%CE%9A%CE%91%CE%9D%CE%99%CE%93%CE%93%CE%9F%CE%A3%20-%20%CE%93%CE%9A%CE%A5%CE%96H%20(%CE%9A%CE%A5%CE%9A%CE%9B%CE%99%CE%9A%CE%97)_9-86

aqui está o html da página:

    <li class="list-group-item scheduleEntryL"><button type="button" class="btn btn-info btn-circle" style="cursor:default;">07</button>&nbsp;&nbsp;&nbsp;07:10 &nbsp;&nbsp;&nbsp; 07:25 &nbsp;&nbsp;&nbsp; 07:40 &nbsp;&nbsp;&nbsp; 07:55 &nbsp;&nbsp;&nbsp; </li>

e depois disso, a saída é:

    19        

    [[[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li], [[FirefoxDriver: firefox on LINUX (115ffdb6-1eb7-44c4-bebd-dee885674bab)] -> xpath: //div/ul/li]]

o que significa que minha lista tem 19 elementos, mas não é o que eu quero

//RESUMO

  1. O tipo de elementos que recebo não está certo

a lista deve conter:

[..., 07: 00,07: 10,07: 25, ....]

2. Deve conter 59 elemnts porque há 59 partidas dadas na página, mas alguns deles estão na mesma linha

a página tem 19 linhas, então provavelmente está dando cada linha como UM elemento e isso também não é o que eu quero

POR FAVOR AJUDE

// VERIFIQUEI POSTS SIMILARES NESTA PÁGINA E NÃO AJUDEI

Respostas

1 KuldeepKamune Sep 12 2020 at 22:16

Você está usando o xpath, que retornará linhas da página, mas não os elementos reais que contêm os valores necessários. Além disso, os valores de texto estão entre dois nós, portanto, precisamos usar JavaScript para isso.

        //Code to extract Departure time without *
        List<WebElement> oas = driver.findElements(By.xpath("//li[@class='list-group-item scheduleEntryL']"));

        LinkedList<String> timeValues = new LinkedList<String>();
        String myCountryProxy = null;
        
        for(WebElement element:oas)
        {
            //As text is between two nodes, we need to use javaScript as selenium getText() method didn't work for it
            //So in below javaScript, we refer to oas as parent element as then we try to find node which contain text as childNode. In this code its 2nd child node so we have passed value as 1: childNodes[1]
            myCountryProxy = ((JavascriptExecutor)driver).executeScript("return arguments[0].childNodes[1].textContent;", element).toString();
            //Code to remove extra space from String
            if(!myCountryProxy.equalsIgnoreCase("   "))
            {                   
                myCountryProxy = myCountryProxy.replaceAll("     "," ").replaceAll("   ","").replaceAll("     ","");
                myCountryProxy = myCountryProxy.trim();
                //Split string into individual value
                String[] split = myCountryProxy.split("\\s+");
                for(String str:split)
                {
                    timeValues.add(str);
                }                   
            }               
        }

        //Code to extract departure time values with *: 05:00*
        oas = driver.findElements(By.xpath("//span[@class='xtra']"));
        for(WebElement element:oas)
        {
            //here node which contains text is 1st child node only, so we have passed value as childNodes[0]
            myCountryProxy = ((JavascriptExecutor)driver).executeScript("return arguments[0].childNodes[0].textContent;", element).toString();
            timeValues.add(myCountryProxy);
        }

        //Code to extract departure values which are same line of time with * i.e.: 05:10     05:30     05:50  
        oas = driver.findElements(By.xpath("//li[@class='list-group-item scheduleEntryL']/span"));
        if(oas.size()>0)
        {
            oas = driver.findElements(By.xpath("//li[@class='list-group-item scheduleEntryL']/span/.."));
            for(WebElement element:oas)
            {
                //here node which contains text is 4th child node, so we have passed value as childNodes[4]
                myCountryProxy = ((JavascriptExecutor)driver).executeScript("return arguments[0].childNodes[3].textContent;", element).toString();
                //Code to remove extra space from String
                if(!myCountryProxy.equalsIgnoreCase("     "))
                {                   
                    myCountryProxy = myCountryProxy.replaceAll("     "," ").replaceAll("   ","").replaceAll("     ","");
                    myCountryProxy = myCountryProxy.trim();
                    //Split string into individual value
                    String[] split = myCountryProxy.split("\\s+");
                    for(String str:split)
                    {
                        timeValues.add(str);
                    }                   
                }                   
            }
        }

        System.out.println(timeValues);

Eu tenho este código executado no meu final e obtendo o resultado abaixo:

[06:10, 06:25, 06:40, 06:55, 07:05, 07:15, 07:25, 07:35, 07:45, 07:55, 08:05, 08:20, 08:30, 08:40, 08:55, 09:05, 09:15, 09:30, 09:50, 10:10, 10:25, 10:45, 11:00, 11:20, 11:35, 11:55, 12:10, 12:30, 12:45, 13:20, 13:40, 13:55, 14:10, 14:25, 14:35, 14:45, 15:00, 15:10, 15:20, 15:35, 15:45, 15:55, 16:10, 16:20, 16:30, 16:45, 16:55, 17:05, 17:20, 17:35, 17:55, 18:15, 18:30, 18:45, 19:00, 19:20, 19:35, 19:55, 20:10, 20:25, 20:40, 21:00, 21:20, 21:40, 22:05, 22:30, 22:55, 05:00*, 23:20*, 05:10, 05:30, 05:50]

Observe que adicionei valores da linha que contém o tempo com *, no final da lista. Portanto, você encontrará esses valores no final da lista.

Para extrair texto entre nós, referi-me a: este post de SO

Além disso, se você deseja selecionar um valor suspenso, use a Selectclasse de selênio:

Select select = new Select(driver.findElement(By.id("lineSelect")));
//to select drop down value: 021 : ΠΛΑΤΕΙΑ ΚΑΝΙΓΓΟΣ - ΓΚΥΖH (ΚΥΚΛΙΚΗ)
select.selectByValue("1151_54_9");