web-dev-qa-db-fra.com

Sélectionner l'élément parent de l'élément connu dans Selenium

J'ai un certain élément que je peux sélectionner avec Selenium 1.

Malheureusement, je dois cliquer sur l'élément parent pour obtenir le comportement souhaité. L'élément que je peux facilement localiser a un attribut indélébile, le rendant mort pour le clic. Comment naviguer vers le haut avec XPath ?

83
f l

Il y a plusieurs options ici. L'exemple de code est en Java, mais un portage vers d'autres langues doit ê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(".."));

Obtenir le pilote de la WebElement

Note: Comme vous pouvez le constater, pour la version JavaScript, vous aurez besoin de driver. Si vous n’y avez pas directement accès, vous pouvez le récupérer à partir de la WebElement en utilisant:

WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
133
acdcjunior

Un peu plus sur XPath axes

Disons que nous avons ci-dessous une structure HTML:

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::* - retourne n'importe lequel élément qui est un parent direct. 

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

  1. //span/parent::div[@class="parent"] - retourne l'élément parent uniquement du type de nœud exact et uniquement si le prédicat spécifié est True. 

Sortie: <div class="parent"> 

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

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

  1. //span/ancestor-or-self::* - retourne tous ancêtres et élément actuel 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 deuxième ancêtre (à partir du parent) de type div

Sortie: <div class="third_level_ancestor">

22
Andersson

Examinez les axes possibles XPath , vous recherchez probablement parent. Selon la façon dont vous trouvez le premier élément, vous pouvez simplement ajuster le xpath en conséquence.

Vous pouvez également essayer la syntaxe double point , .. qui sélectionne le parent du nœud actuel.

13
prestomanifesto

Considérons votre DOM comme

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

Maintenant que vous devez sélectionner la balise parent 'a' en fonction du texte <span>, utilisez ensuite

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

Explication: Sélectionnez le noeud en fonction de la valeur de son noeud enfant.

12
Bhuvanesh Mani

Cela pourrait être utile pour quelqu'un d'autre: Utiliser cet exemple 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 (par exemple, div) comme étiquette, vous pouvez utiliser cette option. 

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

Cela signifie simplement que vous recherchez une étiquette (a, h2) appelée labelName. Accédez au parent de cette étiquette (c.-à-d. div class="ParentDiv"). Effectuez une recherche dans les descendants de ce parent pour trouver un élément enfant ayant la valeur elementToSelect. Avec cela, il ne sélectionnera pas la seconde elementToSelect avec DontSelect div en tant que parent.

L'astuce consiste à réduire les zones de recherche d'un élément en naviguant d'abord vers le parent, puis en recherchant l'élément dont vous avez besoin . Une autre syntaxe, telle que following-sibling::h2, peut également être utilisée. Cela signifie l’élément suivant frère h2. Cela fonctionnera pour des éléments de même niveau, ayant le même parent.

4
papigee

Nous pouvons sélectionner la balise parent à l’aide de Selenium comme suit:

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

cela vous aidera à trouver le grand-parent de l'élément connu. Supprimez simplement un (/ ..) pour trouver l'élément parent immédiat.

Comme:

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

Il existe d'autres moyens de mettre cela en œuvre, mais cela a fonctionné pour moi.

0
Utsav Jain

Vous pouvez le faire en utilisant/parent :: node () dans le xpath. Ajoutez simplement/parent :: node () aux éléments enfants xpath. 

Par exemple: Soit xpath de l’élément enfant est childElementXpath .

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

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

etc..

En outre, vous pouvez accéder à un ancêtre d'un élément à l'aide de 'childElementXpath/ancestor::*[@attr="attr_value"]'. Cela serait utile lorsque vous avez un élément enfant connu qui est unique mais un élément parent qui ne peut pas être identifié de manière unique.

0
Johnes Jose