Капибара не может найти элемент, если присутствует JS - PullRequest
0 голосов
/ 09 мая 2019

Я хочу проверить, что пользователь может пропустить форму shipping_address после своей регистрации.

Итак, у меня есть эта кнопка в форме с некоторыми Javasrcipt, которые перенаправляют на страницу, на которой пользователь был раньше.

Если я удаляю :js в сценарии, Capybara может найти #subscription, но тест не пройден из-за пути (нет js, нет перенаправления). Если я поставлю :js, он не может найти #subscription Не могли бы вы дать мне подсказки для этого?

shipping_addresses / new.html.erb

<%= link_to 'Remplir plus tard', 'javascript:history.go(-1);', class: "btn btn-secondary btn-block" %>

Вот тест

scenario "skipping the address form for now", :js do 
    visit  root_path 
    find('#subscription').click
    choose "Monsieur"
    fill_in "user[first_name]", with: "Benoit"
    fill_in "user[last_name]", with: "Durant"
    fill_in "user[birth_date]", with: "08/05/1981"
    fill_in "user[email]", with: "benoit@example.com"
    fill_in "user[email_confirmation]", with: "benoit@example.com"
    fill_in "user[password]", with: "password"
    fill_in "user[password_confirmation]", with: "password"

    click_on "Valider mon inscription"
    expect(page).to have_content("REMPLISSEZ VOTRE ADRESSE DE LIVRAISON")

    click_on "Remplir plus tard"

    expect(current_path).to eq root_path
end

Это выпадающий список в моей навигационной панели

<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink">
  <%= link_to "Connection", new_user_session_path,      class: "dropdown-item"  %>
  <%= link_to "Inscription",   new_user_registration_path, class: "dropdown-item", id:"subscription" %>
</div>   

редактировать больше моего navbar

    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto">
        <li class="nav-item dropdown">
          <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            <% if current_user %>
              <%= current_user.first_name %>
            <% else %>
                Mon Compte
            <% end %>
          </a>
          <% if current_user %>
            <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink">
             #Just removed the links to clear the code
           </div>
          <% else %>
            <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink">
              <%= link_to "Connection", new_user_session_path,      class: "dropdown-item"  %>
              <%= link_to "Inscription",   new_user_registration_path, class: "dropdown-item", id:"subscription" %>
            </div>           
          <% end %>
        </li>
      </ul>
</div>

1 Ответ

2 голосов
/ 09 мая 2019

Я бы просто перепрыгнул на страницу регистрации напрямую, потому что кнопка невидима для Капибары в раскрывающемся меню:

scenario "skipping the address form for now", :js do 
    visit   new_user_registration_path
    choose "Monsieur"
    fill_in "user[first_name]", with: "Benoit"
    fill_in "user[last_name]", with: "Durant"
    fill_in "user[birth_date]", with: "08/05/1981"
    fill_in "user[email]", with: "benoit@example.com"
    fill_in "user[email_confirmation]", with: "benoit@example.com"
    fill_in "user[password]", with: "password"
    fill_in "user[password_confirmation]", with: "password"

    click_on "Valider mon inscription"
    expect(page).to have_content("REMPLISSEZ VOTRE ADRESSE DE LIVRAISON")

    click_on "Remplir plus tard"

    expect(current_path).to eq root_path
end

В качестве альтернативы вы также можете сначала нажать на стрелку, указав ID для окружающего DIV (я думаю ... немного зависит от структуры CSS).

<div id="dropdown" class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink">
  <%= link_to "Connection", new_user_session_path,      class: "dropdown-item"  %>
  <%= link_to "Inscription",   new_user_registration_path, class: "dropdown-item", id:"subscription" %>
</div>  

И сделайте следующее:

scenario "skipping the address form for now", :js do 
    visit  root_path 
    find('#dropdown').click
    find('#subscription').click
    choose "Monsieur"
    fill_in "user[first_name]", with: "Benoit"
    fill_in "user[last_name]", with: "Durant"
    fill_in "user[birth_date]", with: "08/05/1981"
    fill_in "user[email]", with: "benoit@example.com"
    fill_in "user[email_confirmation]", with: "benoit@example.com"
    fill_in "user[password]", with: "password"
    fill_in "user[password_confirmation]", with: "password"

    click_on "Valider mon inscription"
    expect(page).to have_content("REMPLISSEZ VOTRE ADRESSE DE LIVRAISON")

    click_on "Remplir plus tard"

    expect(current_path).to eq root_path
end
...