2012-11-02 22 views
7

मैं रेल 3.2.8 का उपयोग कर रहा साथरेल 3-jquery-autocomplete: आरएसपीसी और कैपिबरा के साथ परीक्षण कैसे करें?

  • मणि 'jQuery-रेल', '2.1.2'
  • मणि 'rails3-jQuery-स्वत: पूर्ण', '1.0.9'
  • मणि 'rspec-रेल', '2.11.4'
  • मणि 'capybara', '1.1.3'
  • मणि 'capybara-वेबकिट', '0.12.1'

मैं हाल ही में परिवर्तित कर दिया है एक स्वतः पूर्ण करने के लिए एक ड्रॉप ड्रॉप डाउन (हमें rails3-jquery-autocomplete ing) और स्वत: पूर्ण भरने के लिए मेरे अनुरोध चश्मे को अद्यतन करने का प्रयास कर रहा हूं।

मेरे दृष्टिकोण एक सहायक के रूप में बनाने के लिए this gist में दिखाया गया है:

def fill_autocomplete(field, options = {}) 
    fill_in field, :with => options[:with] 

    selector = "ul.ui-autocomplete a:contains('#{options[:select]}')" 

    page.should have_selector selector 
    page.execute_script "$(\"#{selector}\").mouseenter().click()" 
end 

अगर मैं परीक्षण है कि वेबकिट के साथ, परीक्षण इस संदेश के साथ विफल रहता है:

expected css "ul.ui-autocomplete a:contains('Firstname Lastname')" to return something. 

अगर मैं सेलेनियम के साथ परीक्षण , क्योंकि मैं फ़ायरफ़ॉक्स में परीक्षण आगे बढ़ता हूं, मैं ड्रॉप-डाउन पिक सूची दिखाई देता हूं। ड्रॉप-डाउन की प्रतीक्षा करने के लिए sleep 3 जोड़ना मदद नहीं करता है।

मैं here देखता हूं कि कैपिबरा-वेबकिट के साथ एक संबंधित लेकिन कुछ हद तक पुराना मुद्दा है, जब कोई फ़ील्ड भर जाता है, तो यह तुरंत धुंधला हो जाता है, जो निश्चित रूप से स्वत: पूर्ण पिक सूची को दिखने से रोक देगा। लेकिन ऐसा लगता है कि यह काम करने के लिए इसे प्राप्त करने वाले अन्य लोगों के साथ झुकाव नहीं लगता है।

क्या वर्तमान में यह एक ऐसे फॉर्म का परीक्षण करना संभव है जिसमें RSpec और Capybara के साथ rails3-jquery-autocomplete फ़ील्ड शामिल है? कैसे? यदि नहीं, तो संबंधित, छुपा id फ़ील्ड मैन्युअल रूप से भरने का कोई तरीका है, इसलिए मैं अभी भी परीक्षण कर सकता हूं कि फ़ॉर्म सही डेटा बनाता है?

उत्तर

9

अंत में सेलेनियम ड्राइवर के साथ कम से कम स्वत: पूर्ण परीक्षण प्राप्त हुए।

समाधान क्षेत्र पर ध्यान केंद्रित करना और एक कीडाउन घटना जारी करना है।

मैंने ब्राउज़र में मैन्युअल परीक्षण के साथ पहले इसकी पुष्टि की। यदि मैं एक खोज शब्द को स्वत: पूर्ण फ़ील्ड में पेस्ट करने के लिए माउस (Ctrl-V नहीं) का उपयोग करता हूं, तो कुछ नहीं होता - कोई ड्रॉप-डाउन पिक सूची प्रदर्शित नहीं होती है। यह स्पष्ट रूप से बराबर होता है जब कैपिबरा fill_in कमांड भेजता है। हालांकि, शब्द के क्षेत्र में है, जबकि फोकस अभी भी मैदान पर है, अगर मैं किसी भी कुंजी को छूता हूं, उदा। Shift कुंजी, पिक सूची प्रकट होती है। तो स्पष्ट रूप से पिक सूची केवल तब दिखाई देती है जब एक कुंजी दबाई जाती है।

def fill_autocomplete(field, options = {}) 
    fill_in field, :with => options[:with] 

    page.execute_script %Q{ $('##{field}').trigger("focus") } 
    page.execute_script %Q{ $('##{field}').trigger("keydown") } 
    selector = "ul.ui-autocomplete a:contains('#{options[:select]}')" 

    page.should have_selector selector 
    page.execute_script "$(\"#{selector}\").mouseenter().click()" 
end 

और फिर इसे इस तरह कहते हैं:

विकल्प 1

एक समाधान के रूप में इस मूल प्रश्न से समारोह का विस्तार करने के लिए है

fill_autocomplete "to_contact_name", with: "Jone", select: "Bob Jones" 

विकल्प 2

def choose_autocomplete_result(item_text, input_selector="input[data-autocomplete]") 
    page.execute_script %Q{ $('#{input_selector}').trigger("focus") } 
    page.execute_script %Q{ $('#{input_selector}').trigger("keydown") } 
    # Set up a selector, wait for it to appear on the page, then use it. 
    item_selector = "ul.ui-autocomplete li.ui-menu-item a:contains('#{item_text}')" 
    page.should have_selector item_selector 
    page.execute_script %Q{ $("#{item_selector}").trigger("mouseenter").trigger("click"); } 
end 

जो इस तरह कहा जाता है::

fill_in "to_contact_name", :with => "Jone" 
choose_autocomplete_result "Bob Jones", "#to_contact_name" 

एक समान दृष्टिकोण, मुख्य rails3-jQuery-स्वत: पूर्ण मणि में Steak test से अनुकूलित, मानक FILL_IN, इस choose_autocomplete_result के बाद का उपयोग करता है मैंने अपने परीक्षणों के लिए दूसरा दृष्टिकोण अपनाया है। यह सेलेनियम के साथ बहुत विश्वसनीय लगता है लेकिन वेबकिट के साथ काम नहीं करता है, जो बहुत खराब है, क्योंकि सेलेनियम परीक्षण तुलनात्मक रूप से काफी धीमी हैं। वेबकिट के तहत काम करने वाला एक समाधान स्वागत होगा!

+1

हाँ, यह वेबकिट के साथ काम नहीं करता था। मैं इसे कैपिबरा + पोल्टरगेस्ट (वेबकिट एनवी) पर परीक्षण करता हूं, यह है_इलेक्टर सत्यापन पर दुर्घटनाग्रस्त हो गया। जब मैंने इसे स्क्रीनकास्ट लेकर डीबग किया, तो मैंने पाया कि स्वत: पूर्ण आइटम उत्पन्न हुआ था, लेकिन पेज ऑब्जेक्ट इसे – raykin

+2

पहचान नहीं सकता है। आपका विकल्प 1 समाधान तथ्य के कारण काम नहीं कर रहा है 'शामिल हैं' वैध डब्ल्यू 3 सी सीएसएस चयनकर्ता नहीं हैं (यह है केवल jQuery)। मैंने http: // stackoverflow में सूचीबद्ध समाधान के साथ इसे ठीक किया है।कॉम/प्रश्न/6355586/परीक्षण-jquery-autocomplete-ui-with-ककड़ी मेरे नाम के नीचे –

0

पेज.execute_script का उपयोग करने के बजाय, मैंने इनपुट के बाद रिक्त स्थान इनपुट भर दिया ताकि घटना आग लग जाएगी।

fill_in("query", :with => "ma") 
fill_in("query", :with => "") 
# autocomplete suggestions will come up 
all('.autocomplete div').first.should have_content("mango") 
# other assertions 
3

मैं स्वयं भी उसी दर्द स्थान पर कूद गया। इस पर कुछ घंटों खर्च करने के बाद, मेरे पास एक अच्छा सहायक है जो सेलेनियम और पोलस्टरजिस्ट के साथ काम करता है और sleep() का कोई उपयोग नहीं करता है। निम्नलिखित कोड Capybara 2.1.0 के साथ परीक्षण किया गया है:

def fill_autocomplete(field, options = {}) 
    fill_in field, with: options[:with] 

    page.execute_script %Q{ $('##{field}').trigger('focus') } 
    page.execute_script %Q{ $('##{field}').trigger('keydown') } 
    selector = %Q{ul.ui-autocomplete li.ui-menu-item a:contains("#{options[:select]}")} 

    page.should have_selector('ul.ui-autocomplete li.ui-menu-item a') 
    page.execute_script %Q{ $('#{selector}').trigger('mouseenter').click() } 
    end 

असल में, मैं Capybara बता इनपुट क्षेत्र में भरने के लिए तो जे एस का उपयोग keydown ईवेंट ट्रिगर करने के स्वत: पूर्ण सक्रिय करने के लिए। हालांकि sleep() के बजाय, मैं page.should have_selector('ul.ui-autocomplete li.ui-menu-item a') का लाभ उठाता हूं जो ड्रॉपडाउन सूची दिखाई देने तक प्रतीक्षा करता है। फिर मैं mouseenter ईवेंट ट्रिगर करने के लिए जेएस का उपयोग करता हूं और फिर क्लिक करता हूं। मेरी इच्छा है कि जेएस eval के साथ चीजों को करने से बेहतर तरीका है, लेकिन यह सबसे विश्वसनीय समाधान है कि मैं आ सकता था।

+1

कीडाउन Poltergeist के साथ स्वत: पूर्ण कोड को फायर नहीं कर रहा है। मैंने स्क्रीन पर एक डमी इनपुट बॉक्स जोड़कर इसे सत्यापित किया है, और इसके लिए एक कीडाउन श्रोता संलग्न कर रहा है जो सिर्फ एक परीक्षण वस्तु को दृश्यमान या अदृश्य बनाता है। फिर मैं परीक्षण में पहले और बाद में एक स्क्रीनशॉट लेता हूं। तो मुझे पता है कि कीडाउन घटना फायरिंग है, लेकिन किसी भी कारण से यह स्वत: पूर्ण कोड ट्रिगर नहीं कर रहा है जो ब्राउज़र में इतना अच्छा काम करता है। क्या आपको कोई विचार है? मैंने इस पर लगभग 48 कार्य घंटे बिताए हैं और मैं इसे पिछले नहीं कर सकता। – AKWF

2

अगर कोई प्रेरणा के लिए कुछ कोड की जरूरत है (मुझे कुछ समय लिया भी इस सूत्र को पढ़ने के बाद), इस काम करता है: प्रेरणा के लिए

 context "with 5 items results" do 
     before do 
      5.times { FactoryGirl.create(:item, title: "chinese " + random_string(5)) } 
      page.execute_script("$('input#search_param').val('chinese')") 
      page.execute_script("$('input#search_param').trigger('focus')") 
      page.execute_script("$('input#search_param').trigger('keydown')") 
     end 
     specify { page.evaluate_script("$('input#search_param').val()").should == 'chinese' } 
     specify { page.should have_css "#autocomplete-menu li", count: 5 } 
     end 

धन्यवाद मार्क बेरी। मैं/फोकस/mouseenter घटनाओं keydown आग जावास्क्रिप्ट इंजेक्शन लगाने से अधिक इस विकल्प को पसंद

find('#my_object_id').send_keys 'bob'

: