2011-01-27 9 views
23

मैं रेल 3 के साथ ककड़ी/कैपिबरा का उपयोग कर रहा हूं और अपलोड के बाद एक छवि के अस्तित्व को सत्यापित करने की कोशिश कर रहा हूं। मुझे यकीन नहीं है कि इसे सत्यापित करने के लिए छवि के यूआरएल को कैसे जांचें।मुझे रेल में 3 ककड़ी/कैपिबरा के साथ एक पृष्ठ पर एक छवि कैसे मिलती है 3

मैं इस परिदृश्य है:

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

मैं यह सोचते हैं रहा हूँ इसे ठीक से ढूंढने के लिए आपको एक नोकोगिरी कदम की आवश्यकता है। या यदि कोई बेहतर तरीका है, तो मैं सुझावों के लिए खुला हूं। मैं कैसे सत्यापित कर सकता हूं कि जिस छवि को मैंने अभी अपलोड किया है वह पृष्ठ पर है? धन्यवाद।

+1

अपने कदम परिभाषा आप एक आम capybara त्रुटि हो रही है में। अगर मुझे सही याद है तो 'respond.body' के बजाय 'page.body' का उपयोग करने का प्रयास करें। – Mauricio

+0

मुझे नहीं पता कि क्या आप xpath में रेगेक्स का उपयोग कर सकते हैं, लेकिन अगर आपके पास अपने लिस्टिंग इंस्टेंस तक पहुंच है, तो आप केवल स्ट्रिंग इंटरपोलेशन "// img [@src = '/ public/images/# {@ listings_id का उपयोग कर सकते हैं } /foo.png '] " – monocle

+0

इस पृष्ठ में एक अच्छा CSS3 चयनकर्ता संदर्भ है जो आपकी मदद करेगा: http://reference.sitepoint.com/css/css3attributeselectors – sivabudh

उत्तर

39

नोकोगिरी के साथ समाधान ठीक काम करना चाहिए। एकमात्र समस्या यह है कि कैबबरा एपीआई वेब्रैट से अलग है, इसलिए response.body के बजाय, आपको page.body का उपयोग करना होगा।

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

धन्यवाद। यह बहुत अच्छा काम करता है। एक और चीज़। लिस्टिंग फ़ोल्डर के आधार पर मेरे फ़ोल्डर नाम परिवर्तनीय हैं। मैं यहां एक रेगेक्स का उपयोग कैसे कर सकता हूं जो केवल छवि का नाम खोजता है (पूरे यूआरएल नहीं)? –

+1

XPath वाइल्डकार्ड का समर्थन करता है, इसलिए मेरे सिर के ऊपर से, मुझे लगता है कि आप इस तरह कुछ लिख सकते हैं: 'page.should have_xpath ("// img [@src = \"/*/*/# {image} \ "] ")' – ndbroadbent

+0

मुझे लगता है कि ड्रैगनफ्लाई द्वारा उत्पन्न यूआरएल के साथ काम करने के लिए इसे कैसे प्राप्त किया जा सकता है। वे इस तरह दिखते हैं: '/media/BAh_some_long_string_AwIw/12_11_52_810_5x5.jpg? S = 7e360000', जहां' 5x5.jpg' मेरा फ़ाइल नाम है। मैंने कुछ ऐसा करने की कोशिश की है: '// img [@src ="/media/*/* # {image}? S = * "]' लेकिन यह काम नहीं करता है। कोई सुझाव मिला? –

3

इस काम करता है:

लेकिन Cabybara के साथ छवि के लिए परीक्षण करने के लिए एक और भी बेहतर तरीका है?

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

धन्यवाद। यह बहुत अच्छा काम करता है। एक और चीज़। लिस्टिंग फ़ोल्डर के आधार पर मेरे फ़ोल्डर नाम परिवर्तनीय हैं। मैं यहां एक रेगेक्स का उपयोग कैसे कर सकता हूं जो केवल छवि का नाम खोजता है (पूरे यूआरएल नहीं)? –

13

हाय मैं XPATH के साथ अच्छा नहीं कर रहा हूँ, लेकिन सीएसएस के साथ की कोशिश कर सकते हैं:

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

इच्छा मदद करता है!

jramby
+3

यह भी काम करता है: 'पृष्ठ। Should have_css ("img [src $ =' # {imagename} ']") ' – sivabudh

0

हाँ, पर इन xpath परीक्षण तथ्य यह है कि ...

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

... छवि के लिए सभी एक ही मान्य लिंक कर रहे हैं के साथ सौदा नहीं होगा।

0

यदि आपके पास ऐसी कई छवियां हैं जिन्हें आप परीक्षण करना चाहते हैं तो आप has_image बना सकते हैं? Capybara के लिए matcher।

यह आसान है और इस पोस्ट यह बताते हैं कदम-दर-कदम: Adding a has_image? Matcher to Capybara

6

आप इस तरह से यह परीक्षण कर सकते हैं, और यह भी पथ के आधार पर नहीं:

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

यह उन छवियों के लिए उपयोग किया जाता है जो पेपरक्लिप संलग्नक जैसे गतिशील पथों में सहेजे जाते हैं। –

-1

इस वाक्य रचना के लिए काम किया मैं और अधिक पठनीय है।

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

+1

'capybara 2.3.0' के लिए काम नहीं करता है। – freemanoid

5

page.should

अब मान्य नहीं है।बजाय

expect(page).to

पूर्ण उदाहरण का उपयोग करें:

Then /^I should see the image "(.+)"$/ do |image| 
    expect(page).to have_xpath("//img[contains(@src, \"#{image}\")]") 
end 
संबंधित मुद्दे