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')]"));
3 Réponses :
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é.
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.
Celui-ci ne renvoie que la 2ème barre (au moins quand je l'exécute ...)
//*[@class='bar'][(parent::div[@class='foo'])]
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']]