我需要在使用Capybara和WebKit的集成测试中向Web应用程序发送一些按键。使用Selenium(WebDriver和Firefox)我可以这样实现:
find("#element_id").native.send_keys :tab
但WebKit的本机元素节点没有send_keys方法。实际上,WebKit中的native返回了一个包含数字的字符串。是否有另一种方法可以向WebKit发送击键?甚至可能使用JavaScript / jQuery的一些解决方法?
答案 0 :(得分:18)
我一直试图实施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")
答案 1 :(得分:14)
你可以这样做:
keypress_script = "var e = $.Event('keydown', { keyCode: #{keycode} }); $('body').trigger(e);"
page.driver.browser.execute_script(keypress_script)
答案 2 :(得分:11)
这对我使用了Poltergeist来触发星号键:
find("body").native.send_key("*")
我对其他解决方案没有运气;甚至不是Syn。
这是为了触发angular-hotkeys事件。
答案 3 :(得分:5)
现在,自从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
答案 4 :(得分:3)
我最终做了以下事情:
Capybara.current_driver = Capybara.javascript_driver
keypress_script = "$('input#my_field').val('some string').keydown();"
page.driver.browser.execute_script(keypress_script)
我在Chrome中发现,测试我的JavaScript,实际创建了一个$.Event
keyCode
或charCode
,然后在我的输入字段中触发,并没有将字符放入输入。我正在测试自动完成,它需要输入字段中的几个字符,它将在keydown
上启动自动完成。因此,我使用val
手动设置输入值,然后触发keydown
以启动自动完成脚本。
答案 5 :(得分:1)
对于简单的情况,在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
答案 6 :(得分:0)
这是我的解决方案,适用于水豚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
。
答案 7 :(得分:0)
对于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")