Question

Est-il possible pour Selenium d’évaluer tous les éléments pouvant correspondre à un certain XPath ?

Par exemple, j'aimerais évaluer si toutes les cases à cocher sont cochées avec // input [type = 'case à cocher'] - le problème est que je n'en reçois qu'une. élément renvoyé.

Était-ce utile?

La solution

Vous pouvez utiliser la commande getXpathCount pour déterminer le nombre d'éléments correspondants. Vous pouvez ensuite les parcourir en utilisant un incrément pour localiser chaque élément individuellement. L'exemple Java (TestNG / JUnit) suivant vérifie que toutes les cases d'une page sont cochées:

int totalCheckboxes = session().getXpathCount("//input[@type='checkbox']").intValue();
for (int i = 1; i < totalCheckboxes+1; i++) {
    assertTrue(session().isChecked("//input[@type='checkbox'][" + i + "]"));
}

Autres conseils

J'ai essayé l'approche ci-dessus et sélenium lançait des exceptions indiquant que l'élément était introuvable. L'ajout du préfixe xpath = résolvait le problème.

exemple

xpath=(//td[@class='cell name bold'])[1]
xpath=(//td[@class='cell name bold'])[2] 

Avec

/descendant::input[@type='text'][1]
/descendant::input[@type='text'][2]

vous pouvez uniquement rechercher tous les éléments d'entrée dans l'arborescence. Cela ne fonctionnera pas si vous souhaitez simplement analyser un sous-arbre.

Une meilleure façon est:

(/form/div/input[@type='text'])[1]
(/form/div/input[@type='text'])[2]

qui renverra le résultat n ° 1, n ° 2, etc. de l'expression XPath entre crochets.

Bien sûr, vous pouvez aussi faire

(//input[@type='text'])[1]

Ceci est très pratique car Selenium utilise uniquement la première correspondance et ne peut pas traiter un ensemble de résultats, ce que XPath renvoie habituellement.

Il n’est pas possible que le sélénium évalue une liste d’articles renvoyés par un localisateur. Il attrape simplement le premier et fait des choses avec.

Dave answer est la meilleure alternative à ce que vous recherchez.

J'essaie de faire exactement la même chose avec Selenium et d'utiliser l'exemple de @dave-hunt, mais c'est une méthode incorrecte pour trouver un élément individuel dans une collection.

Prenons l'exemple suivant:

<form>
 <div>
  <input type="text" name="field1" />
 </div>
 <div>
  <input type="text" name="field2" />
 </div>
</form>

Si vous utilisez une expression telle que:

//input[@type='text'][1]

Ceci renverra toutes les entrées de texte de la page. Pourquoi? Parce que chaque entrée est le premier élément correspondant dans sa propre arborescence.

Cependant, si vous utilisez une expression telle que:

/descendant::input[@type='text'][1]

ou

/descendant::input[@type='text'][2]

la première expression saisira la première entrée et la deuxième expression saisira la deuxième entrée. Il est très important que vous utilisiez un seul " / " et PAS un double "//".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top