2011-12-12 89 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") 
相關問題