我有一个特定的元素,我可以选择与 硒1。
不幸的是,我需要单击父元素来获得所需的行为。我可以轻松定位的元素具有不可选属性,使其无法单击。如何使用 XPath向上导航?
看看可能的 XPath 轴,你可能正在寻找 parent。根据找到第一个元素的方式,可以为此调整 xpath。
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检索它使用:
driver
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"]' .如果有一个已知的子元素是唯一的,但是有一个无法唯一标识的父元素,那么这将非常有用。
'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的标签(它可以是任何类似于 a、 h2的东西)。导航到该标签的父级(即 div class="ParentDiv")。在该父元素的后代中搜索,以找到值为 elementToSelect的任何子元素。这样,它就不会选择以 DontSelect div 作为父级的第二个 elementToSelect。
labelName
a
h2
div class="ParentDiv"
elementToSelect
DontSelect
诀窍在于,您可以通过首先导航到父元素,然后在该父元素的后代中搜索所需的元素,从而减少对元素的搜索区域。 其他语法如 following-sibling::h2也可以在某些情况下使用。这意味着下面的兄弟元素 h2。这将适用于具有相同父级的相同级别的元素。
following-sibling::h2
让我们将您的 DOM 视为
<a> <!-- some other icons and texts --> <span>Close</span> </a>
现在您需要根据 <span>文本选择父标记‘ a’,然后使用
<span>
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
说明: 根据子节点的值选择节点
再说说 XPath axes
XPath axes
假设我们有低于 HTML的结构:
HTML
<div class="third_level_ancestor"> <nav class="second_level_ancestor"> <div class="parent"> <span>Child</span> </div> </nav> </div>
在这种情况下,输出为 <div class="parent">
<div class="parent">
输出: <div class="parent">
输出: <div class="parent">,<nav class="second_level_ancestor">,<div class="third_level_ancestor">..。
<nav class="second_level_ancestor">
<div class="third_level_ancestor">
输出: <span>Child</span>,<div class="parent">,<nav class="second_level_ancestor">,<div class="third_level_ancestor">..。
<span>Child</span>
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“ ./. .”