1
votes

Selenium XPath: l'ancêtre ne contient pas

Trouvez le div avec la classe "bar" dont l'ancêtre n'a pas de classe "foo" dans la portée du niveau supérieur "foo". Par exemple,

root.findElements(By.cssSelector(":not(.foo) .bar"));

Trouvez la barre qui ne se trouve pas dans le "toto" imbriqué.

Et le XPath que j'ai essayé est:

WebElement root = driver.findElement(By.xpath("//div[@class='foo']"));
root.findElements(By.xpath(".//div[not(contains(@class, 'foo'))]//div[contains(@class, 'bar')]"));


0 commentaires

3 Réponses :


1
votes

Essayez cette expression XPath-1.0:

//div[contains(@class, 'bar') and not(ancestor::*[@class='foo'])]

Elle ne renvoie qu'un seul élément: le

souhaité.


4 commentaires

Pardon. mon scénario est de trouver l'élément dans une portée. Question mise à jour. J'ai essayé votre xpath, je ne renvoie aucun résultat si vous effectuez une recherche avec la portée.Merci.


Je ne sais pas pourquoi cela a été rejeté. J'ai copié le code HTML publié par OP et exécuté cette requête avec $ x intégré à Chrome et il a renvoyé le seul élément

qui était < i> non encapsulé dans
.


OP, essayez de l'exécuter sur la console Chrome et voyez si cela fonctionne: $ x ('// div [contains (@class, "bar") and not (ancestor :: div [contains (@class, "foo") )])] ');


Mon erreur. mon scénario réel est de rechercher la barre dans un élément de contexte. Le xpath suggéré par cette réponse fonctionne s'il n'est pas dans la portée. Question mise à jour.



0
votes

Celui-ci ne renvoie que la 2ème barre (au moins quand je l'exécute ...)

//*[@class='bar'][(parent::div[@class='foo'])]


0 commentaires

0
votes

Si vous essayez d'accéder au div enfant direct avec la classe de barres, voici le xpath.

//div[@class='bar' and parent::div[@class='foo']]


0 commentaires