Найдите элемент без идентификатора для тестирования на Capybara

#ruby-on-rails #ruby #rspec #capybara

#ruby-on-rails #ruby #rspec #capybara

Вопрос:

У меня есть несколько полей электронной почты в форме. Ни у одного из них намеренно нет идентификатора. Как я могу отличить каждый элемент в тесте, если у них нет идентификатора? Я покажу код для наглядности.

ТЕСТ

  it "sends an invitation to multiple users" do
  click_on "Invite"

  click_link "Invite Another Team Member"

  fill_in "", with: "user@example.com"
  fill_in "", with: "user2@example.com"

  expect { click_button "Invite" }
    .to change(ActionMailer::Base.deliveries, :count).by(1)
    .and change(Invitation, :count).by(2)

  expect(current_path).to eq(account_users_path)
  expect(page).to have_content("user@example.com")
  expect(page).to have_content("user2@example.com")
end
  

Это фактически создает один объект, нижнее поле. Как я могу придать текстовым полям индивидуальность?

ФОРМА

     <%= form_tag account_invitations_url do %>

    <label class="email-label">
      <%= email_field_tag "emails[]", "", placeholder: "Email Address", data: { invitation_modal_email: "" }, id: "" %>
    </label>
    <%= link_to '✚ Invite Another Team Member', "#email", data: { invitation_modal_add: "" }  %>

    <div class="form-actions invitation">
      <span class="button-text"><%= link_to 'Cancel', account_users_path %></span>
      <%= submit_tag "Invite", class: "button button--invitation" %>
    </div>

  <% end %>
  

## Браузер HTML

введите описание изображения здесь

Ответ №1:

Я думаю, вы можете использовать метод Capybara all для поиска всех элементов с одинаковым именем:

 emails = ["user@example.com", "user2@example.com"]
all('input[name="emails[]"]').each_with_index do |field, i|
  field.set(emails[i])
end
  

Или:

 all('input[name="emails[]"]')[0].set("user@example.com")
all('input[name="emails[]"]')[1].set("user2@example.com")
  

Комментарии:

1. Спасибо за помощь, но не могли бы вы подробнее остановиться на втором?

2. Также я получаю эту ошибку сейчас Nokogiri::CSS::SyntaxError: unexpected ']' after '['

3. @Cameron Bass, вам, вероятно, нужно экранировать [] с помощью одинарной или двойной обратной косой черты: 'emails[]' или 'emails\[\]'

4. Тьфу,.. Это выдает мне Nokogiri::XML::XPath::SyntaxError: Invalid expression: //emails[] ошибку

5. Чтобы исправить ошибку, пожалуйста, попробуйте: all('emails[]') или all('input[name=emails[]]') (обновил ответ). Не совсем понятно, что вы имеете в виду под elaborate on that second one , извините. Я думаю, что второй пример полезен, когда нужно заполнить 2 из многих параметров или он может быть более читаемым.