2012-06-09 8 views
18

मैं कैपिबरा के भीतर एक सीकेईडिटर क्षेत्र कैसे भर सकता हूं, मानते हुए कि मैं कैप्बारा-वेबकिट या सेलेनियम जैसे जावास्क्रिप्ट सक्षम ड्राइवर का उपयोग कर रहा हूं?वेबकिट या सेलेनियम ड्राइवर के साथ कैपिबरा से सीकेडिटर को कैसे भरें

उत्तर

33

मैं क्या here पाया से प्रेरित होकर, मैं छिपा textarea पर और CKEditor वस्तु पर डेटा सेट दोनों के लिए जावास्क्रिप्ट का उपयोग करने का समाधान के साथ आया था। परिस्थितियों के आधार पर पर्याप्त नहीं लग रहा था।

def fill_in_ckeditor(locator, opts) 
    content = opts.fetch(:with).to_json # convert to a safe javascript string 
    page.execute_script <<-SCRIPT 
    CKEDITOR.instances['#{locator}'].setData(#{content}); 
    $('textarea##{locator}').text(#{content}); 
    SCRIPT 
end 

# Example: 
fill_in_ckeditor 'email_body', :with => 'This is my message!' 
+1

इसके लिए धन्यवाद, यह वास्तव में मुझे एक टन बचाया। एक छोटा सुधार: कैपिबरा 2.1.0 में, 'browser.execute_script' उपरोक्त 'page.execute_script' होना चाहिए। –

+0

@ बालिंटएर्दी: फिक्स्ड, धन्यवाद! –

+0

यहां महान विधि। एक आकर्षण की तरह काम किया ... बस कॉपी और पेस्ट करें। – nfriend21

1

RSpec + Capybara समर्थन CKEditor उदाहरणों के साथ काम करने के लिए फ़ाइल

module Ckeditor 
    class Instance 
    attr_reader :capybara 
    private :capybara 

    def initialize(instance_id, capybara) 
     @instance_id, @capybara = instance_id, capybara 
    end 

    def val(value) 
     capybara.execute_script "jQuery('textarea##{@instance_id}').val('#{value}')" 
    end 

    def reload_all 
     capybara.execute_script "for(var instance in CKEDITOR.instances) { if(CKEDITOR.instances.hasOwnProperty(instance)) {CKEDITOR.instances[instance].destroy(true);} }" 
     capybara.execute_script "CKEDITOR.replaceAll();" 
    end 
    end 
end 

# usage 
# rte = Ckeditor::Instance.new(:my_instance_id, page) 
# rte.val 'foo' 
# rte.reload_all 
# NOTE: page is provided by Capybara 

https://gist.github.com/3308129

8

Marc-André's awesome answer

लिए एक छोटा सा इसके अलावा आप नेस्टेड फार्म या एक ही में एक से अधिक textareas उपयोग कर रहे हैं पृष्ठ जेनरेट आईडी बहुत बदसूरत और परीक्षण में लिखने में कठोर हैं (उदाहरण के लिए person_translations_attributes_2_biography) हाय के लिए इस छोटे से जोड़े के साथ विधि आप आप इस

fill_in_ckeditor 'Biography', with: 'Some text' 
+0

जब मैं मार्क-आंद्रे के जवाब को पढ़ता हूं तो मैं बस इस तरह कुछ लिखने वाला था। मुझे खुशी है कि मैंने पढ़ना जारी रखा। धन्यवाद! –

+0

यदि आप छिपे हुए टेक्स्टरेरा तत्व के मूल्य को सेट करने के लिए ckeditor.updateElement() का उपयोग करते हैं (इसे सीधे jquery के साथ सेट करने के बजाय, मार्क-एंड्रे के उत्तर में), तो आपको यादृच्छिक असफल परीक्षण का अनुभव हो सकता है, जब कैपिबरा आपके जेएस पर इंतजार नहीं कर रहा है निष्पादन खत्म करने के लिए। जब आप पृष्ठ जोड़ते हैं।होना चाहिए_फील्ड (लोकेटर, साथ: पैराम्स [: के साथ], दृश्यमान: झूठा) कैपिबरा प्रतीक्षा करता है जब तक छुपा पाठ तत्व अपेक्षित मूल्य न हो। – wnm

0

मुझे Marc-André's answer के लिए लिख सकते हैं इस

fill_in_ckeditor 'person_translations_attributes_2_biography', with: 'Some text' 

के बजाय आईडी

# Used to fill ckeditor fields 
# @param [String] locator label text for the textarea or textarea id 
def fill_in_ckeditor(locator, params = {}) 
    # Find out ckeditor id at runtime using its label 
    locator = find('label', text: locator)[:for] if page.has_css?('label', text: locator) 
    # Fill the editor content 
    page.execute_script <<-SCRIPT 
     var ckeditor = CKEDITOR.instances.#{locator} 
     ckeditor.setData('#{params[:with]}') 
     ckeditor.focus() 
     ckeditor.updateElement() 
    SCRIPT 
end 

के बजाय उनके लेबल का उपयोग इस तरह ckeditors पता लगा सकते हैं में आइफ्रेम संदर्भ स्विच वेबकिट ड्राइवर

def fill_in_ckeditor(id, with:) 
    within_frame find("#cke_#{id} iframe") do 
     find('body').base.send_keys with 
    end 
    end 

और यह

fill_in_ckeditor 'comment', with: 'This is my message!'

वर्क्स दोनों वेबकिट और सेलेनियम ड्राइवरों

साथ फोन: this capybara-webkit issue

मैं एक और तरीका CKEditor इनपुट को भरने के लिए जो आइफ्रेम संदर्भ में परिवर्तन नहीं करता पाया देखें

this post

से प्रेरित
संबंधित मुद्दे