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 ?
Il y a plusieurs options ici. L'exemple de code est en Java, mais un portage vers d'autres langues doit être simple.
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", myElement);
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath(".."));
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();
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>
//span/parent::*
- retourne n'importe lequel élément qui est un parent direct. Dans ce cas, la sortie est <div class="parent">
//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">
//span/ancestor::*
- retourne tous ancêtres (y compris le parent). Sortie: <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//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">
...
//span/ancestor::div[2]
- retourne le deuxième ancêtre (à partir du parent) de type div
. Sortie: <div class="third_level_ancestor">
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.
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.
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.
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.
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.