Не удается найти css «ul#items li:first» (Capybara::ElementNotFound)

#ruby-on-rails #cucumber

#ruby-on-rails #огурец

Вопрос:

Я унаследовал приложение Rails, но незнаком с этой конкретной тестовой средой. Когда выполняются тесты cucumber, мы получаем:

 Scenario: Add only an image to a profile by url                     # features/add_an_image_by_file_url.feature:11
    Given I am logged in as a user "admin"                            # features/step_definitions/user_steps.rb:19
    And I create a profile for "Joe Blogs"                       # features/step_definitions/profile_steps.rb:1
    And I have a fake image url "http://fake.com/images/profile.jpg" # features/step_definitions/photo_steps.rb:1
    When I follow "New photo"                                         # features/step_definitions/web_steps.rb:32
    And I fill in "Url" with "http://fake.com/images/profile.jpg"    # features/step_definitions/web_steps.rb:38
    And I press "Create"                                              # features/step_definitions/web_steps.rb:26
    Then I should see "Photo was successfully uploaded."              # features/step_definitions/web_steps.rb:99
    And I should see "profile.jpg" within first profile item          # features/step_definitions/item_steps.rb:18
      Unable to find css "ul#items li:first" (Capybara::ElementNotFound)
      (eval):2:in `find'
      ./features/step_definitions/web_steps.rb:13:in `with_scope'
      ./features/step_definitions/web_steps.rb:100:in `/^I should see "([^"]*)"(?: within "([^"]*)")?$/'
      features/add_an_image_by_file_url.feature:19:in `And I should see "profile.jpg" within first profile item'
  

Это взято из item_steps:

 Then /^I should see "([^"]*)" within (.*?) profile item$/ do |string, filter|
  Then %Q{I should see "#{string}" within "ul#items li:#{filter}"}
end
  

И соответствующие веб-шаги:

 Then /^I should see "([^"]*)"(?: within "([^"]*)")?$/ do |text, selector|
  with_scope(selector) do
    if defined?(Spec::Rails::Matchers)
      page.should have_content(text)
    else
      assert page.has_content?(text)
    end
  end
end
  

Рассматриваемый HTML выглядит следующим образом:

     <ul id='items'>
      <li class='note clearfix'>
        <div class='content'>
          <img src="profile.jpg"/>
        </div>
      </li>
    </ul>
  

Что, черт возьми, здесь происходит?

Ответ №1:

Ну, «что здесь происходит» довольно просто:

  • cucumber выполняет каждый шаг сценария, используя соответствующее определение шага
  • все идет нормально, пока
  • он выполняет «Я должен увидеть»profile.jpg «внутри первого элемента профиля»
  • на этом шаге cucumber переходит к соответствующему определению шага в item_steps
  • это определение в item_steps вызывает другое определение шага из web_steps
  • этот последний проверяет, действительно ли страница содержит заданный контент в заданной области
  • и проверка завершается неудачей…

Я полагаю, интересный вопрос заключается в том, «почему это не работает». Очень похожий css-селектор отлично работает для меня, когда я использовал его в моем сценарии cucumber / capybara.

Вы уверены, что HTML-код действительно отображается в браузере? В шаблоне или в контроллере нет условий, которые могли бы помешать его отображению? Что происходит, когда вы меняете ‘ul#items li:first’ на что-то более простое, скажем, просто ‘ul#items’?

Обновление: проблема действительно очень проста: profile.jpg ЭТО НЕ текстовое содержимое — это «невидимый» HTML-код. Единственная ошибка, которая у вас есть, — это сам сценарий.

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

1. Спасибо за ваш ответ. Я возился с веб-сайтом, переходя с CarrierWave на Paperclip из-за какой-то странной ошибки «не удается скрыть nil в строку». Хотя тест не пройден, сайт разработки работает нормально, если щелкнуть его вручную. Я подозреваю, что что-то не так с тем, как он настроен, но я не был так усерден с TDD, как следовало бы. Ошибка моего пути теперь сильно беспокоит меня, поскольку я нахожу совершенно новую область обучения.

2. Что ж, есть 2 возможные причины описанной вами проблемы: (1) capybara работает некорректно и (2) ваша среда cucumber не соответствует вашей среде разработки в каком-то важном аспекте. первую причину должно быть легко диагностировать, вторую — легко исправить.

3. Еще раз привет. Спасибо за вашу помощь. Похоже, что Capybara работает. У меня есть последняя версия gem, и она запускает Safari с доступными для просмотра версиями файлов сайта. Среды разработки и тестирования находятся на моем macbook, и, поскольку я использую Rails 3 и bundler, это не должно быть проблемой.

4. Вы пытались упростить «ul#items li: #{filter}» -> «ul#items»?

5. О боже, это было так очевидно! «profile.jpg «это просто не текстовое содержимое! Извините за подробный дискурс вместо короткого ответа. Я обновил свой ответ.