【问题标题】:Get grandParent using xpath in selenium webdriver在 selenium webdriver 中使用 xpath 获取 grandParent
【发布时间】:2014-03-01 23:23:31
【问题描述】:
<div class="myclass">
  <span>...</span>
  <div>
       <table>
              <colgroup>...</>
              <tbody>
                    <tr>...</tr>
                    <tr>
                         <td> 
                              <input ...name="myname" ...> 
                         </td>
                    </tr>
                    <tr>...</tr>
              <tbody>
       </table>
  </div>

</div>

这是我的 html 代码......我有属性“名称”......所以我可以访问标签......但是从这一行我想访问顶部元素。 一种方法是我写driver.find_element_by_xpath('..') 6-7 次来得到那个父母,但我不知道我必须走多少步。我只是想要一个 xpath 表达式或类似的东西来访问 top 。

我在 python 中使用 Selenium webdriver

【问题讨论】:

    标签: python selenium xpath selenium-webdriver


    【解决方案1】:

    您可以选择更高级别的元素并测试后代节点属性,而不是针对更深层次的元素并在树中向上移动:

    .//div[@class="myclass"][.//input[@name="myname"]]
    

    【讨论】:

    • 是的..我知道。但我的问题正好相反。
    • hmmm,也许我没有理解你的问题,但是顺着树下,找到目标元素,然后再往上走可能不是最有效的。这就是为什么我认为找到潜在的 &lt;div class="myclass"&gt; 元素,然后过滤那些有你的目标 &lt;input ...name="myname" ...&gt; 的元素会适合
    【解决方案2】:

    作为@Paul 答案的替代方案,您可以通过ancestor axis 从input 向上导航到div,但是,我不明白为什么他的解决方案不适合您:

    //input[@name='myname']/ancestor::div[@class = 'myclass']
    

    【讨论】:

      【解决方案3】:

      我同意 StuartLC 但会将其更改为;

       //input[@name='myname']/ancestor::div[contains(@class,'myclass')]
      

      我总是在类属性上使用“包含”,因为类可以包含多个值,但与 CSS 选择器不同,Xpath 将其视为文字字符串。

      即。如果另一个类被添加到 div 中,StuartLC 的 xpath 将失败

      另外,如果您确实想从 'myname' 元素中找到它,您可以使用;

      self::*/ancestor::div[contains(@class,'myclass')]
      

      【讨论】:

      • 确实,contains 将增加更改的稳健性:)
      【解决方案4】:
      grandparent = element.find_element_by_xpath('../..')
      

      【讨论】:

        猜你喜欢
        • 2018-09-04
        • 1970-01-01
        • 2012-06-04
        • 2016-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        相关资源
        最近更新 更多