Подтвердить что ты не робот

Как заполнить ckeditor от capybara с помощью webkit или selenium driver

Как заполнить область CKEditor в Capybara, предполагая, что я использую драйвер, способный работать с javascript, например capybara-webkit или selenium?

4b9b3361

Ответ 1

Вдохновленный тем, что я нашел здесь, я придумал решение использовать javascript для установки данных на скрытый 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!'

Ответ 2

Небольшое дополнение к Marc-André удивительный ответ

Если вы используете вложенную форму или несколько текстовых полей на той же странице, сгенерированные идентификаторы довольно уродливы и трудно записываются в тесты (например, person_translations_attributes_2_biography) с этим небольшим дополнением к его методу, вы можете найти ckeditors, используя свои метки вместо 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

Таким образом, вместо этого

fill_in_ckeditor 'person_translations_attributes_2_biography', with: 'Some text'

вы можете написать это

fill_in_ckeditor 'Biography', with: 'Some text'

Ответ 3

Файл поддержки 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

Ответ 4

Для меня Marc-André answer включает контекст iframe в драйвере webkit. См. эта проблема с capybara-webkit

Я нашел другой способ заполнить вход ckeditor, который не меняет контекст iframe:

  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!'

Работает как с драйверами webkit, так и с селеном

Вдохновленный этот пост