2012-06-09 12 views

Respuesta

33

Inspirado en lo que he encontrado here, yo le ocurrió la solución de utilizar javascript para establecer tanto los datos sobre la textarea ocultos y en el objeto CKEditor. Ninguno parecía suficiente, según las circunstancias.

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

Gracias por esto, realmente me ahorró un montón de tiempo. Una pequeña corrección: en capybara 2.1.0, 'browser.execute_script' anterior debe ser' page.execute_script'. –

+0

@BalintErdi: corregido, gracias! –

+0

excelente método aquí. funcionó como un amuleto ... simplemente copie y pegue. – nfriend21

1
archivo de soporte

RSpec + capibara a trabajar con instancias 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

Una pequeña adición a Marc-André's awesome answer

Si está utilizando la forma anidada o varias áreas de texto en la misma Los ID generados por la página son bastante feos y difíciles de escribir en las pruebas (por ejemplo, person_translations_attributes_2_biography) con esta pequeña adición a Hola Método s se puede localizar ckeditors usando sus etiquetas en lugar de ID

# 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 

De esta manera, en lugar de esta

fill_in_ckeditor 'person_translations_attributes_2_biography', with: 'Some text' 

se puede escribir este

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

Estaba a punto de escribir algo exactamente así cuando leí la respuesta de Marc-André. Me alegro de haber seguido leyendo. ¡Gracias! –

+0

si usa ckeditor.updateElement() para establecer el valor del elemento textarea oculto (en lugar de configurarlo directamente con jquery, como en la respuesta de Marc-André) puede experimentar pruebas de falla aleatorias, cuando el carpincho no está esperando en su js para terminar de ejecutar. cuando agrega página.should have_field (locator, with: params [: with], visible: false) capybara espera hasta que el elemento de texto oculto tenga el valor esperado. – wnm

0

Para mí Marc-André's answer cambios de contexto iframe en controlador webkit. Veo this capybara-webkit issue

he encontrado otra manera de llenar en la entrada CKEditor que no cambia contexto iframe:

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

y lo llaman

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

funciona tanto con webkit y selenio conductores

Inspirado por this post

Cuestiones relacionadas