web-dev-qa-db-ja.com

Capybaraを使用してキープレスをWebkitに送信する方法はありますか?

CapybaraとWebKitを使用した統合テストで、いくつかのキープレスをWebアプリに送信する必要があります。 Selenium(WebDriverおよびFirefox)を使用すると、次のように実現できます。

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

ただし、WebKitのネイティブ要素ノードにはsend_keysメソッドがありません。実際、WebKitのネイティブは、数値を含む文字列を返しました。キーストロークをWebKitに送信する別の方法はありますか? JavaScript/jQueryを使用した回避策もあるのではないでしょうか?

34
pupeno

私は成功せずにマルクの答えを実装しようとしましたが、同様の質問からいくつかの助けを見つけました: カピバラ:フォームのフィールド値を入力して終了キーを入力してください 。そして、どうやらこの問題に対処しているように見えるカピバラからの プルリクエスト がありました。

私のために働いたのは:

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

私の例では、フィールドのテキストを消去してから、 Tab。フィールドに'foobar'を入力するには、"\t""foobar\t"に置き換えます。 "\n"を使用して、 Enter キー。

あなたの例では、あなたは使うことができます:

find("#element_id").set("\t")
18
d_rail

これはポルタガイストと一緒に私に働き、アスタリスクキーをトリガーしました:

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

私は他の解決策には運がありませんでした。 Synさえも。

これは angular-hotkeys イベントをトリガーすることでした。

14
Henrik N

あなたはそれをそのようにすることができます:

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

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

5
Osmond

私は次のことをしてしまいました:

Capybara.current_driver = Capybara.javascript_driver
keypress_script = "$('input#my_field').val('some string').keydown();"
page.driver.browser.execute_script(keypress_script)

ChromeでJavaScriptをテストして、実際に$.EventkeyCodeまたはcharCodeを使用して入力フィールドでトリガーしても、文字が入力されませんでした。入力フィールドに数文字を入力する必要があるオートコンプリートをテストしていたところ、keydownでオートコンプリートが開始されました。そこで、valを使用して入力値を手動で設定し、keydownをトリガーしてオートコンプリートスクリプトを開始します。

3
Sarah Vessels

単純なケースでは、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")
0
Greg Blass

これがカピバラ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を使用する必要があることに注意してください。

0
ExiRe