2012-10-07 7 views
16

मेरे पास एक पृष्ठ पर Select2 तत्व है जो AJAX के माध्यम से परिणाम लोड करता है। कैपिबारा/आरएसपीईसी (पोल्टरजिस्ट ड्राइवर का उपयोग करके) का परीक्षण करना चाहते हैं, लेकिन चूंकि चयन 2 तत्व वास्तव में एक छिपे हुए क्षेत्र के रूप में शुरू होता है, और उसके बाद परिणाम <ul> पॉप्युलेट करता है, परिणाम सामान्य होने पर, सामान्य select, fill_in या choose सहायक नहीं होंगे काम।कैपिबरा डीएसएल के साथ एक चयन 2 तत्व का परीक्षण कैसे करें?

क्या मैं अब है, इसके बाद के संस्करण लाइन कुछ

तरह
it "should have a search field for events" do 
    click_link "Select an Event"  # this works as expected 
    within('.select2-container') do # works 
     find('.select2-search input').set(event.description[0,5]) # won't work! 
     find(:xpath, "li[text()='#{event.description}']").click 
    end 
    click_button "Search" 
    page.should have_content("Displaying all 2 photos") 
    end 

4 है जाहिरा तौर पर capybara तत्व मिल सकता है, लेकिन मूल्य नहीं बदला गया है और Select2 कभी नहीं अपने ajax कॉल करता है। (वहाँ सामान्य fill_in उपयोग नहीं कर सकते क्योंकि खोज क्षेत्र तत्व कोई लेबल, आईडी है, या नाम का श्रेय)

+0

एक पूरी तरह से निराशाजनक समस्या – guero64

उत्तर

3

मैं page.execute_script का उपयोग कर मैन्युअल रूप से की जरूरत मूल्य और उस खोज बॉक्स में keyup घटना को हैक करने के द्वारा इस का समाधान करने में सक्षम था।

it "should have a search field for events" do 
    click_link "Select an Event" 
    page.execute_script("i = $('.select2-container input').first(); 
         i.val('#{event.description[0,4]}').trigger('keyup');"); 
    sleep 2 
    find('.select2-results li:first-child').click 
    click_button "Search" 
    page.should have_content("Displaying all 2 photos") 
    end 
+0

यहाँ एक capybara सहायक विधि है कि इस बेहतर और के रूप में विशिष्ट क्षेत्र लेबल और तत्वों से बंधा नहीं करता है https://gist.github.com/3849340 – sbeam

+2

यह काम करना चाहिए, लेकिन मुझे त्रुटि मिलती है "तत्व बिंदु पर क्लिक करने योग्य नहीं है (2 9 6, 637)। अन्य तत्व क्लिक प्राप्त होगा:

" – lafeber

+2

यह वही नहीं है जो आप चाहते हैं , इसमें 2 सेकंड की नींद है। – Jankeesvw

4

अपने पृष्ठ पर एकाधिक Select2 घटकों के लिए, मैं निम्नलिखित सहायक तरीकों कि मेरे लिए काम बना लिया है:

def select2(id, value) 
    page.execute_script %Q{ 
    i = $('#s2id_#{id} .select2-input'); 
    i.trigger('keydown').val('#{value}').trigger('keyup'); 
    } 
    sleep 2 
    find('div.select2-result-label').click 
end 

def remove_all_from_select2(id) 
    page.execute_script %Q{ 
    $('#s2id_#{id} .select2-choices a').click(); 
    } 
end 

def remove_from_select2(id, value) 
    page.execute_script %Q{ 
    $('#s2id_#{id} .select2-choices div:contains("#{value}")').closest('li').find('a').click(); 
    } 
end 
+1

यह मुझे सही रास्ते पर मिला। मैंने चयन 2 3.4 https://gist.github.com/onyxrev/6970632 – onyxrev

0

सरल जवाब:

page.find('.select2-drop-active .select2-input').set('foo') 
page.find('.select2-drop-active .select2-input').native.send_keys(:return) 
0

अरे मुझे यकीन है कि नहीं कर रहा हूँ कि किसी को अभी भी परवाह है लेकिन मुझे अभी भी यह समस्या थी और मुझे इससे निपटने का एक आसान तरीका मिला। जब मैं capybara नहीं का उपयोग करने में सक्षम होने के साथ समस्या है शुरू कर दिया

class CollectionSelectInput < SimpleForm::Inputs::CollectionSelectInput 
     def input_html_classes 
     super.push('chosen-select') 
     end 
    end 

तो:

सबसे पहले, मैं कक्षा प्रत्येक ड्रॉप-डाउन करने के लिए चयन नहीं जोड़ते हैं बल्कि मैं यह इतना की तरह विश्व स्तर पर कर Select2 ड्रॉप-डाउन मेरी ठीक ही परीक्षण परिवेश में वैश्विक धक्का नहीं तो उपयोग करने के लिए किया गया था:

class CollectionSelectInput < SimpleForm::Inputs::CollectionSelectInput 
     unless Rails.env.test? 
     def input_html_classes 
      super.push('chosen-select') 
     end 
     end 
    end 

मैं capybara-Select2 मणि ​​का उपयोग करते थे, लेकिन जैसे कि यह नहीं रह गया है बनाए रखा जा रहा है ऐसा लगता है :(

1

मेरे पास दो दूरस्थ चयन 2 हैं। मैं पहले एक स्ट्रिंग की खोज करता हूं और परिणाम के मुताबिक, दूसरा भरा जाता है। capybara-select2 मणि ​​और यहां सूचीबद्ध सभी समाधानों को आजमाने के बाद मुझे अपने स्वयं के समाधान के साथ आना पड़ा क्योंकि उनमें से कोई भी खोज के लिए काम नहीं करता था। मेरे मामले में जो मैं चुनता हूं वह महत्वपूर्ण नहीं है इसलिए किसी विशिष्ट मान के साथ परिणाम लेबल का चयन करने का प्रयास नहीं किया। उम्मीद है कि यह मेरी स्थिति में किसी की मदद करता है।

Given(/^I have selected "(.*?)" category$/) do |arg1| 
    page.find(:css, ".select2-choice.select2-default").click 
    page.find(:css, "#s2id_autogen1_search").set "Dip Boya" 
    sleep 2 
    page.all(:css, '.select2-result-label')[1].click 

end 

Given(/^I have selected "(.*?)" variation$/) do |arg1| 
    page.find(:css, ".select2-choice.select2-default").click 
    page.all(:css, '.select2-result-label')[1].click 
end 
7

मैं एक सहायक है कि आप ककड़ी के साथ उपयोग कर सकते हैं बनाया है, यह एक sleep तो यह उपरोक्त विधियों की तुलना में तेजी है नहीं है। यह भी काम करता है अगर आप चयन 2 द्वारा प्रदान किए गए createSearchChoice का उपयोग करते हैं।

features/support/select2_helper.rb

module Select2Helper 
    def select2(value, attrs) 
    first("#s2id_#{attrs[:from]}").click 
    find(".select2-input").set(value) 
    within ".select2-result" do 
     find("span", text: value).click 
    end 
    end 
end 

World(Select2Helper) 

में यह रखो इस तरह यह प्रयोग करें:

Then(/^I select2 "([^"]*)" from "([^"]*)"$/) do |value, select_name| 
    select2 value, from: select_name 
end 

रेल 4.1.1 और ककड़ी 1.3.15 के साथ परीक्षण किया गया।

+0

के साथ काम करने वाली सामान्य उद्देश्य क्वेरी-एंड-चयन विधि बनाने के लिए अपनी select2 विधि को परिष्कृत किया है यह काम करता है! चुनिंदा 2 multiselects के लिए भी! महोदय, मैं आपके कर्ज में हूं-_- – xxjjnn

+0

कभी-कभी एक अवधि के बजाय एक div होता है, इसलिए मैंने 'ढूंढें ("अवधि")। Text.empty? ? (ढूंढें ("div", text: value) .click): (ढूंढें ("span", text: value) .click) 'अंतिम खोज – xxjjnn

+0

पर मेरे लिए काम नहीं करता क्योंकि मेरे पास दो चयन 2 फ़ील्ड हैं। – gamov

2

Select2 कई के साथ संघर्ष कर रहे लोगों के लिए:

अजीब मैं कई के साथ कि select_tag पाया:

<div class="select2-result-label"> 
    <span class="select2-match"></span> 
    value 
</div> 
बजाय

<div class="select2-result-label"> 
    <span class="select2-match">value</span> 
</div> 
: सच की तरह प्रत्येक प्रविष्टि के लिए एचटीएमएल उत्पन्न करने के लिए उत्सुक लगता है

अनचाहे रूप से अवधि के बाहर सामग्री डालने।

# for most select2s 

def select2_select(value, id) 
    # This methods requires @javascript in the Scenario 
    first("#s2id_#{id}").click 
    find(".select2-input").set(value) 
    within ".select2-result" do 
    if !find("span").text.empty? 
     find("span", text: value).click 
    elsif !find("div").text.empty? 
     find("div", text: value).click 
    else 
     fail 'neither span nor div within this select2, did you get the id of the select2 right?' 
    end 
    end 
end 


# for select_tag select2s which are multiple:true 

def select2_select_multiple(select_these, id) 
    # This methods requires @javascript in the Scenario 
    [select_these].flatten.each do | value | 
    first("#s2id_#{id}").click 
    found = false 
    within("#select2-drop") do 
     all('li.select2-result').each do | result | 
     unless found 
      if result.text == value 
      result.click 
      found = true 
      end 
     end 
     end 
    end 
    end 
end 

बाद मेरी पसंद के लिए भी hacky जा रहा है, तो मैं पहले का उपयोग जहां संभव हो और अंत में उत्तरार्द्ध को बदलने के लिए आशा:

आदेश capybara साथ यह परीक्षण करने के लिए मैं दो तरीकों की है।

Haml प्रयोग किया है:

= select_tag "some_id", options_for_select(['hello','world']), multiple: true, include_blank: true 

js:

$("#some_id").select2(); 
+0

मुझे ढूंढने के लिए उपयोग करना है ('# s2id _ # {id} a')। – gamov

2

इस जवाब से प्रेरित होकर और एक Capybara select2 helper पर मैं कई के लिए मजबूत लगता है क्या के साथ आया था दोनों एकल का चयन करें और बहु ​​की Select2 क्षेत्रों उसी पृष्ठ पर चयन करें:

def select2(value, attrs) 
    s2c = first("#s2id_#{attrs[:from]}") 
    (s2c.first(".select2-choice") || s2c.find(".select2-choices")).click 

    find(:xpath, "//body").all("input.select2-input")[-1].set(value) 
    page.execute_script(%|$("input.select2-input:visible").keyup();|) 
    drop_container = ".select2-results" 
    find(:xpath, "//body").all("#{drop_container} li", text: value)[-1].click 
end 
+0

काम करने के लिए इसके लिए क्लिक करें यह समाधान मेरे लिए काम करता है। – krstck

6

अपने सिर को खरोंच करना बंद करो, ऐसा करें और यह काम करेंगे

select "option_name_here", :from => "Id Of Your select field" 

मैं हर मॉड्यूल और हर लानत बात मैं कर सकता की कोशिश की और अंत में सिर्फ कोड का एक सरल लाइन द्वारा किसी भी सहायक और ऐसी बातों के बिना ऐसा किया।

+1

मैं इसका उपयोग कर रहा हूं और यह काम करता है। लेकिन मुझे नहीं लगता कि आप चयन 2 से जेएस का परीक्षण करेंगे, इसलिए आप वास्तव में परीक्षण नहीं कर रहे हैं कि अंतिम उपयोगकर्ता क्या देख रहा है। लेकिन यह हमेशा एक मुद्दा नहीं हो सकता है। – Ozgar

0

यह एक लटकती शैली Select2 पर मेरे लिए काम करता एक दूरस्थ डेटा स्रोत के साथ:

def select2(value, from:) 
    execute_script("$('##{from}').select2('open')") 
    find(".select2-search__field").set(value) 
    find(".select2-results li", text: /#{value}/).click 
    end 

from नियमित चयन टैग कि Select2 से बनाया गया है की आईडी होना चाहिए।

0
def select2(id, value) 
    find("##{id} ~ span.select2").click 
    within ".select2-results" do 
    find("li", text: value).click 
    end 
end 
0

यहाँ Select2 के नवीनतम संस्करण के लिए एक समाधान है - विशेष रूप से Select2-रेल (4.0.0) मणि:

features/support/feature_helpers.rb में रखें यह, और उसके बाद में config.include FeatureHelpers के साथ अपने spec_helper.rb फ़ाइल में शामिल आपका RSpec.configure do |config| ब्लॉक।

module FeatureHelpers 
    def fill_in_select2(container_selector, with: '') 
    page.execute_script %Q{ 
     i = $('#{container_selector} .select2-search__field'); 
     i.trigger('keydown').val('#{with}').trigger('keyup'); 
    } 
    sleep 2 
    find('.select2-results__option--highlighted').click 
    end 
end 

फिर fill_in_select2 का उपयोग बस के रूप में आप Capybara में fill_in का प्रयोग करेंगे, लेकिन कक्षा या उचित उपसर्ग प्रतीक के साथ एक कंटेनर तत्व की आईडी में शामिल हैं। (उदा। fill_in_select2 '.actions_list', with: '[email protected]')।

नोट: यह टेक्स्ट इनपुट करने के बाद ड्रॉपडाउन में पहला तत्व चुनता है।

रेल 4.2.5.2, कैपिबारा 2.7.1, और कैपिबरा-वेबकिट 1.11 में परीक्षण किया गया।1

0

मुझे जितना चाहें उतना समय व्यतीत करने के बाद, अंततः मुझे एक्सपैथ चयनकर्ता का उपयोग करके ब्रैंडन मैकइनीस के उत्तर पर निर्माण करके काम करना पड़ा।

module Select2Helper 
    def fill_in_select2(container_selector, with: '') 
    page.execute_script %Q{ 
     i = $('#{container_selector} .select2-search__field'); 
     i.trigger('keydown').val('#{with}').trigger('keyup'); 
    } 
    sleep 2 
    find(:xpath, "//body").all("#{container_selector} li", text: with)[-1].click 
    end 
end 
0

Select2 4.0 लिए capybara-वेबकिट के साथ संयोजन में, मैं execute_script आधारित समाधान की कोशिश की लेकिन वे काम नहीं किया क्योंकि capybara 'ली' तत्व जिसके परिणामस्वरूप नहीं पा सके। मैं अंततः send_keys के आधार पर इस सरल समाधान पर बस गया।

module Select2Helpers 
    def fill_in_select2(field_name, with: '') 
    field = find("##{field_name}") 
    parent = field.find(:xpath, './/..') 
    ui = parent.find('.select2-search__field') 

    ui.send_keys(with) 
    sleep 0.5 
    ui.send_keys(:enter) 
    sleep 0.1 
    end 
end 

ध्यान दें कि आप नवीनतम capybara-वेबकिट (1.14.0) को अद्यतन करने के लिए यह काम करने की जरूरत है हो सकता है: क्योंकि मैं एक दूरस्थ डेटा स्रोत का उपयोग, मैं परिणाम प्रकट करने के लिए अनुमति देने के लिए एक छोटी सी नींद गयी।

0

यहाँ, मेरे लिए काम करता भी Select2 AJAX स्वत: पूर्ण के साथ है:

find('#user_id').sibling('span.select2').click 
find('.select2-search__field').set('ABCDEF') 
find('.select2-results li', text: 'ABCDEF').click 
संबंधित मुद्दे