答案 0 :(得分:137)
那里有几种选择。示例代码是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();
答案 1 :(得分:24)
假设我们的结构低于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"]
- 如果指定的谓词为True,则仅返回精确节点类型的父元素 ,仅 。 输出:<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">
答案 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
的标签(它可以是h2
,labelName
)。导航到该标签的父级(即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']/..));
还有其他一些方法可以实现这一点,但它对我来说很好。