2011-12-12 92 views
30

我需要在使用Capybara和WebKit的集成测试中将一些按键发送到Web应用程序。使用硒(webdriver的和Firefox),我可以这样实现它:有没有办法使用Capybara发送按键到Webkit?

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

但WebKit的本土元素节点不具有send_keys方法。实际上,WebKit中的本机返回了一个包含数字的字符串。是否有另一种方法将按键发送到WebKit?也许甚至使用JavaScript/jQuery的一些解决方法?

+0

你曾经有这个巴勃罗任何运气?我仍然遇到与原来使用.native方法相同的问题。例如,只返回'4'。 – kikuchiyo

回答

13

你可以那样做:

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

这对我有用。我们实际上使用的是poltergeist驱动程序(PhantomJS)而不是Capybara WebKit,所以我不得不对第二行代码做一些小改动: page.driver.execute_script(keypress_script) –

+1

这对我有效,但我应该使用page.execute_script(keypress_script)。 – drinor

+1

仅供参考 - Poltergeist支持element.native.send_keys(*键) – Rimian

16

我一直在努力实现没有任何成功马克的答案,但我发现从一个类似的问题有所帮助: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"作为输入键。

对于你的榜样,您可以使用:

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

我确认'find(“#label”).set(my_label +“\ n”)'会触发Enter键。 –

+0

谢谢你!为我工作。我真的很惊讶这样简单的解决方案! –

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,实际上与keyCode或创建$.EventcharCode,然后触发在我的输入字段没有把字符放在输入中。我正在测试自动完成,它需要在输入字段中输入几个字符,并且它会在​​上启动自动完成。所以我用val手动设置输入值,然后触发​​使自动完成脚本启动。

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

1

对于简单的情况下,引发了keypress事件JS将工作:

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

为了更全面和强大的答案,可以使用这个great library通过触发正确的事件(即​​的麻烦去,然后keypress,最后是keyup)。

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

更复杂的例子可以发现here

9

这个工作对我骚灵,引发了星号键:

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

我曾与其他解决方案没有运气;甚至不是Syn。

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

+0

使用Poltergeist的另一个原因。它只是让生活更轻松。这对我来说毫无磨擦。 – DannyB

0

对于水豚的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") 
相关问题