2011-01-27 22 views
23

Tôi đang sử dụng Cucumber/Capybara với Rails 3 và đang cố gắng xác thực sự tồn tại của hình ảnh sau khi tải lên. Tôi không chắc chắn làm thế nào để kiểm tra url của hình ảnh để xác nhận nó.Làm cách nào để tìm hình ảnh trên trang có Cucumber/Capybara trong Rails 3

Tôi có các tình huống sau:

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" 

Tất cả mọi thứ trôi qua, ngoại trừ bước cuối cùng.

Tôi đã thử này cho độ nét bước của tôi, mà làm việc tuyệt vời nếu đó là văn bản trên trang, nhưng không cho một url hình ảnh:

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 

Sau đó, tôi cũng đã thử một cái gì đó giống như bước này định nghĩa thay vì:

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 

gây lỗi sau:

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"' 

tôi giả định bạn cần một bước nokogiri để tìm ra điều này đúng. Hoặc nếu có cách nào tốt hơn, tôi mở lời đề xuất. Làm cách nào tôi có thể xác thực rằng hình ảnh tôi vừa tải lên nằm trên trang? Cảm ơn.

+1

Trong định nghĩa bước của bạn, bạn đang nhận được một lỗi Capybara chung. Hãy thử sử dụng 'page.body' thay vì 'response.body' nếu tôi nhớ chính xác. – Mauricio

+0

Tôi không biết liệu bạn có thể sử dụng regex trong xpath hay không, nhưng nếu bạn có quyền truy cập vào cá thể Liệt kê của mình, bạn chỉ có thể sử dụng phép nội suy chuỗi "// img [@src = '/ public/images/# {@ listing_id } /foo.png '] " – monocle

+0

Trang này chứa tham chiếu bộ chọn CSS3 tốt sẽ giúp bạn: http://reference.sitepoint.com/css/css3attributeselectors – sivabudh

Trả lời

39

Giải pháp với Nokogiri sẽ hoạt động tốt. Vấn đề duy nhất là API Cabybara khác với Webrat, vì vậy thay vì response.body, bạn phải sử dụng page.body.

Nhưng theres một cách tốt hơn để kiểm tra hình ảnh với Cabybara:

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

Cảm ơn bạn. Điều đó hoạt động rất tốt. Một điều nữa. Tên thư mục của tôi là biến dựa trên listing_id. Làm cách nào tôi có thể sử dụng regex ở đây để tìm kiếm theo tên hình ảnh (không phải toàn bộ url)? –

+1

XPath hỗ trợ các ký tự đại diện, vì vậy, bạn có thể viết một cái gì đó như thế này: 'page.should have_xpath (" // img [@src = \ "/ */*/# {image} \"] ")' – ndbroadbent

+0

Tôi không thể tìm ra cách để làm việc này với URL được tạo bởi Dragonfly. Họ trông như thế này: '/media/BAh_some_long_string_AwIw/12_11_52_810_5x5.jpg? S = 7e360000', trong đó' 5x5.jpg' là tên tệp của tôi. Tôi đã thử một cái gì đó như: '// img [@src ="/media/*/* # {image}? S = * "]' nhưng nó không hoạt động. Bạn có mẹo nào không? –

3

Liệu công việc này?

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

Cảm ơn. Điều đó hoạt động rất tốt. Một điều nữa. Tên thư mục của tôi là biến dựa trên listing_id. Làm cách nào tôi có thể sử dụng regex ở đây để tìm kiếm theo tên hình ảnh (không phải toàn bộ url)? –

13

Hi Tôi không tốt với XPath nhưng với CSS bạn có thể thử:

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

mong muốn giúp! jramby

+3

Điều này cũng hoạt động: 'page.should have_css (" img [src $ = '# {imagename}'] ")' – sivabudh

0

Có, nhưng những thử nghiệm xpath sẽ không đối phó với thực tế là ...

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

... là tất cả các liên kết hợp lệ cùng với những hình ảnh.

0

Nếu bạn có nhiều hình ảnh mà bạn muốn thử nghiệm, bạn có thể tạo has_image? matcher cho Capybara.

Nó rất dễ dàng và sau này giải thích nó bước-by-step: Adding a has_image? Matcher to Capybara

6

Bạn có thể kiểm tra nó theo cách này, và cũng không phụ thuộc vào đường dẫn:

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

Đây là những gì được sử dụng cho hình ảnh được lưu trong đường dẫn động như tệp đính kèm Paperclip. –

-1

cú pháp này làm việc cho tôi và dễ đọc hơn.

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

+1

Không hoạt động đối với 'capybara 2.3.0'. – freemanoid

5

page.should

hiện đang bị phản đối.Sử dụng thay vì

expect(page).to

Full dụ:

Then /^I should see the image "(.+)"$/ do |image| 
    expect(page).to have_xpath("//img[contains(@src, \"#{image}\")]") 
end 
Các vấn đề liên quan