有没有办法使用 Capybara 将按键发送到 Webkit?

Posted

技术标签:

【中文标题】有没有办法使用 Capybara 将按键发送到 Webkit?【英文标题】:Is there a way to send key presses to Webkit using Capybara? 【发布时间】:2012-01-18 10:25:33 【问题描述】:

我需要在使用 Capybara 和 WebKit 的集成测试中向 Web 应用发送一些按键。使用 Selenium(WebDriver 和 Firefox)我可以这样实现:

find("#element_id").native.send_keys :tab

但是 WebKit 的原生元素节点没有 send_keys 方法。实际上,WebKit 中的本机返回了一个包含数字的字符串。是否有另一种方法可以将击键发送到 WebKit?甚至可能有一些使用 javascript/jQuery 的解决方法?

【问题讨论】:

您对这个 Pablo 有什么好运气吗?我仍然遇到与 .native 方法相同的问题。例如,只返回“4”。 【参考方案1】:

我一直在尝试实施 Marc 的答案,但没有成功,但我从一个类似的问题中找到了一些帮助:capybara: fill in form field value with terminating enter key。显然有一个来自水豚的pull request 似乎解决了这个问题。

对我有用的是:

before  fill_in "some_field_id", with: "\t" 

我的示例擦除字段中的文本,然后按 Tab。要使用'foobar' 填写字段,请将"\t" 替换为"foobar\t"。您也可以将"\n" 用于Enter 键。

对于您的示例,您可以使用:

find("#element_id").set("\t")

【讨论】:

我确认find("#label").set(my_label + "\n") 触发了Enter 键。 谢谢你!为我工作。我真的很惊讶这么简单的解决方案!【参考方案2】:

这对我来说是 Poltergeist 触发星号键:

find("body").native.send_key("*")

我对其他解决方案没有运气;连Syn都不行。

这是为了触发 angular-hotkeys 事件。

【讨论】:

使用 Poltergeist 的另一个原因。它只是让生活更轻松。这对我来说是零摩擦的。【参考方案3】:

你可以这样做:

keypress_script = "var e = $.Event('keydown',  keyCode: #keycode ); $('body').trigger(e);"
page.driver.browser.execute_script(keypress_script)

【讨论】:

这对我有用。我们实际上使用的是 poltergeist 驱动程序 (PhantomJS) 而不是 Capybara WebKit,所以我不得不对那里的第二行代码做一个小的改动:page.driver.execute_script(keypress_script) 这对我有用,但我应该使用 page.execute_script(keypress_script)。 仅供参考 - Poltergeist 支持 element.native.send_keys(*keys)【参考方案4】:

现在从 Capybara-webkit 1.9.0 开始,您可以使用 send_keys 发送 Enter 等按键和其他按键:

find("textarea#comment").send_keys(:enter)

来源:https://github.com/thoughtbot/capybara-webkit/issues/191#issuecomment-228758761

Capybara API 文档:http://www.rubydoc.info/github/jnicklas/capybara/Capybara%2FNode%2FElement%3Asend_keys

【讨论】:

【参考方案5】:

我最终做了以下事情:

Capybara.current_driver = Capybara.javascript_driver
keypress_script = "$('input#my_field').val('some string').keydown();"
page.driver.browser.execute_script(keypress_script)

我在 Chrome 中测试我的 JavaScript 时发现,实际上用 keyCodecharCode 创建了一个 $.Event,然后在我的输入字段上触发它并没有将字符放入输入中。我正在测试自动完成,它需要在输入字段中包含几个字符,它将在keydown 上启动自动完成。于是我用val手动设置了输入值,然后触发keydown,让自动补全脚本启动。

【讨论】:

【参考方案6】:

对于简单的情况,在JS中触发keypress事件就可以了:

def press(code)
  page.execute_script("$('#my-input').trigger($.Event('keypress', keyCode: #code))")
end

要获得更通用和可靠的答案,请使用此great library,它会遇到触发正确事件的麻烦(即keydown,然后是keypress,最后是keyup)。

def type(string)
  page.execute_script("Syn.click(, 'my-input').wait().type(#string.to_json)")
end

更复杂的例子可以找到here

【讨论】:

【参考方案7】:

这是我的解决方案,适用于 capybara 2.1.0

fill_in('token-input-machine_tag_list', :with => 'new tag name')
page.evaluate_script("var e = $.Event('keydown',  keyCode: 13 ); $('#token-input-machine_tag_list').trigger(e);") # Press enter

请注意,在新的水豚中,您必须使用page.evaluate_script

【讨论】:

【参考方案8】:

对于 Capybara Webkit,这是我使用的解决方案:

def press_enter(input)
  script = "var e = jQuery.Event('keypress');"
  script += "e.which = 13;"
  script += "$('#input').trigger(e);"
  page.execute_script(script);
end

然后我在我的测试中干净利落地使用它:

press_enter("textarea#comment")

【讨论】:

以上是关于有没有办法使用 Capybara 将按键发送到 Webkit?的主要内容,如果未能解决你的问题,请参考以下文章

在 capybara-webkit 中禁用声音

如何拦截按键? [复制]

$.ajax 删除请求未在 capybara-webkit 中发送数据参数

RubyMine 中的 Capybara 代码完成

ruby 使用Capybara w / Poltergeist(PhantomJS)从位于给定URL的HTML页面的主体中抓取文本内容。

更改默认 Capybara 浏览器窗口大小