与Capybara一起穿越树

时间:2013-12-12 11:45:43

标签: cucumber capybara

我想做一些我认为应该很简单但无法解决的问题。 使用Cucumber和Capybara

在表格中,我想单击同一行中的按钮,但是单击一个不同的单元格。

即。我想找到名为“Bob Perkins”

的同一行中的“Change Role”按钮

click_button“更改角色”

我想做点什么

within find("td", text:"Bob Perkins").parent #where this would be the "tr" row
click_link_or_button("Change Role")

但是这给了我一个关于“改变角色”的暧昧匹配。当然,页面上还有更多,但只有其中一个在父节点中应该是...

3 个答案:

答案 0 :(得分:1)

在与capybara进行一些游戏后,看起来好像父方法返回整个html文档

e = find "table > thead"
=> #<Capybara::Element tag="thead">
e.parent
=> #<Capybara::Document>

capybara的默认选择器类型是CSS,不支持父选择器 可能值得查看XPath,与XPath一样,您可以执行包含

e = find :xpath, "//table[thead]"
=> #<Capybara::Element tag="table">

e = find :xpath, "//table[thead]", text: "TOTAL"
=> #<Capybara::Element tag="table">

所以看看你的代码你可以试试这个:

e = find :xpath, "//tr[td[contains(text(),'Bob Perkins')]]"
=> #<Capybara::Element tag="tr">

OR

e = find :xpath, "//tr[td]", text: 'Bob Perkins'
=> #<Capybara::Element tag="tr">

所以你应该得到这样的东西

within find(:xpath, "//tr[td[contains(text(),'Bob Perkins')]]") do
  click_link_or_button("Change Role")
end

祝你好运。

答案 1 :(得分:1)

我不确定有多少人能熟练使用xpath,但是如果你发现它像我一样混乱,你可以链接查找只在必要时使用xpath。例如:

find("td", text:"Bob Perkins").find(:xpath, '..') # Gives you the TR

答案 2 :(得分:-1)

你几乎接近答案。

更正了一个是:

within(find("td", text:"Bob Perkins").parent){ click_link_or_button("Change Role") }