选择硒中已知元素的父元素


116

我可以使用 1 选择某些元素。

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

Answers:


169

有两种选择。该示例代码是用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();

41
如果要导航到祖父母,请使用By.Xpath(“ ../ ..”)。
Monsignor

@Monsignor的工作方式类似于文件路径...或URL路径:stackoverflow.com/questions/8577636
/../../questions/8577636/

这些XPath都不适合与Selenium一起使用。使用时By.xpath(“./..”),需要使用来正确遍历DOM树element.findElement。需要前导“ ./”来设置上下文节点。
JimEvans

35

关于更多 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"]-返回父元素的确切节点类型和如果指定的谓词是真。

输出: <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">


您好@Anderson我的问题需要帮助您有时间看一下吗?先感谢您。stackoverflow.com/questions/54647055 / ...

18

让我们考虑您的DOM为

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

现在,您需要基于<span>文本选择父标签“ a” ,然后使用

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

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


如果我们要查找div哪个嵌套了多个div,则可以使用,而不是.//spanin ,它将查找给定跨度的大多数父div元素。现在看起来像这样By.xpath("//div[.//span[text()='Close']]")*//spandriver.findElement(By.xpath("//div[*//span[text()='Close']]"));
Jai Prak

14

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

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


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>

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

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

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

诀窍是,您可以通过先导航到父元素然后在该父元素的后代中搜索所需元素来减少元素的搜索区域。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']/..));

还有其他方法可以实现此功能,但对我来说效果很好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.