Как мне найти изображение на странице с огурцом / капибарой в Rails 3 - PullRequest
23 голосов
/ 27 января 2011

Я использую Cucumber / Capybara с Rails 3 и пытаюсь проверить существование изображения после загрузки. Я не уверен, как проверить URL-адрес изображения, чтобы проверить его.

У меня есть следующий сценарий:

Scenario: Create new listing
    Given I am on the new listing page
    When I fill in "listing_name" with "Amy Johnson Photography"
    And I attach the file "features/support/test_image.jpg" to "listing_images_attributes_0_photo" 

    And I press "Create"
    Then I should see "Amy Johnson Photography"
    And I should see the image "test_image.jpg"

Все проходит, кроме последнего шага.

Я пробовал это для определения шага, которое прекрасно работает, если текст на странице, но не для URL изображения:

Then /^I should see the image "(.+)"$/ do |image|
  if page.respond_to? :should
      page.should have_content(image)
    else
      assert page.has_content?(image)
    end
end

Тогда я также попробовал что-то вроде этого определения шага:

Then /^I should see the image "(.+)"$/ do |image|
    html = Nokogiri::HTML(response.body)
    tags = html.xpath('//img[@src="/public/images/foo.png"]')
    # tags.length.should eql(num_of_images)
end

, что приводит к следующей ошибке:

And I should see the image "test_image.jpg"                                                    # features/step_definitions/listing_steps.rb:41
      undefined method `body' for nil:NilClass (NoMethodError)
      ./features/step_definitions/listing_steps.rb:42:in `/^I should see the image "(.+)"$/'
      features/manage_listings.feature:24:in `And I should see the image "test_image.jpg"'

Я предполагаю, что вам нужен шаг нокигири, чтобы найти это правильно. Или, если есть лучший способ, я открыт для предложений. Как я могу проверить, что загруженное изображение находится на странице? Спасибо.

Ответы [ 8 ]

39 голосов
/ 27 января 2011

Решение с Nokogiri должно работать нормально.Единственная проблема заключается в том, что API Cabybara отличается от Webrat, поэтому вместо response.body необходимо использовать page.body.

Но есть еще лучший способ проверки изображения с Cabybara:

Then /^I should see the image "(.+)"$/ do |image|
    page.should have_xpath("//img[@src=\"/public/images/#{image}\"]")
end
13 голосов
/ 11 мая 2011

Привет, я не очень хорошо с XPATH, но с CSS вы можете попробовать:

  if page.respond_to? :should
    page.should have_selector("img[src$='#{imagename}']")
  else
    assert page.has_selector?("img[src$='#{imagename}']")
  end

желание помогает! jramby

6 голосов
/ 22 марта 2013

Вы можете проверить это таким образом, а также вне зависимости от пути:

Then /^I should see the image "(.+)"$/ do |image|
    page.should have_xpath("//img[contains(@src, \"#{image}\")]")
end
5 голосов
/ 15 ноября 2014

page.should

устарела. Используйте вместо

ожидать (страница) .то

Полный пример:

Then /^I should see the image "(.+)"$/ do |image|
    expect(page).to have_xpath("//img[contains(@src, \"#{image}\")]")
end
3 голосов
/ 27 января 2011

Это работает?

page.should have_xpath('//img[@src="/public/images/foo.png"]')
0 голосов
/ 30 апреля 2014

этот синтаксис работал для меня и более читабелен.

page.should have_css ("img",: src => "/public/images/foo.png")

0 голосов
/ 19 ноября 2012

Если у вас есть много изображений, которые вы хотите протестировать, вы можете создать has_image?matcher для Capybara.

Это просто, и этот пост объясняет это шаг за шагом: Добавление has_image?Спичка к капибаре

0 голосов
/ 28 сентября 2011

Да, но эти тесты xpath не будут иметь дело с тем фактом, что ...

/public/images/foo.jpg
public/images/foo.jpg
http://mydomain.com/public/images/foo.jpg

... - это все те же действительные ссылки на изображение.

...