J'utilise Selenium pour tester mon application Web et je parviens à localiser les tags avec By.xpath
. Cependant, de temps en temps, je dois trouver des nœuds enfants dans ce nœud.
Exemple:
<div id="a">
<div>
<span />
<input />
</div>
</div>
Je peux faire:
WebElement divA = driver.findElement( By.xpath( "//div[@id='a']" ) )
Mais maintenant, je dois trouver l’entrée pour pouvoir faire:
driver.findElement( By.xpath( "//div[@id='a']//input" ) )
Cependant, à ce stade du code, je n'ai que divA
, plus son chemin xpath ... J'aimerais faire quelque chose comme ceci:
WebElement input = driver.findElement( divA, By.xpath( "//input" ) );
Mais une telle fonction n'existe pas. Puis-je le faire de toute façon?
BTW: Parfois, j'ai besoin de trouver un <div>
qui a un certain noeud dépendant. Comment puis-je demander dans xpath pour "the <div>
qui contient un <span>
avec le texte 'hello world'
"?
Selon JavaDocs , vous pouvez le faire:
WebElement input = divA.findElement(By.xpath(".//input"));
Comment puis-je demander à xpath "la balise div qui contient une étendue avec le texte 'hello world'"?
WebElement elem = driver.findElement(By.xpath("//div[span[text()='hello world']]"));
La spécification XPath est une lecture étonnamment bonne à ce sujet.
Si vous devez attendre, il existe une méthode presenceOfNestedElementLocatedBy
qui utilise l’élément "parent" et un localisateur, par exemple. une By.xpath
:
WebElement subNode = new WebDriverWait(driver,10).until(
ExpectedConditions.presenceOfNestedElementLocatedBy(
divA, By.xpath(".//div/span")
)
);
Je me suis également retrouvé dans une situation similaire il y a quelques semaines. Vous pouvez également le faire en créant un ElementLocatorFactory personnalisé (ou en passant simplement divA dans DefaultElementLocatorFactory) pour voir s’il s’agit d’un enfant du premier div. Vous devez ensuite appeler la méthode PageFactory initElements appropriée.
Dans ce cas, si vous avez fait ce qui suit:
PageFactory.initElements(new DefaultElementLocatorFactory(divA), pageObjectInstance));
// The Page Object instance would then need a WebElement
// annotated with something like the xpath above or @FindBy(tagName = "input")