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

问题描述 投票:84回答:7

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

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

select xpath selenium parent
7个回答
141
投票

那里有几个选择。示例代码是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("./.."));

Obtaining the driver from the WebElement

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

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

25
投票

关于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::* - 返回任何直接父元素。

在这种情况下,输出是<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">


14
投票

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

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


14
投票

我们将您的DOM视为

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

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

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

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


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 div为父母的第二个DontSelect

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


0
投票

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

例如:让子元素的xpath是childElementXpath。

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

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

等等..

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


0
投票

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

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

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

喜欢:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.