web-dev-qa-db-fra.com

Comment obtenir tous les éléments "li" de la classe "ul" dans Selenium WebDriver

Je suis nouveau sur le Webdriver Selenium. Je suis tombé sur une exigence où je dois exécuter mon test qui clique sur tous les liens avec dans une section. Quelqu'un peut-il m'aider avec le code Java pour cela. Ci-joint une image qui montre les propriétés firebug de cette section particulière. J'ai essayé le code ci-dessous mais il me renvoie une liste nulle.

public static void main(String[] args) {

    WebDriver driver = new FirefoxDriver();

    driver.get("https://dev.www.tycois.com/");
    driver.manage().window().maximize();

    List<WebElement> allElements = driver.findElements(By.xpath("html/body/div[10]/div/div[1]/div[3]/ul[1]/li[5]"));
    System.out.println(allElements);

    for (WebElement element: allElements) {
        System.out.println(element.getText());
        element.click();          
    }
}

Merci d'avance.

6
Tarun

Les détails ne sont pas clairs, mais il semble que vous essayez d'imprimer les liens dans la section INDUSTRIES du pied de page. Si c'est vrai, cela devrait fonctionner.

driver.get("https://dev.www.tycois.com/");
WebElement industries = driver.findElement(By.cssSelector("div.columns.three.alpha > ul"));
List<WebElement> links = industries.findElements(By.tagName("li"));
for (int i = 1; i < links.size(); i++)
{
    System.out.println(links.get(i).getText());
}

Vous ne pouvez pas cliquer sur les liens de cette boucle car une fois que vous avez cliqué sur le premier, vous ne serez plus sur la page. Je suggérerais que vous stockiez les URL de chaque lien dans un tableau, puis driver.get(url) pour chacun. Ou vous pouvez stocker les URL attendues dans un tableau et comparer les URL des liens aux URL attendues et ne pas avoir à naviguer du tout. Le choix vous appartient...

7
JeffC

La solution de JeffC fonctionne avec le Tweak détaillé ci-dessous -

driver.get("https://dev.www.tycois.com/");
WebElement industries = 
driver.findElement(By.cssSelector("div.columns.three.alpha > ul"));
List<WebElement> links = industries.findElements(By.tagName("li"));
for (int i = 0; i < links.size(); i++)
{
    System.out.println(links.get(i).getText());
}

La réponse alternative ci-dessus, que je ne peux pas commenter car je suis nouveau sur le site,

for(int i=1; i < links.size(); i++)

Cependant, cela manque le premier élément de la liste. Le correctif suggéré à utiliser -

for(int i=1; i <= links.size(); i++)

provoquera une exception IndexOutOfBoundsException.

Pour résoudre ce problème, configurez simplement votre itérateur pour qu'il commence à 0 au lieu de 1

3
david_c

Vous pouvez essayer avec le code ci-dessous.

Modifiez simplement le xpath en fonction de votre application.

List<WebElement> liElements = driver.findElements(By.xpath(".//*[@id='fk-mainhead-id']/div[2]/div/div/ul/li"));
        System.out.println(liElements);

        for(int i=1; i <= liElements.size(); i++)
        {
            WebElement linkElement = driver.findElement(By.xpath(".//*[@id='fk-mainhead-id']/div[2]/div/div/ul/li[" + i + "]/a"));
            System.out.println(linkElement.getText());      

        }
0
Sravan547

Vous pouvez utiliser comme par exemple:

driver.findElements(By.xpath("//li[contains(@class,'managed-services')]/ul/li/a"));

C'est généralement une mauvaise idée d'utiliser XPath attaché à la racine du HTML, c'est-à-dire Absolute xpath, vous devez toujours essayer d'utiliser les sélecteurs les plus courts possibles, c'est-à-dire Relative xpath.

Rappelez-vous également que si les liens sont masqués, vous devez déclencher une action, ce qui les active - comme un menu ouvert par exemple.

0
Bartosz Drzewinski