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

时间:2011-12-20 15:18:18

标签: select xpath selenium parent

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

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

7 个答案:

答案 0 :(得分:137)

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

的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("./.."));

WebElement

获取驱动程序

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

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

答案 1 :(得分:24)

关于XPath axes

的更多信息

假设我们的结构低于HTML

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::* - 返回任何直接父级的元素。
  2. 在这种情况下,输出为<div class="parent">

    1. //span/parent::div[@class="parent"] - 如果指定的谓词为True,则仅返回精确节点类型的父元素
    2. 输出:<div class="parent">

      1. //span/ancestor::* - 返回所有祖先(包括父级)。
      2. 输出:<div class="parent"><nav class="second_level_ancestor"><div class="third_level_ancestor"> ...

        1. //span/ancestor-or-self::* - 返回所有祖先当前元素本身。
        2. 输出:<span>Child</span><div class="parent"><nav class="second_level_ancestor"><div class="third_level_ancestor"> ......

          1. //span/ancestor::div[2] - 返回类型div的第二个祖先(从父级开始)。
          2. 输出:<div class="third_level_ancestor">

答案 2 :(得分:14)

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

或者,您可以尝试double-dot syntax..选择当前节点的父节点。

答案 3 :(得分:13)

让我们将您的DOM视为

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

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

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

说明:根据子节点的值

选择节点

答案 4 :(得分:4)

这可能对其他人有用: 使用此示例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>

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

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

这只是意味着,找一个名为a的标签(它可以是h2labelName)。导航到该标签的父级(即div class="ParentDiv")。在该父级的后代内搜索,以查找值为elementToSelect的任何子元素。这样,它就不会选择第二个elementToSelect DontSelect div作为父级。

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

答案 5 :(得分:0)

您可以在xpath中使用 / parent :: node()来完成此操作。只需将 / parent :: node()附加到子元素xpath即可。

例如: 让子元素的xpath是 childElementXpath

然后它的直接祖先的xpath将是 childElementXpath / parent :: node()

下一个祖先的Xpath将是 childElementXpath / parent :: node()/ parent :: node()

依旧......

此外,您可以使用导航到元素的祖先 'childElementXpath/ancestor::*[@attr="attr_value"]' 的。当您有一个已知的子元素是唯一但具有无法唯一标识的父元素时,这将非常有用。

答案 6 :(得分:0)

我们可以在Selenium的帮助下选择父标签,如下所示:

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

这将帮助您找到已知元素的祖父母。只需删除一个(/ ..)即可找到直接的父元素。

像:

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

还有其他一些方法可以实现这一点,但它对我来说很好。