obtention d'un type d'éléments invaild EN SELENIUM
travailler sur Linux ubuntu 20.04 avec intellij IDEA dernière version communautaire avec firefox et geckodriver
J'essaie d'obtenir des horaires à partir d'une page Web et de les copier dans un fichier .txt (ou une liste n'a pas d'importance)
J'essaye ceci:
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);
lien de la page: 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
voici le html de la page:
<li class="list-group-item scheduleEntryL"><button type="button" class="btn btn-info btn-circle" style="cursor:default;">07</button> 07:10 07:25 07:40 07:55 </li>
et après cela, la sortie est:
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]]
ce qui signifie que ma liste contient 19 éléments mais ce n'est pas ce que je veux
//SOMMAIRE
- Le type d'éléments que j'obtiens n'est pas correct
la liste doit contenir:
[..., 07: 00,07: 10,07: 25, ....]
2.Il devrait contenir 59 éléments car il y a 59 départs indiqués dans la page mais certains d'entre eux sont dans la même ligne
la page a 19 lignes donc elle donne probablement chaque ligne comme UN élément et ce n'est pas non plus ce que je veux
VEUILLEZ AIDER
// J'AI VÉRIFIÉ DES POSTES SIMMILAIRES SUR CETTE PAGE ET JE N'AI PAS AIDÉ
Réponses
Vous utilisez xpath qui renverra des lignes de la page mais pas des éléments réels contenant les valeurs requises. Les valeurs de texte sont également entre deux nœuds, nous devons donc utiliser JavaScript pour cela.
//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);
J'ai ce code exécuté à ma fin et j'obtiens la sortie ci-dessous:
[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]
Veuillez noter que j'ai ajouté des valeurs de la ligne qui contient l'heure avec *, à la fin de la liste. Vous trouverez donc ces valeurs à la fin de la liste.
Pour extraire du texte entre les nœuds, je me suis référé à: ce message SO
De plus, si vous souhaitez sélectionner une valeur déroulante, utilisez la Selectclasse de sélénium:
Select select = new Select(driver.findElement(By.id("lineSelect")));
//to select drop down value: 021 : ΠΛΑΤΕΙΑ ΚΑΝΙΓΓΟΣ - ΓΚΥΖH (ΚΥΚΛΙΚΗ)
select.selectByValue("1151_54_9");