2010-10-06 16 views
17

मुझे कैपिबारा और सेलेनियम का उपयोग करते समय jQuery के साथ की गई स्लॉट जावास्क्रिप्ट चीजों का परीक्षण करने में परेशानी हो रही है। जब कोई उपयोगकर्ता "संसाधन जोड़ें" लिंक पर क्लिक करता है तो अनुमानित व्यवहार गतिशील रूप से जेनरेट होने के लिए होता है। Capybara लिंक पर क्लिक करने में सक्षम हो जाएगा, लेकिन नए फॉर्म तत्वों (यानी "संसाधन [नाम]") को पहचानने में विफल रहता है।कैपिबरा गतिशील रूप से जोड़े गए डीओएम तत्वों को पहचानता नहीं है?

क्या कैपिबरा के लिए डीओएम पुनः लोड करने का कोई तरीका है, या क्या इस मणि का कुछ तत्व है जिसे मैंने अभी तक नहीं सीखा है?

अग्रिम धन्यवाद!

wait_for_element 

विधि:

== संपादित करें ==

वर्तमान में सेलेनियम के साथ अपने भाग्य आजमाने।

== संपादित करें ==

मैं जब निम्न कार्य करने का प्रयास "nill वर्ग के लिए अपरिभाषित विधि 'wait_for_element`" एक बार आ रही है:

@selenium.wait_for_element 

ऐसा नहीं है कि उस विशिष्ट विधि दिखाई देता है, या संभवतः wait_for जो कि डीओएम तत्व तक पहुंचने वाले विशाल चयनकर्ता के साथ है, मैं उम्मीद करता हूं कि कार्रवाई का सही तरीका है, लेकिन अब सेलेनियम सत्र प्राप्त करने का प्रयास करना एक बड़ा सिरदर्द होना शुरू हो रहा है।

उत्तर

17

मैं आरएसपीईसी में कैपिबरा के लिए वेबड्राइवर आधारित ड्राइवर का उपयोग करता हूं, जिसे मैं कॉन्फ़िगर करता हूं और इसका उपयोग करता हूं और यह निश्चित रूप से जेएस को संभालेगा और डोम को पुनः लोड करने की आवश्यकता नहीं है। कुंजी एक प्रतीक्षा_until और एक शर्त का उपयोग कर रही है जो आपकी AJAX प्रतिक्रिया समाप्त होने पर सच होगी।

before(:each) do 
    select_driver(example) 
    logout 
    login('databanks') 
end 

def select_driver(example) 
    if example.metadata[:js] 
    Capybara.current_driver = :selenium 
    else 
    Capybara.use_default_driver 
    end 
end 

it "should let me delete a scenario", :js=>true do 
    select("Mysite Search", :from=>'scenario_id') 
    wait_until{ page.has_content?('mysite_searchterms')}  
    click_on "delete"  
    wait_until{ !page.has_content?('mysite_searchterms')} 
    visit '/databanks' 
    page.should_not have_content('Mysite Search') 
    end 

मैं भी एक हैक पता लगा webdriver कल रात धीमा करने के लिए, इस तरह, आप slo- मो में चीजों को देखना चाहते हैं:,

#set a command delay 
    require 'selenium-webdriver' 

    module ::Selenium::WebDriver::Remote 
    class Bridge 
     def execute(*args) 
     res = raw_execute(*args)['value'] 
     sleep 0.5 
     res 
     end 
    end 
    end 

किसी रूप में किसी और का उल्लेख किया है, तो आप हो रही है तत्व के लिए प्रतीक्षा करने वाला एक टाइमआउट, आप इसे ऊपर देख सकते हैं:

Capybara.default_wait_time = 10 
+0

धन्यवाद @ebeland। अब काम पर हमारे परीक्षणों में कुछ समान उपयोग करने के कई महीनों के बाद, 'wait_until' विधि को संदेह के बिना सही तरीका है :) –

+4

' wait_until' को Capybara 2.0.0 से हटा दिया गया है। [इस ब्लॉग पोस्ट को देखें] (http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara) –

7

Capybara डॉक्स से:

जब अतुल्यकालिक जावास्क्रिप्ट के साथ काम करने के लिए, आप स्थितियों पर पहुंच जाएं, जहां का प्रयास कर रहे एक तत्व जो अभी तक पृष्ठ पर मौजूद नहीं है के साथ बातचीत। Capybara स्वचालित रूप से द्वारा पृष्ठ पर तत्वों के लिए प्रतीक्षारत होने का इंतजार कर रहा है। ,

Capybara.default_wait_time = 10 

यदि इससे मदद नहीं करता है मैं तुम्हें encorage GitHub पर परियोजना से किसी संपर्क करने के लिए होगा मेलिंग सूची के लिए लिख सकते हैं या सबमिट करें:

आप बढ़ती प्रतीक्षा समय कुछ भाग्य हो सकता है एक मुद्दा रिपोर्ट।

+3

+1 यहां। Capybara विधि कॉल के लिए इस डिफ़ॉल्ट प्रतीक्षा समय का उपयोग करता है जैसे 'has_selector?' 'Has_css? 'और इसी तरह। तो आप तत्वों को प्रकट होने के लिए इन विधियों का उपयोग करने के लिए उपयोग कर सकते हैं, जैसे कि: has_css? ("A # myinput",: visual => true) 'आगे बढ़ने से पहले तत्व स्क्रीन पर तब तक इंतजार करेगा जब तक इंतजार नहीं करेगा। – bergyman

+0

मुझे 'Capybara.default_wait_time = 10' कहां रखना चाहिए? –

+1

@AlexanderSupertramp आपके 'spec/rails_helper.rb' में यदि आपके पास है, अन्यथा आपका' spec/spec_helper.rb'। – thomasfedb

0

कैपिबरा 2.0 से भी प्रतीक्षा_until हटा दिया गया।फिर भी यह उपयोगी है और नीचे से कोड पकड़ो:

def wait_until(delay = 1) 
seconds_waited = 0 
while ! yield && seconds_waited < Capybara.default_wait_time  
    sleep delay  
    seconds_waited += 1 
    end 
    raise "Waited for #{Capybara.default_wait_time} seconds but condition did not become true" unless yield 
end 
संबंधित मुद्दे