在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> 
  1. //span/parent::* – 返回直接父元素。

在这种情况下,输出是<div class="parent">

  1. //span/parent::div[@class="parent"]返回确切节点types的父元素,且只有在指定谓词为True 时才返回。

输出: <div class="parent">

  1. //span/ancestor::* – 返回所有祖先(包括父亲)。

输出: <div class="parent"><nav class="second_level_ancestor"><div class="third_level_ancestor">

  1. //span/ancestor-or-self::* – 返回所有祖先当前元素本身。

输出: <span>Child</span><div class="parent"><nav class="second_level_ancestor"><div class="third_level_ancestor">

  1. //span/ancestor::div[2] – 返回divtypes的第二个祖先(从父项开始)。

输出: <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第二个elementToSelectselect与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']/..)); 

还有其他一些方法来实现这一点,但它对我来说很好。