【问题标题】:Select parent element of known element in Selenium在 Selenium 中选择已知元素的父元素
【发布时间】:2012-01-24 13:05:51
【问题描述】:

我有一个可以用Selenium 1 选择的元素。

不幸的是,我需要单击父元素才能获得所需的行为。我可以轻松找到的元素具有不可选择的属性,使其无法单击。如何使用XPath 向上导航?

【问题讨论】:

    标签: select xpath selenium parent


    【解决方案1】:

    那里有几个选项。示例代码使用 Java,但移植到其他语言应该很简单。

    Java:

    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();
    

    【讨论】:

    • 如果您想导航到祖父母,请使用 By.Xpath("../..")。
    • @Monsignor 就像文件路径...或 URL 路径一样工作:stackoverflow.com/questions/8577636/../../questions/8577636/…
    • 这些 XPath 都不适合与 Selenium 一起使用。在使用element.findElement 时,需要使用By.xpath(“./..”) 才能正确地向上走DOM 树。需要前导“./”来设置上下文节点。
    【解决方案2】:

    让我们将您的 DOM 视为

    <a>
        <!-- some other icons and texts -->
        <span>Close</span>
    </a>
    

    现在您需要根据&lt;span&gt; 文本选择父标记'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']]"));
    【解决方案3】:

    这可能对其他人有用: 使用此示例 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 的标签(可以是 ah2 之类的任何东西)。导航到该标签的父级(即div class="ParentDiv")。在该父元素的后代中搜索以查找任何值为elementToSelect 的子元素。有了这个,它不会选择第二个elementToSelect DontSelect div 作为父级。

    诀窍在于,您可以通过先导航到父元素,然后在该父元素的后代中搜索您需要的元素来减少元素的搜索区域。 在某些情况下也可以使用其他语法,如 following-sibling::h2。这意味着元素h2 之后的兄弟姐妹。这适用于具有相同父级的同一级别的元素。

    【讨论】:

      【解决方案4】:

      我们可以在 Selenium 的帮助下选择父标签,如下所示:

      driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
      

      这将帮助您找到已知元素的祖父母。只需删除一个 (/..) 即可找到直接的父元素。

      喜欢:

      driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
      

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

      【讨论】:

        【解决方案5】:

        关于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::* - 返回 any 元素,它是直接父元素。

        在这种情况下,输出是&lt;div class="parent"&gt;

        1. //span/parent::div[@class="parent"] - 返回确切节点类型的父元素only,如果指定谓词为True,则返回only

        输出:&lt;div class="parent"&gt;

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

        输出:&lt;div class="parent"&gt;&lt;nav class="second_level_ancestor"&gt;&lt;div class="third_level_ancestor"&gt;...

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

        输出:&lt;span&gt;Child&lt;/span&gt;&lt;div class="parent"&gt;&lt;nav class="second_level_ancestor"&gt;&lt;div class="third_level_ancestor"&gt;...

        1. //span/ancestor::div[2] - 返回 div 类型的第二个祖先(从父级开始)。

        输出:&lt;div class="third_level_ancestor"&gt;

        【讨论】:

        【解决方案6】:

        看看可能的XPath axes,你可能正在寻找parent。根据您找到第一个元素的方式,您可以为此调整 xpath。

        或者,您可以尝试double-dot syntax..,它选择当前节点的父节点。

        【讨论】:

          【解决方案7】:

          您可以通过在 xpath 中使用 /parent::node() 来做到这一点。只需将 /parent::node() 附加到子元素 xpath。

          例如: 设子元素的xpath为childElementXpath

          那么其直接祖先的 xpath 将是 childElementXpath/parent::node()

          其下一个祖先的 Xpath 将是 childElementXpath/parent::node()/parent::node()

          等等..

          此外,您可以使用导航到元素的祖先 'childElementXpath/ancestor::*[@attr="attr_value"]'。当您有一个唯一的已知子元素但有一个无法唯一标识的父元素时,这将很有用。

          【讨论】:

            猜你喜欢
            • 2013-02-24
            • 1970-01-01
            • 2018-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多