Невозможно найти css "ul # items li: first" (Capybara :: ElementNotFound) - PullRequest
2 голосов
/ 08 июня 2011

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

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 Ответ

3 голосов
/ 08 июня 2011

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

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

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

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

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

...