Comment remplir ckeditor de capybara avec webkit ou pilote selenium
Comment remplir une zone CKEditor à Capybara, en supposant que j'utilise un pilote javascript comme capybara-webkit ou selenium?
4 réponses
inspiré de ce que j'ai trouvé ici , j'ai trouvé la solution d'utiliser javascript à la fois pour définir les données sur le caché textarea
et sur l'objet CKEditor
. Ni lui semble suffisant, selon les circonstances.
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!'
un petit ajout à la réponse impressionnante de Marc-André
si vous utilisez la forme imbriquée ou des textareas multiples dans la même page IDs générés sont assez laid et difficile à écrire dans les tests (par exemple person_translations_attributes_2_biography
) avec ce petit ajout à sa méthode, vous pouvez localiser ckeditors en utilisant leurs étiquettes au lieu de L'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 cette façon au lieu de ce
fill_in_ckeditor 'person_translations_attributes_2_biography', with: 'Some text'
vous pouvez écrire ceci
fill_in_ckeditor 'Biography', with: 'Some text'
RSpec + Capybara fichier de support pour le travail avec ckeditor instances
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
pour moi la réponse de Marc-André change le contexte iframe dans le pilote webkit. Voir ce numéro capybara-webkit
j'ai trouvé une autre façon de remplir l'entrée ckeditor qui ne change pas le contexte iframe:
def fill_in_ckeditor(id, with:)
within_frame find("#cke_#{id} iframe") do
find('body').base.send_keys with
end
end
et appelez-le
fill_in_ckeditor 'comment', with: 'This is my message!'
fonctionne à la fois avec les pilotes webkit et selenium
inspiré par ce message