【问题标题】:Why does $x return items outside of the context?为什么 $x 返回上下文之外的项目?
【发布时间】:2016-03-26 03:07:34
【问题描述】:

我正在尝试使用带有 Firefox 的 Selenium 驱动程序在上下文中使用 xpath 定位器进行 Codeception 测试。具体来说,我正在尝试单击电子邮件消息正文中的第二个链接,使用圆形立方体查看。

邮件正文在 div 中,xpath //div[@class="rcmBody"]

我可以得到这个路径的链接:(//div[@class="rcmBody"]//a)[2]

但由于某种原因,当我在 body div 的上下文中尝试 //a[2] 时,它会返回 iframe 中的所有 a 元素。

codeception 的一个例子:(选择正确的 iframe 后)

$I->click('//a[2]', '//div[@class="rcmBody"]')

这会导致 Web 驱动程序单击 iframe 中的第二个链接,该链接位于 body div 开始之前。

我也可以直接在 chrome 中进行测试:

$x('//a', $x('//div[@class="rcmBody"]')[0])

这会返回 iframe 中的所有 a 元素的列表,而不是上下文中的。

我怎样才能让上下文部分起作用?

【问题讨论】:

    标签: html xpath codeception


    【解决方案1】:

    在 XPath 的开头添加一个点,使其特定于上下文

    $I->click('(.//a)[2]', '//div[@class="rcmBody"]')
            HERE^
    

    请注意,此处的括号对于获得所需的 a 父级后代也很重要。

    【讨论】:

    • 太棒了! - 这似乎在上下文中工作 - 但现在我遇到的问题是它没有在最终结果集上过滤 [2]。看起来结果是 //div[@class="rcmBody"]//a[2] 而不是 (//div[@class="rcmBody"]//a)[2]。这正常吗?有什么办法吗?
    • 从头开始 - 我发现它是这样工作的: $I->click('(.//a)[2]', '//div[@class="rcmBody"]' )
    • @DAB .//a[2] 表示“选择所有as,它们是当前节点的后代,并且是其父节点下的第二个a。” (.//a)[2] 表示“选择当前节点的第二个a 后代。”
    猜你喜欢
    • 2019-02-15
    • 2012-07-28
    • 1970-01-01
    • 2020-08-01
    • 2017-01-04
    • 2021-09-04
    • 1970-01-01
    • 2014-02-03
    • 2020-05-15
    相关资源
    最近更新 更多