Как нажать на одну из ссылок с тем же текстом, используя Capybara в Rails 5 - PullRequest
0 голосов
/ 10 апреля 2019

Я тестирую функцию управления пользователями моего приложения на Rails 5 от cucumber и capybara.На странице «Пользователи» перечислены все пользователи, и для каждого пользователя есть ссылка «удалить».Я не имею ни малейшего представления о нажатии удаления 4-го пользователя на этой странице.

first(:link, "delete").click

Я знаю, что в этой строке выше можно выбрать первое «удаление», но как насчет того, что это не первое или последнее?

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

Вот как эта ссылка реализована erb.

На самом деле есть еще один вопрос.Как показано выше, после нажатия кнопки «Удалить» появляется всплывающее окно подтверждения JavaScript.Как нажать эту кнопку «ОК»? Как мне подтвердить всплывающее окно javascript с помощью Capybara? Ответы здесь не работают.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Здесь аналогичный подход, но немного другой ... в идеале вы бы опубликовали немного больше информации о своей спецификации и представлении, но, возможно, это поможет вам.

Возможно, ваши ссылки имеют тег-обертку.Если они не добавляют один.Если они добавляют уникальный идентификатор для каждой оболочки:

<% @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

Как упоминал Томас, вам нужно включить javascript_driver для вашего теста, добавив :js, который будет использовать selenium по умолчанию или другой, если вы его настроили.

0 голосов
/ 11 апреля 2019

Один из вариантов - использовать all, чтобы найти несколько подходящих элементов, а затем индексировать их

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

, в зависимости от того, что именно вы тестируете, что может привести к хрупким тестам.Если ваше требование состоит в том, чтобы удалить пользователя с именем «Джо Смит», и у вас есть такие элементы, как

<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, вам нужно взаимодействовать с ними, как и с любым другим содержимым страницы.

...