在Capybara中链式查找?

问题描述 投票:1回答:2

我试图在Capybara中使用连锁查找方法,但运气不佳。我希望第二个查找方法只查找第一个查找方法输出的文本。然而,第二个find搜索的是整个文档。

element = page_foo.find('.bar')
element.find('div', :text => "name")

=> All divs with the text "name" on the page.

这里介绍了一个使用xpath的解决方案。

Capybara - 使用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中查找。

rspec capybara
2个回答
3
投票

我记得在过去的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


1
投票

我同意@Taryn的观点,你需要在综合系统内使用,即

within(".bar")do
     find('div', :text => "name")
end 
© www.soinside.com 2019 - 2024. All rights reserved.