有没有办法使用 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 时发现,实际上用 keyCode
或 charCode
创建了一个 $.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?的主要内容,如果未能解决你的问题,请参考以下文章
$.ajax 删除请求未在 capybara-webkit 中发送数据参数
ruby 使用Capybara w / Poltergeist(PhantomJS)从位于给定URL的HTML页面的主体中抓取文本内容。