【问题标题】:Is there a way to send key presses to Webkit using Capybara?有没有办法使用 Capybara 将按键发送到 Webkit?
【发布时间】:2012-01-18 10:25:33
【问题描述】:

我需要在使用 Capybara 和 WebKit 的集成测试中向 Web 应用发送一些按键。使用 Selenium(WebDriver 和 Firefox)我可以这样实现:

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

但是 WebKit 的原生元素节点没有 send_keys 方法。实际上,WebKit 中的本机返回了一个包含数字的字符串。是否有另一种方法可以将击键发送到 WebKit?甚至可能有一些使用 JavaScript/jQuery 的解决方法?

【问题讨论】:

  • 您对这个 Pablo 有什么好运气吗?我仍然遇到与 .native 方法相同的问题。例如,只返回“4”。

标签: ruby-on-rails webkit capybara keypress


【解决方案1】:

我一直在尝试实施 Marc 的答案,但没有成功,但我从一个类似的问题中找到了一些帮助: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" 用于Enter 键。

对于您的示例,您可以使用:

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

【讨论】:

  • 我确认find("#label").set(my_label + "\n") 触发了Enter 键。
  • 谢谢你!为我工作。我真的很惊讶这么简单的解决方案!
【解决方案2】:

这对我来说是 Poltergeist 触发星号键:

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

我对其他解决方案没有运气;连Syn都不行。

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

【讨论】:

  • 使用 Poltergeist 的另一个原因。它只是让生活更轻松。这对我来说是零摩擦的。
【解决方案3】:

你可以这样做:

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

【讨论】:

  • 这对我有用。我们实际上使用的是 poltergeist 驱动程序 (PhantomJS) 而不是 Capybara WebKit,所以我不得不对那里的第二行代码做一个小的改动:page.driver.execute_script(keypress_script)
  • 这对我有用,但我应该使用 page.execute_script(keypress_script)。
  • 仅供参考 - Poltergeist 支持 element.native.send_keys(*keys)
【解决方案4】:

现在从 Capybara-webkit 1.9.0 开始,您可以使用 send_keys 发送 Enter 等按键和其他按键:

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】:

    我最终做了以下事情:

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

    我在 Chrome 中测试我的 JavaScript 时发现,实际上用 keyCodecharCode 创建了一个 $.Event,然后在我的输入字段上触发它并没有将字符放入输入中。我正在测试自动完成,它需要在输入字段中包含几个字符,它将在keydown 上启动自动完成。于是我用val手动设置了输入值,然后触发keydown,让自动补全脚本启动。

    【讨论】:

      【解决方案6】:

      对于简单的情况,在JS中触发keypress事件就可以了:

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

      要获得更通用和可靠的答案,请使用此great library,它会遇到触发正确事件的麻烦(即keydown,然后是keypress,最后是keyup)。

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

      更复杂的例子可以找到here

      【讨论】:

        【解决方案7】:

        这是我的解决方案,适用于 capybara 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

        【讨论】:

          【解决方案8】:

          对于 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")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-15
            • 2017-02-08
            相关资源
            最近更新 更多