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?

20
demandé sur Marc-André Lafortune 2012-06-09 06:14:50

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!'
33
répondu Marc-André Lafortune 2017-01-15 04:11:12

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'
9
répondu Fabio 2017-05-23 10:29:51

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

https://gist.github.com/3308129

1
répondu shwoodard 2012-08-12 13:31:46

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

0
répondu Hirurg103 2017-09-20 10:44:29