【问题标题】:Selenium: complex XPath exampleSelenium:复杂的 XPath 示例
【发布时间】:2019-01-30 15:24:00
【问题描述】:

我需要在 Selenium 代码中使用 XPath 定位一个节点以实现自动化。 问题是需要选择的节点不包含识别信息,而另一个节点是目标节点的父节点的后代。

<object>...</object>

<object>
    <div>Name</div>
    <target></target>
</object>

<object>...</object>

为了简化它看起来像上面的情况。有多个“对象”节点,仅通过“名称”相互区分。虽然我们不能在 XPath 中使用括号,但如何使用 driver.find_element_by_xpath() 方法选择该节点?

【问题讨论】:

    标签: python selenium xpath


    【解决方案1】:

    如果我正确理解了您的问题,那么您可能正在寻找以下 XPath 表达式:

    //div[text()="Name"]/../target
    

    这实质上是针对具有文本内容Namediv,使用.. 逐步上升到其父级,然后选择节点类型为target 的子级。

    如果target 节点不是父节点的直接子节点,则以下将查找作为父节点任意深度后代的target 节点(注意唯一的区别是现在前面有两个斜杠target):

    //div[text()="Name"]/..//target
    

    【讨论】:

    • 我认为这是正确的方法,但是如果'目标'在'对象'的深处,我该怎么办? //div[text()="Name"]/../ 这部分很好,但是如果对象的子结构太复杂甚至随机怎么办?您可以将“目标”视为“对象”的子对象吗??
    • 好的,首先,感谢您的关注。现在我可以澄清我的问题了。 “名称”也位于对象的深处。因此,需要将其视为对象的后代。换句话说,/../ 无法找到正确的对象。让我们考虑 ...
      ...
      ,并且类名是从 'Name' 的许多祖先中找到 'object' 的线索.
    【解决方案2】:

    如果你想做通用函数并且每次都想传递你的参数。试试这个。

    def fxpath(varstring):
        Xpathelement = "//div[text()='{}']/../target".format(varstring)
        driver.find_element_by_xpath(Xpathelement)
    
    fxpath('Name')
    

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多