在Selenium中select已知元素的父元素
我有一个特定的元素,我可以selectselenium 1。
不幸的是,我需要点击父元素来获得所需的行为。 元素我可以很容易地find具有不可select的属性,使其无法点击。 如何使用XPath向上导航?
那里有几个选项。 示例代码使用Java,但其他语言的端口应该很简单。
JavaScript的:
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轴 ,你可能正在寻找parent
。 根据你如何find第一个元素,你可以调整xpath。
或者,您可以尝试双点语法 , ..
它select当前节点的父节点。
让我们考虑你的dom
<a> <!-- some other icons and texts --> <span>Close</span> </a>
现在您需要根据<span>
文本select父a,然后使用
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
说明:根据其子节点的值select节点
有关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"]
– 仅返回确切节点types的父元素,且只有在指定谓词为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
types的第二个祖先(从父项开始)。
输出: <div class="third_level_ancestor">
这可能对别人有用:使用这个示例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>
例如,如果我想select同一部分(如div)中的一个元素作为标签,则可以使用它
//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect']
这只是说,寻找一个名为labelName
的标签(它可以是任何类似于h2
的标签)。 导航到该标签的父级。 在该父代的后代中search,以查找具有elementToSelect
值的任何子元素。 有了这个,它不会select第二个elementToSelect
select与DontSelect
div作为父。
诀窍是,您可以通过先导航到父项来减less元素的search区域,然后search该父项的后代以获取所需的元素。 其他语法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"]'
导航到元素的'childElementXpath/ancestor::*[@attr="attr_value"]'
。 当你有一个已知的子元素是唯一的,但有一个不能被唯一标识的父元素时,这将是有用的。
我们可以在Selenium的帮助下select父标签,如下所示:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
这将帮助您find已知元素的祖父母。 只要删除一个(/ ..)来find直接的父元素。
喜欢:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
还有其他一些方法来实现这一点,但它对我来说很好。