¿Cómo puedo llenar un área CKEditor dentro de Capybara, suponiendo que estoy usando un controlador compatible con javascript como capybara-webkit o selenio?Cómo llenar ckeditor de capibara con webkit o selenium driver
Respuesta
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!'
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
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'
Estaba a punto de escribir algo exactamente así cuando leí la respuesta de Marc-André. Me alegro de haber seguido leyendo. ¡Gracias! –
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
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
- 1. Selenium driver: cómo probar el desenfoque?
- 2. Selenium 2.0 Web Driver: implementación de isTextPresent
- 3. Prueba de contenido cargado dinámicamente con Selenium Web Driver
- 4. capibara de pepino ¿cómo funciona?
- 5. Ejecución de pruebas de selenio en paralelo con capibara
- 6. cómo ejecutar una prueba de Capibara independiente?
- 7. Prueba autocompletar con Selenium webdriver
- 8. ¿Cómo integrar CKFinder con CKEditor?
- 9. ¿Cómo se cambia el controlador predeterminado de prueba para una prueba de pepino en Capibara?
- 10. indefinido variable local o método capibara rspec
- 11. usando selenio WebDriver con CKEditor en Firefox 14
- 12. Ckeditor con autocompletar?
- 13. Carpincho-webkit plantea Carpincho :: Controlador :: :: Webkit WebkitInvalidResponseError
- 14. Capybara: Webkit no puede encontrar el iframe o su contenido
- 15. Selenium 2 (WebDriver) o Geb?
- 16. Automatización de Win32 Driver Testing
- 17. nodebase. Sybase driver
- 18. Acciones de registro usando Selenium
- 19. LabVIEW "driver" - getting started
- 20. Configurar capibara para confiar en todos los certificados SSL
- 21. PDO MySQL Driver en Mac
- 22. Pepino/Capibara vs Selenio?
- 23. cómo añadir o incrustarla CKEditor en la página php
- 24. Cómo enviar autenticación HTTP con Selenium python-binding webdriver
- 25. Virtual Webcam Driver
- 26. ¿Puedo usar antes: todo con capibara?
- 27. ¿Cómo llenar NA con la mediana?
- 28. ¿Cómo llenar una tabla con datos verticalmente?
- 29. ¿Cómo ejecuto Selenium en Xvfb?
- 30. ¿Cómo puedo ejecutar las pruebas Selenium WebDriver en un navegador QT Webkit incrustado?
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'. –
@BalintErdi: corregido, gracias! –
excelente método aquí. funcionó como un amuleto ... simplemente copie y pegue. – nfriend21