Rails rspec селектор капибары не найден - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть этот интеграционный тест с использованием капибары:

RSpec.describe 'adding a project', type: :system do
  it 'allows a user to create a project with a tasks' do
    visit new_project_path
    fill_in 'Name', with: 'Project Runaway'
    fill_in 'Tasks', with: 'Choose Fabric:3\nMake it Work:5'
    click_on('Create a project')
    visit projects_path
    @project = Project.find_by(name: "Project Runaway")
    expect(page).to have_selector(
      "#project_#{@project.id} > td.name", text: "Project Runaway"
    )
    expect(page).to have_selector(
      "#project_#{@project.id} > td.total-size", text: "8"
    )
  end
end

Каким-то образом не удается найти последний селектор (td.total-size):

Failures:

  1) adding a project allows a user to create a project with a tasks
     Failure/Error:
       expect(page).to have_selector(
         "#project_#{@project.id} > td.total-size", text: "8"
       )

       expected to find visible css "#project_1 > td.total-size" with text "8" but there were no matches. Also found "3", which matched the selector but not all filters.



     # ./spec/system/add_project_spec.rb:14:in `block (2 levels) in <main>'

Но этот тестпрошло, когда я комментирую последнее утверждение.Но не удалось, если я прокомментировал часть td.name и оставил размер td.total без комментариев.

Вот HTML-страница:

<h1>All Projects</h1>
<table>
  <thead>
    <tr>
      <td>Project Name</td>
      <td>Total Project Size</td>
    </tr>
  </thead>
  <tbody>
    <% @projects.each do |project| %>
    <tr class="project-row", id="<%= dom_id(project) %>">
      <td class="name"><%= project.name %></td>
      <td class="total-size"><%= project.total_size %></td>
    </tr>
    <% end %>
  </tbody>
</table>

Мне нужно убедиться, что все данные отображаютсяна столе прямо.Кто-нибудь имеет такой же опыт?

Для дополнительной информации я использую:

  • Rails 5.2.1
  • Ruby 2.5.0
  • Rspec3.7.1
  • Капибара 3.11.1

Заранее спасибо

Обновлено

<body>
    <h1>All Projects</h1>
    <table>
      <thead>
        <tr>
          <td>Project Name</td>
          <td>Total Project Size</td>
        </tr>
      </thead>
      <tbody>
        <tr class="project-row", id="project_1">
          <td class="name">Project Runaway</td>
          <td class="total-size">8</td>
        </tr>
      </tbody>
    </table>
  </body>

Вот чтоHTML отображается.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Вы можете использовать иерархию элементов для таблицы и ее td и tr.например,

#getting text of 1st cell of 2nd row
name = find('#tableId tbody tr:nth-of-type(2) td:nth-of-type(1)').text
if name == "Project Name"
   # do what ever you want to do
else
   # do what ever you want to do
end

, который вы можете поместить над блоком кода в цикле while, чтобы пройти через каждую ячейку таблицы.Примечание. Счетчик капибары начинается с 1, поэтому tr: nth-of-type (2) просто означает 2-й ряд.

0 голосов
/ 25 ноября 2018

Ошибка говорит о том, что элемент, который вы ожидаете, имеет текстовое содержимое "8", имеет текстовое содержимое "3".Это означало бы, что либо в вашем приложении есть ошибка, либо fill_in 'Tasks', with: 'Choose Fabric:3\nMake it Work:5' делает не то, что вы ожидаете.Приостановите тест и посмотрите в браузере, чтобы увидеть, что на самом деле создается, и / или посмотрите на ваш test.log, чтобы увидеть, что отправляется и какие элементы фактически создаются.Также обратите внимание, что я ожидаю, что ваш тест будет довольно ненадежным, потому что вы на самом деле не ожидаете каких-либо действий, выполняемых click_on('Create a project').Это означает, что следующие visit могут произойти до того, как эти действия произойдут, и в конечном итоге отменить их.Добавьте подтверждение между кликом и посещением для любого визуального изменения, указывающего, что создание проекта завершено

click_on('Create a project')
expect(page).to have_text('Project created!') # whatever your app does to indicate successful creation
visit projects_path
...