Answers:
有两种选择。该示例代码是用Java编写的,但是到其他语言的移植应该很简单。
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", myElement);
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath("./.."));
WebElement
注意:如您所见,对于JavaScript版本,您需要使用driver
。如果您无法直接访问它,则可以WebElement
使用以下方法检索它:
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
By.xpath(“./..”)
,需要使用来正确遍历DOM树element.findElement
。需要前导“ ./”来设置上下文节点。
关于更多 XPath axes
假设我们具有以下HTML
结构:
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
//span/parent::*
-返回任何直接父元素。在这种情况下,输出为 <div class="parent">
//span/parent::div[@class="parent"]
-返回父元素只的确切节点类型和仅如果指定的谓词是真。输出: <div class="parent">
//span/ancestor::*
-返回所有祖先(包括父母)。输出:<div class="parent">
,<nav class="second_level_ancestor">
,<div class="third_level_ancestor">
...
//span/ancestor-or-self::*
-返回所有祖先和当前元素本身。输出:<span>Child</span>
,<div class="parent">
,<nav class="second_level_ancestor">
,<div class="third_level_ancestor">
...
//span/ancestor::div[2]
-返回类型为的第二祖先(从父级开始)div
。输出: <div class="third_level_ancestor">
让我们考虑您的DOM为
<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>
现在,您需要基于<span>
文本选择父标签“ a” ,然后使用
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
说明:根据其子节点的值选择节点
div
哪个嵌套了多个div,则可以使用,而不是.//span
in ,它将查找给定跨度的大多数父div元素。现在看起来像这样By.xpath("//div[.//span[text()='Close']]")
*//span
driver.findElement(By.xpath("//div[*//span[text()='Close']]"));
这可能对其他人有用:使用此示例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
,h2
)叫labelName
。导航到该标签的父级(即div class="ParentDiv"
)。在该父级的后代中进行搜索,以找到任何值为的子级元素elementToSelect
。有了这个,就不会选择第二个elementToSelect
用DontSelect
DIV父。
诀窍是,您可以通过先导航到父元素然后在该父元素的后代中搜索所需元素来减少元素的搜索区域。following-sibling::h2
在某些情况下也可以使用其他类似的语法。这意味着同级跟随元素h2
。这将适用于具有相同父级的相同级别的元素。
您可以通过在xpath中使用/ parent :: node()来实现。只需将/ parent :: node()附加 到子元素xpath。
例如:让子元素的xpath为childElementXpath。
然后其直接祖先的xpath将是childElementXpath / parent :: node()。
下一个祖先的Xpath是childElementXpath / parent :: node()/ parent :: node()
等等..
此外,您可以使用导航到元素的祖先
'childElementXpath/ancestor::*[@attr="attr_value"]'
。当您拥有一个唯一的已知子元素但具有一个无法唯一标识的父元素时,这将很有用。