如何在Rails 3中使用Cucumber / Capybara在页面上找到图像

时间:2011-01-27 04:02:39

标签: ruby-on-rails cucumber paperclip

我正在使用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"

除了最后一步,一切都过去了。

我已经尝试过这个步骤定义了,如果它是页面上的文本,那么效果很好,但不适用于图像网址:

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步骤来正确找到它。或者,如果有更好的方法,我愿意接受建议。如何验证我刚上传的图片是否在页面上?感谢。

8 个答案:

答案 0 :(得分:39)

Nokogiri的解决方案应该可以正常工作。唯一的问题是Cabybara API与Webrat不同,因此您必须使用response.body而不是page.body

但是有一种更好的方法来测试Cabybara的图像:

Then /^I should see the image "(.+)"$/ do |image|
    page.should have_xpath("//img[@src=\"/public/images/#{image}\"]")
end

答案 1 :(得分:13)

你好我不熟悉XPATH但你可以尝试使用CSS:

  if page.respond_to? :should
    page.should have_selector("img[src$='#{imagename}']")
  else
    assert page.has_selector?("img[src$='#{imagename}']")
  end
希望有所帮助! jramby

答案 2 :(得分:6)

您可以通过这种方式测试它,也不依赖于路径:

Then /^I should see the image "(.+)"$/ do |image|
    page.should have_xpath("//img[contains(@src, \"#{image}\")]")
end

答案 3 :(得分:5)

  

page.should

现已弃用。改为使用

  

期望(页)。为了

完整示例:

Then /^I should see the image "(.+)"$/ do |image|
    expect(page).to have_xpath("//img[contains(@src, \"#{image}\")]")
end

答案 4 :(得分:3)

这有用吗?

page.should have_xpath('//img[@src="/public/images/foo.png"]')

答案 5 :(得分:0)

是的,但这些xpath测试不会处理......

这一事实
/public/images/foo.jpg
public/images/foo.jpg
http://mydomain.com/public/images/foo.jpg

...是与图像相同的有效链接。

答案 6 :(得分:0)

如果你想测试很多图像,你可以创建一个has_image吗? Capybara的匹配器。

这很容易,这篇文章一步一步解释:Adding a has_image? Matcher to Capybara

答案 7 :(得分:-1)

这种语法对我有用,而且更具可读性。

  

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