2011-01-27 7 views
23

Używam Cucumber/Capybara z Rails 3 i próbuję potwierdzić istnienie obrazu po przesłaniu. Nie wiem, jak sprawdzić adres URL obrazu, aby go zweryfikować.Jak znaleźć obraz na stronie z Cucumber/Capybara w Railsach 3

Mam następujący scenariusz:

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" 

Wszystko przechodzi z wyjątkiem ostatniego kroku.

Próbowałem to dla mojej definicji krok, który działa świetnie, jeśli jest to tekst na stronie, ale nie dla adresu URL obrazu:

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 

Potem próbowałem też coś tego kroku definicja zamiast:

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 

co powoduje następujący błąd:

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

jestem zakładając potrzebujesz kroku nokogiri, aby znaleźć to poprawnie. Lub jeśli jest lepszy sposób, jestem otwarty na sugestie. Jak mogę sprawdzić, czy obraz, który właśnie przesłałem, znajduje się na stronie? Dzięki.

+1

W swojej definicji kroku otrzymujesz wspólny błąd capybara. Spróbuj użyć "page.body" zamiast "response.body", jeśli dobrze pamiętam. – Mauricio

+0

Nie wiem, czy można użyć wyrażenia regularnego w ścieżce xpath, ale jeśli masz dostęp do instancji Listing, możesz po prostu użyć interpolacji ciągów znaków "// img [@src = '/ public/images/# {@ listing_id } /foo.png '] " – monocle

+0

Ta strona zawiera dobre referencje selektora CSS3, które pomogą ci: http://reference.sitepoint.com/css/css3attributeselectors – sivabudh

Odpowiedz

39

Rozwiązanie z Nokogiri powinno działać dobrze. Jedynym problemem jest to, że API Cabybara różni się od Webrat, więc zamiast response.body, musisz użyć page.body.

Ale tam jeszcze lepszy sposób przetestować dla obrazu z Cabybara:

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

Dzięki. To działa świetnie. Jeszcze jedna rzecz. Moje nazwy folderów są zmienne w oparciu o identyfikator aukcji. Jak mogę użyć wyrażenia tutaj, które wyszukuje tylko nazwę obrazu (nie cały adres URL)? –

+1

XPath obsługuje znaki wieloznaczne, więc wyobraź sobie, że możesz napisać coś takiego: 'page.should have_xpath (" // img [@src = \ "/ */*/# {image} \"] ")' – ndbroadbent

+0

Nie mogę sobie wyobrazić, jak to działa w przypadku adresów URL generowanych przez Dragonfly. Wyglądają tak: '/media/BAh_some_long_string_AwIw/12_11_52_810_5x5.jpg? S = 7e360000', gdzie' 5x5.jpg' jest moją nazwą pliku. Próbowałem coś takiego: '// img [@src ="/media/*/* # {image}? S = * "]', ale to nie działa. Masz jakieś wskazówki? –

3

to działa?

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

Dzięki. To działa świetnie. Jeszcze jedna rzecz. Moje nazwy folderów są zmienne w oparciu o identyfikator aukcji. Jak mogę użyć wyrażenia tutaj, które wyszukuje tylko nazwę obrazu (nie cały adres URL)? –

13

Cześć Nie jestem dobry z XPATH ale z CSS można spróbować:

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

życzenie pomaga! jramby

+3

To również działa: 'page.should have_css (" img [src $ = '# {imagename}'] ")' – sivabudh

0

Tak, ale te testy XPath nie poradzić sobie z faktem, że ...

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

... wszystkie są takie same poprawny link do obrazu.

6

Można przetestować go w ten sposób, a także nie w zależności od ścieżki:

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

To jest to, co jest używane do obrazów, które są zapisywane w dynamicznych ścieżkach, takich jak załączniki Paperclip. –

-1

ta składnia pracował ja i jest bardziej czytelny.

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

+1

Nie działa dla 'kapybara 2.3.0'. – freemanoid

5

page.should

jest teraz przestarzała.Użyj zamiast

expect(page).to

Pełny przykład:

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