Capybara、Selenium 和 Redactor 富文本编辑器

cma*_*n77 5 selenium rspec capybara redactor

我在 Capybara 和 Selenium 方面遇到了一个有趣的问题。我有一些 Capybara 请求规范,要求在填写表单时启用 javascript。其中一种形式是使用 Redactor 富文本编辑器的文本区域。

<div class="control-group">
<%= f.label :description, "Description", class: "control-label" %>
    <div class="controls">
        <%= f.text_area :description, rows: 10, class: "redactor"%>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

当测试运行并且 Selenium 触发时(在 FF 和 Chrome 驱动程序中),Selenium 在执行以下命令时失败:

`fill_in "Description", with: "some description"`
Run Code Online (Sandbox Code Playgroud)

它返回的错误是:

Selenium::WebDriver::Error::InvalidElementStateError:
   Element is not currently interactable and may not be manipulated
Run Code Online (Sandbox Code Playgroud)

看来 Selenium 无法再识别富文本编辑器/文本区域了。如果我删除class="redactor"触发 Redactor JS 渲染描述文本区域的内容,它就可以正常工作。

所以我的问题是,1.有没有解决方法来填写它?2. 或者,我可以以某种方式禁用 redactor js 来进行此测试吗?

小智 3

看起来水豚将包含 fill_in contenteditable div 的功能(请参阅https://github.com/jnicklas/capybara/pull/911)。

与此同时,我使用以下内容:(您的场景需要 :js => true )

# fill_in_redactor :in => find(".text1"), :with => "Hello world"
def fill_in_redactor(options)
  if options[:in]
    parent = "('#{options[:in]}').find"
  else
    parent = ""
  end

  page.execute_script( "$#{parent}('.redactor_editor').html('#{options[:with]}')" )
  page.execute_script( "$#{parent}('.redactor').html('#{options[:with]}')" )
end

def no_redactor
  page.execute_script("$('.redactor').destroyEditor();");
end
Run Code Online (Sandbox Code Playgroud)