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

我有一个特定的元素,我可以选择与 1。

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

249525 次浏览

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

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

有几个选择。示例代码是用 Java 编写的,但是到其他语言的移植应该很简单。

Java:

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();

可以通过在 xpath 中使用 /father: : node ()来实现这一点。

例如: 让子元素的 xpath 为 Child ElementXpath

那么它的直接祖先的 xpath 就是 Children ElementXpath/father: : node ()

它的下一个祖先的 Xpath 将是 Children ElementXpath/father: : node ()/father: : node ()

等等。

此外,还可以使用 'childElementXpath/ancestor::*[@attr="attr_value"]' .如果有一个已知的子元素是唯一的,但是有一个无法唯一标识的父元素,那么这将非常有用。

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

这仅仅意味着,寻找一个名为 labelName的标签(它可以是任何类似于 ah2的东西)。导航到该标签的父级(即 div class="ParentDiv")。在该父元素的后代中搜索,以找到值为 elementToSelect的任何子元素。这样,它就不会选择以 DontSelect div 作为父级的第二个 elementToSelect

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

让我们将您的 DOM 视为

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

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

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

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

再说说 XPath axes

假设我们有低于 HTML的结构:

<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
  1. 返回直接为父元素的 任何元素。

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

  1. 返回精确节点类型的父元素 只有,如果指定的谓词为 True,返回 只有

输出: <div class="parent">

  1. 返回 所有祖先(包括父祖先)。

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

  1. 返回 所有祖先 还有当前元素本身。

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

  1. 返回类型 div的第二祖先(从父祖先开始)。

输出: <div class="third_level_ancestor">

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

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

这将帮助您找到已知 Element 的祖先。只要删除一个(/。.)找到直接的父元素。

比如:

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

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

有一种方法,你不需要执行脚本,你仍然得到父元素:

  // identify element
WebElement ele =driver.findElement(By.xpath("//*[@id=\"ext-gen6\"]/div[5]/"));
//identify parent element with ./.. expression in xpath
WebElement parent = ele.findElement(By.xpath("./.."));

这里的关键词是 xpath“ ./. .”