在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]– 返回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']/..)); 
还有其他一些方法来实现这一点,但它对我来说很好。