【发布时间】:2012-01-24 13:05:51
【问题描述】:
【问题讨论】:
标签: select xpath selenium parent
【问题讨论】:
标签: select xpath selenium parent
那里有几个选项。示例代码使用 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();
【讨论】:
element.findElement 时,需要使用By.xpath(“./..”) 才能正确地向上走DOM 树。需要前导“./”来设置上下文节点。
让我们将您的 DOM 视为
<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>
现在您需要根据<span> 文本选择父标记'a',然后使用
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
说明:根据子节点的值选择节点
【讨论】:
div,它再次嵌套了多个div,那么我们可以使用By.xpath("//div[.//span[text()='Close']]")中的.//span而不是*//span,它将寻找给定的大多数父div元素跨度。现在它看起来像这样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']
这只是意味着,寻找一个名为 labelName 的标签(可以是 a、h2 之类的任何东西)。导航到该标签的父级(即div class="ParentDiv")。在该父元素的后代中搜索以查找任何值为elementToSelect 的子元素。有了这个,它不会选择第二个elementToSelect DontSelect div 作为父级。
诀窍在于,您可以通过先导航到父元素,然后在该父元素的后代中搜索您需要的元素来减少元素的搜索区域。
在某些情况下也可以使用其他语法,如 following-sibling::h2。这意味着元素h2 之后的兄弟姐妹。这适用于具有相同父级的同一级别的元素。
【讨论】:
我们可以在 Selenium 的帮助下选择父标签,如下所示:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
这将帮助您找到已知元素的祖父母。只需删除一个 (/..) 即可找到直接的父元素。
喜欢:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
还有其他一些方法可以实现这一点,但对我来说效果很好。
【讨论】:
关于XPath axes的更多信息
假设我们有以下HTML 结构:
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
//span/parent::* - 返回 any 元素,它是直接父元素。 在这种情况下,输出是<div class="parent">
//span/parent::div[@class="parent"] - 返回确切节点类型的父元素only,如果指定谓词为True,则返回only。 输出:<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">
【讨论】:
看看可能的XPath axes,你可能正在寻找parent。根据您找到第一个元素的方式,您可以为此调整 xpath。
或者,您可以尝试double-dot syntax、..,它选择当前节点的父节点。
【讨论】:
您可以通过在 xpath 中使用 /parent::node() 来做到这一点。只需将 /parent::node() 附加到子元素 xpath。
例如: 设子元素的xpath为childElementXpath。
那么其直接祖先的 xpath 将是 childElementXpath/parent::node()。
其下一个祖先的 Xpath 将是 childElementXpath/parent::node()/parent::node()
等等..
此外,您可以使用导航到元素的祖先
'childElementXpath/ancestor::*[@attr="attr_value"]'。当您有一个唯一的已知子元素但有一个无法唯一标识的父元素时,这将很有用。
【讨论】: