5

我遇到了 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>

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

`fill_in "Description", with: "some description"`

它返回的错误是:

Selenium::WebDriver::Error::InvalidElementStateError:
   Element is not currently interactable and may not be manipulated

Selenium 似乎无法再识别富文本编辑器/文本区域。如果我删除class="redactor"which 是触发 Redactor JS 针对描述文本区域呈现的原因,它可以正常工作。

所以我的问题是,1. 是否有解决方法来填写?2. 或者,我可以以某种方式禁用编辑器 js 只是为了这个测试?

4

3 回答 3

4

您可能需要考虑使用 Redactor 的 API 来填充编辑器字段:

def fill_in_redactor(options)
  if options[:in]
    node = "('#{options[:in]}')"
  else
    node = "('.redactor')"
  end

  page.execute_script( "$#{node}.redactor('set', '#{options[:with]}')" )

end

如果没有传递 :in 选项,它将找到第一个具有 .redactor 类的字段。否则,它假定 :in 值是有效的 css finder 值。

这避免了必须手动填写隐藏的 text_area 字段。

于 2013-08-28T15:49:09.513 回答
4

正如 narath 提到的,Capybara 现在支持 contenteditable div。我能够写:

find('.redactor_editor').set('text')

由于某种原因,fill_in 对我不起作用。

于 2014-06-17T15:00:59.487 回答
3

看起来水豚将包括填充内容可编辑 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
于 2013-01-25T20:45:09.753 回答