Localisation des noeuds enfant de WebElements dans le sélénium

j'utilise le sélénium pour tester mon application web et je peux trouver des tags avec By.xpath. Cependant, de temps en temps, je dois trouver des noeuds enfants à l'intérieur de ce noeud.

Exemple:

<div id="a">
    <div>
        <span />
        <input />
    </div>
</div>

je peux faire:

WebElement divA = driver.findElement( By.xpath( "//div[@id='a']" ) )

Mais maintenant j'ai besoin de trouver l'entrée, afin que je puisse faire:

driver.findElement( By.xpath( "//div[@id='a']//input" ) )

cependant à ce point dans le code je n'ai que divA, plus son xpath... Je voudrais faire quelque chose comme ceci:

WebElement input = driver.findElement( divA, By.xpath( "//input" ) );

Mais une telle la fonction n'existe pas. Puis-je faire cela de toute façon?

BTW: parfois j'ai besoin de trouver un DIV qui a un certain noeud décendant. Comment puis-je demander dans xpath pour "div-tag qui contient un span avec le texte "bonjour"?

35
demandé sur Danny Beckett 2012-05-09 20:31:22

5 réponses

Selon Javadoc, vous pouvez faire ceci:

WebElement input = divA.findElement(By.xpath(".//input"));

Comment puis-je demander dans xpath pour "la balise div-tag qui contient une portée avec le le texte "bonjour"?

WebElement elem = driver.findElement(By.xpath("//div[span[text()='hello world']]"));

XPath spec est étonnamment bonne lecture sur ce.

70
répondu Petr Janeček 2012-05-09 17:53:47

Si vous avez à attendre, il existe une méthode presenceOfNestedElementLocatedBy qui prend le "parent" de l'élément et un localisateur, par exemple, un By.xpath:

WebElement subNode = new WebDriverWait(driver,10).until(
    ExpectedConditions.presenceOfNestedElementLocatedBy(
        divA, By.xpath(".//div/span")
    )
);
1
répondu Matthias Bloch 2016-07-20 17:25:05

je me suis aussi trouvé dans une position similaire il y a quelques semaines. Vous pouvez également le faire en créant un fichier personnalisé ElementLocatorFactory (ou en passant simplement dans divA dans le DefaultElementLocatorFactory) pour voir si c'est un enfant de la première div - vous appelleriez alors la méthode D'initElements de PageFactory 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")
0
répondu Scott 2013-04-29 15:36:26

la méthode toString() de la By-Class du sélénium produit quelque chose comme "Par.xpath: / / XpathFoo"

donc vous pouvez prendre une sous-couche à partir du côlon avec quelque chose comme ceci:

String selector = divA.toString().substring(s.indexOf(":") + 2);

Avec cela, vous pourriez trouver votre élément à l'intérieur de votre autre élément avec ceci:

WebElement input = driver.findElement( By.xpath( selector + "//input" ) );

Avantage: vous n'avez à rechercher qu'une seule fois sur le SUT réel, de sorte qu'il pourrait vous donner un bonus en performance.

Désavantage: Laid... si vous voulez la recherche pour le élément parent avec CSS selectory et utilisez xpath pour ses enfants, vous devez vérifier les types Avant de concaténer... Dans ce cas, la solution de Slanec (en utilisant findElement sur un WebElement) est bien meilleure.

-1
répondu stuXnet 2013-07-16 13:42:31

pour trouver tous les ChildNodes vous pouvez utiliser L'extrait ci-dessous

List<WebElement> childs = MyCurrentWebElement.findElements(By.xpath("./child::*"));

        for (WebElement e  : childs)
        {
            System.out.println(e.getTagName());
        }

notez que cela donnera à tous les noeuds enfant au même niveau -> Si vous avez de la structure comme ceci :

<Html> 
<body> 
 <div> ---suppose this is current WebElement 
   <a>
   <a>
      <img>
          <a>
      <img>
   <a>

il me donnera les noms d'étiquette de 3 étiquettes d'ancrage ici seulement . Si vous voulez tous les éléments enfant récursivement , vous pouvez remplacer le code ci-dessus avec MyCurrentWebElement.findElements(By.xpath(".// * " ));

Espérons Que Cela Aide !!

-2
répondu Karan 2015-05-14 19:40:16