多个链接的查找器导致选择根节点

Multiple chained finders result in selecting root node

我需要能够在唯一元素的祖先内的部分页面上执行代码。

我有以下代码:

find('div', text: 'text').ancestor('ancestor').find('desired').click

我有时会在测试用例中第二次或第三次出现上述行时遇到以下错误:

Ambiguous match, found 2 elements matching visible css "desired" 
within #<Capybara::Node::Element tag="html" path="/HTML">

执行以下操作时,这种情况也会更频繁地发生:

element = find('div', text: 'text').ancestor('ancestor')
element.find('desired').click
expect(element).to have_content('stuff')

我不能使用 firstall,因为我认为它们是动态页面上陈旧元素引用错误的原因。通过使用它,过时的元素错误消失了。

在第二个示例中,点击后重新启动 element 没有帮助。

我不知道如何将 ancestor 与 within 一起使用,即便如此,每次在该元素和根元素之间切换时我都必须使用 within,这很常见。

请注意,这可能与未回答的 question 重复,但我创建了一个新问题,因为水豚的更新版本(我使用的是 3.15.0)正在发生这种情况。问题是在这种情况下发生在本地和远程。

编辑:我发现了一个总是重复错误的例子:

element = find('example').ancestor(:css, '.ancestor')
element.find(:css, '.marked').click
puts element.path
expect(element).to have_no_css('.marked')

第 3 行的路径将正确打印到控制台,但该示例将因上述错误而失败。如果我把 sleep 2 放在 puts ...expect ... 之间,就不会出现错误。我想这不是预期的水豚行为?

更新:原问题应该在 2019 年 7 月 25 日在 Capybara master 分支中修复

我已经确认 Capybaras ancestor 方法中存在错误,如果最初返回的节点需要重新加载。您可以暂时解决这个问题,方法是使用 xpath 查询而不是 ancestor 之类的

element = find('example').find(:xpath, './/ancestor::*'。class: 'ancestor')