CapybaraとWebKitを使用した統合テストで、いくつかのキープレスをWebアプリに送信する必要があります。 Selenium(WebDriverおよびFirefox)を使用すると、次のように実現できます。
find("#element_id").native.send_keys :tab
ただし、WebKitのネイティブ要素ノードにはsend_keysメソッドがありません。実際、WebKitのネイティブは、数値を含む文字列を返しました。キーストロークをWebKitに送信する別の方法はありますか? JavaScript/jQueryを使用した回避策もあるのではないでしょうか?
私は成功せずにマルクの答えを実装しようとしましたが、同様の質問からいくつかの助けを見つけました: カピバラ:フォームのフィールド値を入力して終了キーを入力してください 。そして、どうやらこの問題に対処しているように見えるカピバラからの プルリクエスト がありました。
私のために働いたのは:
before { fill_in "some_field_id", with: "\t" }
私の例では、フィールドのテキストを消去してから、 Tab。フィールドに'foobar'
を入力するには、"\t"
を"foobar\t"
に置き換えます。 "\n"
を使用して、 Enter キー。
あなたの例では、あなたは使うことができます:
find("#element_id").set("\t")
これはポルタガイストと一緒に私に働き、アスタリスクキーをトリガーしました:
find("body").native.send_key("*")
私は他の解決策には運がありませんでした。 Synさえも。
これは angular-hotkeys イベントをトリガーすることでした。
あなたはそれをそのようにすることができます:
keypress_script = "var e = $.Event('keydown', { keyCode: #{keycode} }); $('body').trigger(e);"
page.driver.browser.execute_script(keypress_script)
Capybara-webkit 1.9.0以降、Enterなどのキープレスをsend_keysを使用して送信できます。
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
私は次のことをしてしまいました:
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
をトリガーしてオートコンプリートスクリプトを開始します。
単純なケースでは、JSでkeypress
イベントをトリガーすると機能します。
def press(code)
page.execute_script("$('#my-input').trigger($.Event('keypress', {keyCode: #{code}}))")
end
より一般的で堅牢な答えを得るには、次の 大ライブラリ を使用します。これにより、適切なイベント(つまり、keydown
、次にkeypress
、最後にkeyup
)。
def type(string)
page.execute_script("Syn.click({}, 'my-input').wait().type(#{string.to_json})")
end
より複雑な例を見つけることができます here
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")
これがカピバラ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
を使用する必要があることに注意してください。