如何在Rails 5中使用Capybara单击具有相同文本的链接之一

时间:2019-04-10 20:52:31

标签: ruby-on-rails cucumber capybara

我正在通过黄瓜和水豚在Rails 5上测试我的应用程序的用户管理功能。在“用户”页面中,列出了所有用户,并且每个用户都有一个“删除”链接。 我不知道要在此页面中单击第4个用户的删除。

first(:link, "delete").click

我知道上面的这一行可以选择第一个“删除”,但是那些不是第一个还是最后一个呢?

<%= link_to "delete", user, method: :delete,
                            data: { confirm: "You sure?" } %>

这是erb实现此链接的方式。

实际上还有另一个问题。如上面的代码,单击“删除”后,有一个JavaScript确认弹出窗口。如何单击该“确定”按钮? How do I confirm a javascript popup with Capybara?此处的答案无效。

2 个答案:

答案 0 :(得分:0)

一种选择是使用all查找多个匹配的元素,然后索引到它们中

all(:link, 'delete')[3].click # 0 based index so 3 is the fourth element

不过,这取决于您要测试的内容可能导致脆弱的测试。如果您要删除名为“ Joe Smith”的用户,并且您有类似

的元素,
<div class="user">Bob Jones<a href=...>delete</a></div>
<div class="user">Joe Smith<a href=...>delete</a></div>
...

那么最好通过按以下步骤进行操作来将点击范围限定在页面的正确部分:

find('div.user', text: 'Joe Smith').click_link('delete')

将其与系统确认结合在一起

accept_confirm do
  find('div.user', text: 'Joe Smith').click_link('delete')
end

注意:accept_confirm仅适用于系统确认(由JS Window.confirm打开的那些确认)。如果您已经从JS小部件库中确认了“模态”,则需要像其他页面内容一样与它们进行交互。

答案 1 :(得分:0)

这是一种类似的方法,但是有些不同……理想情况下,您会在规格和视图上发布更多信息,但这也许会对您有所帮助。

您的链接可能具有包装标签。如果他们不加一个。如果确实为每个包装添加了唯一的ID,则:

<% @user.each do |user| %>
  <div id="user_<%= user.id %>">
    <%= link_to "delete", user, method: :delete, data: { confirm: "You sure?" } %>
  </div>
  <div id="user_<%= user.id %>">
    <%= link_to "delete", user, method: :delete, data: { confirm: "You sure?" } %>
  </div>
  <div id="user_<%= user.id %>">
    <%= link_to "delete", user, method: :delete, data: { confirm: "You sure?" } %>
  </div>
<% end %>

根据在水豚测试中建立规格数据的方式,您可以执行以下操作:

it "clicks on a user", :js do
  let(:user4) { create(:user) }

  within("user_#{user4.id}") do
    accept_confirm { click_link("delete") }
  end
end

或者类似这样的东西:

it "clicks on a user", :js do
  let(:users) { create_list(:user, 4) }

  within("user_4") do
    accept_confirm { click_link("delete") }
  end
end

正如Thomas所提到的,您需要通过添加javascript_driver来启用:js来进行测试,默认情况下将使用selenium或将其配置为其他方式使用。{p >