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

时间:2011-12-12 12:10:45

标签: ruby-on-rails webkit capybara keypress

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

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

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

8 个答案:

答案 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 keyCodecharCode,然后在我的输入字段中触发,并没有将字符放入输入。我正在测试自动完成,它需要输入字段中的几个字符,它将在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")