2011-12-12 6 views
30

CapybaraとWebKitを使用した統合テストで、Webアプリケーションにキープレスを送る必要があります。セレン(webdriverをとFirefox)を使用すると、私はこのようにそれを達成することができますカピバラを使って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

これは私のために働いた。私たちは実際にCapybara WebKitの代わりにポルターガイストドライバ(PhantomJS)を使用していますので、2行目のコードに少し変更を加えなければなりませんでした。 page.driver.execute_script(keypress_script) –

+1

これは私のために働いたのですが、 page.execute_script(keypress_script)を使用します。 – drinor

+1

FYI - Poltergeistはelement.native.send_keys(* keys)をサポートしています – Rimian

16

私は成功せず、マルクの答えを実装しようとしてきたが、私は同様の質問からいくつかの助けが見つかりました:capybara: fill in form field value with terminating enter keyを。そして明らかにこの問題に対処していると思われるカピバラのpull requestがありました。

何が私のために働いた。

before { fill_in "some_field_id", with: "\t" } 

私の例では、フィールド内のテキストを消去し、タブを押します。フィールドを'foobar'と入力する場合は、"\t""foobar\t"に置き換えます。 には"\n"を入力してください。を入力してください。ご例えば

、あなたが使用できます。

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

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) 

私は実際にkeyCode$.Eventを作成したりすることを、私はJavaScriptをテストし、Chromeで発見charCodeそれから私の入力フィールドでそれを引き起こして、入力に文字を入れなかった。私は入力フィールドにいくつかの文字が必要なオートコンプリートをテストしていたので、オートコンプリートを​​に開始します。そこで私は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を使用する必要があること。

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

より一般的かつ堅牢な答えのために、すなわち​​右のイベントを(トリガーのトラブルを通過するこのgreat libraryを使用し、そして:JSでkeypressイベントが動作するトリガ簡単な例については

1

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イベントをトリガーするためのものです。カピバラWebkitのために

+0

ポルターガイストを使用するもう一つの理由。それだけで人生が楽になります。これはゼロ摩擦で私のために働いた。 – DannyB

0

、これは私が使用したソリューションです。

def press_enter(input) 
    script = "var e = jQuery.Event('keypress');" 
    script += "e.which = 13;" 
    script += "$('#{input}').trigger(e);" 
    page.execute_script(script); 
end 

その後、私はのように私のテストできれいにそれを使用する:カピバラ-のWebKitを使用して、送信することができます1.9.0以降

press_enter("textarea#comment")