Sélectionnez l'élément parent de l'élément connu en Sélénium

j'ai un élément que je peux sélectionner avec sélénium 1.

malheureusement, je dois cliquer sur l'élément parent pour obtenir le comportement désiré. L'élément que je peux facilement localiser a un attribut non sélectionnable, ce qui le rend Mort pour un clic. Comment naviguer vers le haut avec XPath ?

76
demandé sur Peter Mortensen 2011-12-20 19:18:17

7 réponses

il y a plusieurs options. L'exemple de code est en Java, mais un port vers d'autres langues devrait être simple.

JavaScript:

WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
                                   "return arguments[0].parentNode;", myElement);

XPath:

WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath(".."));

obtention du conducteur du WebElement

Note: comme vous pouvez le voir, pour la version JavaScript, vous aurez besoin de la driver . Si vous n'avez pas accès direct à elle, vous pouvez la récupérer à partir du WebElement en utilisant:

WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
122
répondu acdcjunior 2016-09-17 10:31:21

en savoir plus sur XPath axes

disons que nous avons ci-dessous HTML structure:

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::* - renvoie tout élément qui est parent direct.

dans ce cas, la sortie est <div class="parent">

  1. //span/parent::div[@class="parent"] - renvoie l'élément parent seulement de le type exact de noeud et seulement si le prédicat spécifié est vrai.

sortie: <div class="parent">

  1. //span/ancestor::* - retourne tous ancêtres (y compris les parents).

sortie: <div class="parent"> , <nav class="second_level_ancestor"> , <div class="third_level_ancestor"> ...

  1. //span/ancestor-or-self::* - retourne tous ancêtres et actuel de l'élément lui-même.

sortie: <span>Child</span> , <div class="parent"> , <nav class="second_level_ancestor"> , <div class="third_level_ancestor"> ...

  1. //span/ancestor::div[2] - retourne le second ancêtre (à partir du parent) du type div .

sortie: <div class="third_level_ancestor">

14
répondu Andersson 2017-08-19 09:16:22

regardez le possible axes XPath , vous cherchez probablement parent . En fonction de comment vous trouver le premier élément, vous pouvez simplement ajuster le xpath.

alternativement vous pouvez essayer la syntaxe à double point , .. qui sélectionne le parent du noeud courant.

13
répondu prestomanifesto 2017-07-26 09:52:05

permet de considérer votre dom comme

<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>

maintenant que vous devez sélectionner la balise parent "a" basée sur <span> texte, puis utiliser

driver.findElement(By.xpath("//a[.//span[text()='Close']]"));

explication: sélectionnez le noeud en fonction de la valeur de son noeud enfant

11
répondu Bhuvanesh Mani 2018-03-27 18:22:51

cela pourrait être utile pour quelqu'un d'autre: Utilisation de cet échantillon html

<div class="ParentDiv">
    <label for="label">labelName</label>
    <input type="button" value="elementToSelect">
</div>
<div class="DontSelect">
    <label for="animal">pig</label>
    <input type="button" value="elementToSelect">
</div>

si, par exemple, je veux sélectionner un élément dans la même section (E. g div) comme étiquette, vous pouvez utiliser ce

//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect'] 

cela signifie juste, chercher une étiquette (il pourrait quelque chose comme a , h2 ) appelé labelName . Naviguez jusqu'au parent de cette étiquette (i.e. div class="ParentDiv" ). Rechercher dans les descendants de ce parent pour trouver élément enfant d'une valeur de elementToSelect . Avec cela, il ne sélectionnera pas le deuxième elementToSelect avec DontSelect div comme parent.

l'astuce est que vous pouvez réduire les zones de recherche d'un élément en naviguant d'abord vers le parent et ensuite en recherchant le descendant de ce parent pour l'élément dont vous avez besoin. Une autre syntaxe comme following-sibling::h2 peut aussi être utilisée dans certains cas. Il s'agit de l'élément h2 . Cela fonctionne pour les éléments au même niveau, avoir le même parent.

4
répondu papigee 2018-03-03 19:44:01

vous pouvez le faire en utilisant /parent::node () dans le xpath. Il suffit d'ajouter / parent:: node () aux éléments enfant xpath.

par exemple: Laissez xpath de l'élément enfant est childElementXpath .

puis xpath de son ancêtre immédiat serait childElementXpath / parent:: node () .

Xpath de son prochain ancêtre serait childElementXpath / parent:: node () / parent:: node ()

et ainsi de suite..

en outre, vous pouvez naviguer à un ancêtre d'un élément en utilisant 'childElementXpath/ancestor::*[@attr="attr_value"]' . Cela serait utile lorsque vous avez un élément enfant connu qui est unique mais qui a un élément parent qui ne peut pas être identifié de façon unique.

0
répondu Johnes Jose 2016-12-08 06:56:06

nous pouvons sélectionner la balise parent à L'aide du sélénium comme suit:

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));

cela vous aidera à trouver le grand-parent de l'élément connu. Juste Enlever une (/..) pour trouver l'Élément Parent immédiat.

Comme:

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));

il y a d'autres façons de mettre en œuvre ceci, mais ça a bien fonctionné pour moi.

0
répondu Utsav Jain 2017-09-11 10:55:39