为什么 $x return 项在上下文之外?

Why does $x return items outside of the context?

我正在尝试在 Firefox 中使用 Selenium 驱动程序的 Codeception 测试上下文中使用 xpath 定位器。具体来说,我试图点击电子邮件正文中的第二个 link,使用 roundcube 查看。

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

我可以通过以下路径获得 link:(//div[@class="rcmBody"]//a)[2]

但出于某种原因,当我在正文 div 的上下文中尝试 //a[2] 时,它 returns iframe 中的所有 a 元素。

来自 codeception 的示例:(在选择正确的 iframe 之后)

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

这会导致网络驱动程序单击 iframe 中的第二个 link,它位于正文 div 开始之前。

我也可以直接在 chrome:

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

此 returns iframe 中所有 a 元素的列表,不在上下文中。

如何让上下文部分起作用?

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

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

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