Как найти изображение на странице с помощью Cucumber/Capybara в Rails 3
Я использую 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"'
Я предполагаю, что вам нужен шаг nokogiri, чтобы найти это правильно. Или, если есть лучший способ, я открыт для предложений. Как я могу проверить, что изображение, которое я только что загрузил, находится на странице? Спасибо.
Ответы
Ответ 1
Решение с 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
Ответ 2
Привет, я плохо разбираюсь в XPATH, но с CSS вы можете попробовать:
if page.respond_to? :should
page.should have_selector("img[src$='#{imagename}']")
else
assert page.has_selector?("img[src$='#{imagename}']")
end
желание помогает!
jramby
Ответ 3
Вы можете протестировать его таким образом, а также не в зависимости от пути:
Then /^I should see the image "(.+)"$/ do |image|
page.should have_xpath("//img[contains(@src, \"#{image}\")]")
end
Ответ 4
page.should
теперь устарел. Вместо этого используйте
ожидать (страницы).то
Полный пример:
Then /^I should see the image "(.+)"$/ do |image|
expect(page).to have_xpath("//img[contains(@src, \"#{image}\")]")
end
Ответ 5
Это работает?
page.should have_xpath('//img[@src="/public/images/foo.png"]')
Ответ 6
Да, но эти тесты xpath не будут иметь дело с тем, что...
/public/images/foo.jpg
public/images/foo.jpg
http://mydomain.com/public/images/foo.jpg
... - все равно действительная ссылка на изображение.
Ответ 7
Если у вас много изображений, которые вы хотите проверить, вы можете создать has_image? для Capybara.
Это легко, и этот пост объясняет это шаг за шагом: Добавление has_image? Матчи в Капибаре
Ответ 8
этот синтаксис работал у меня и более читабельен.
page.should have_css ( "img",: src= > "/public/images/foo.png" )