我试图在Capybara中使用连锁查找方法,但运气不佳。我希望第二个查找方法只查找第一个查找方法输出的文本。然而,第二个find搜索的是整个文档。
element = page_foo.find('.bar')
element.find('div', :text => "name")
=> All divs with the text "name" on the page.
这里介绍了一个使用xpath的解决方案。
不过,我对xpath不太熟悉,希望能找到解决的办法。
补充一下细节。
HTML。
<div data-id="tabMeListProducts">
<div class=" title">My BMW 5-SERIES GRAN TURISMO.</div>
</div>
<div data-id="tabMeListPosts">
<div class="name">My BMW 5-SERIES GRAN TURISMO.</div>
</div>
RSPEC。
element = page_foo.find('[data-id="tabMeListProducts"]')
=>#<Capybara::Element tag="div">
element.find('div', :text => "My BMW 5-SERIES GRAN TURISMO.")
=>Capybara::Ambiguous: Ambiguous match, found 2 elements matching css "div" with text "My BMW 5-SERIES GRAN TURISMO."
从上面的例子中可以看出,第二个查找的范围是整个页面,而不是包含在初始查找传入的元素中。
我希望查找只在变量 "元素 "中包含的div中查找。
我记得在过去的Cucumber或Capybara版本中,嵌套的find调用是有效的。然而,随着每个版本的变化,情况也发生了变化。无论如何,你的例子用嵌套的CSS表达式比用多个find更容易处理。
比如说
page_foo.find('[data-id="tabMeListProducts"] .title')
或者
page_foo.find('[data-id="tabMeListProducts"] div', :text => "My BMW 5-SERIES GRAN TURISMO.")
如果有多次出现,我会用 all
而不是 find
并在集合上运行我自己的Ruby检查逻辑。
另外。within
通常可以作为一种替代方案(不需要调用 find
与它一起使用,就像有一个响应所提到的那样,你可以直接在它旁边添加CSS).最后,如果你坚持使用嵌套的查找调用,可以尝试在Capybara文档中提到的同一Ruby行中进行调用。
element.find('div', :text => "My BMW 5-SERIES GRAN TURISMO.")
end
最后,如果你坚持使用嵌套查找调用,请尝试在Capybara文档中提到的同一Ruby行中进行调用。page.find('#foo').find('.bar')
这有可能是懒惰获取,但在Ruby行的最后激活(通过元编程检查行号)。
如果一切都失败了,请开一个GitHub问题。http:/www.rubydoc.infogithubjnicklascapybaraCapybaraNodeFinders#find-instance_method
我同意@Taryn的观点,你需要在综合系统内使用,即
within(".bar")do
find('div', :text => "name")
end