在Selenium中选择已知元素的父元素

f l*_*f l 101 selenium select xpath parent

我有一个可以用Selenium 1 选择的元素.

不幸的是,我需要单击父元素以获得所需的行为.我可以轻松找到的元素具有不可选择的属性,使其无法点击.如何使用XPath向上导航?

acd*_*ior 149

那里有几个选择.示例代码是Java,但是其他语言的端口应该很简单.

JavaScript的:

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

XPath的:

WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath("./.."));
Run Code Online (Sandbox Code Playgroud)

从中获取驱动程序 WebElement

注意:正如您所看到的,对于JavaScript版本,您需要使用driver.如果您无法直接访问它,则可以从WebElement使用中检索它:

WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
Run Code Online (Sandbox Code Playgroud)

  • 如果您想导航到祖父母,请使用By.Xpath("../ .."). (38认同)
  • 这些 XPath 都不适合与 Selenium 一起使用。当使用 element.findElement 时,需要使用 By.xpath(“./..”) 来正确地遍历 DOM 树。设置上下文节点需要前导“./”。 (3认同)

And*_*son 25

更多关于 XPath axes

让我们说我们有以下HTML结构:

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
Run Code Online (Sandbox Code Playgroud)
  1. //span/parent::*- 返回任何直接父元素.

在这种情况下输出是 <div class="parent">

  1. //span/parent::div[@class="parent"]- 返回精确节点类型的父元素,并且当指定的谓词为True 时才返回.

输出: <div class="parent">

  1. //span/ancestor::*- 返回所有祖先(包括父级).

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

  1. //span/ancestor-or-self::*- 返回所有祖先当前元素本身.

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

  1. //span/ancestor::div[2]- 返回类型的第二个祖先(从父级开始)div.

输出: <div class="third_level_ancestor">


Bhu*_*ani 15

我们将您的DOM视为

<a>
    <!-- some other icons and texts -->
    <span>Close</span>
</a>
Run Code Online (Sandbox Code Playgroud)

现在您需要根据<span>文本选择父标记'a' ,然后使用

driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
Run Code Online (Sandbox Code Playgroud)

说明:根据节点的子节点值选择节点

  • 如果我们正在寻找再次嵌套多个 div 的 `div`,则不要使用 `By.xpath("//div[.//span[text()='Close']]" 中的 `.//span` )` 我们可以使用 `*//span`,它会查找给定 span 的大多数父 div 元素。现在它看起来像这样 `driver.findElement(By.xpath("//div[*//span[text()='Close']]"));` (2认同)

pre*_*sto 14

看看你可能正在寻找的可能的XPath轴parent.根据您查找第一个元素的方式,您可以调整xpath.

或者,您可以尝试使用双点语法,..语法选择当前节点的父节点.


pap*_*gee 5

这可能对其他人有用:使用此示例 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>
Run Code Online (Sandbox Code Playgroud)

例如,如果我想在同一部分(例如 div)中选择一个元素作为标签,则可以使用此

//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect'] 
Run Code Online (Sandbox Code Playgroud)

这也就意味着,寻找一个标签(可以像什么ah2)叫labelName。导航到该标签的父级(即div class="ParentDiv")。在该父元素的后代中搜索以查找值为 的任何子元素elementToSelect。有了这个,就不会选择第二个elementToSelectDontSelectDIV父。

诀窍是,您可以通过先导航到父元素,然后在该父元素的后代中搜索所需元素来减少元素的搜索区域。following-sibling::h2在某些情况下也可以使用其他语法。这意味着跟随元素的兄弟元素h2。这将适用于具有相同父级的相同级别的元素。