如何使用 Capybara 和 ChromeDriver 在输入字段中模拟输入?

Posted

技术标签:

【中文标题】如何使用 Capybara 和 ChromeDriver 在输入字段中模拟输入?【英文标题】:How do I simulate hitting enter in an input field with Capybara and ChromeDriver? 【发布时间】:2012-06-07 16:17:12 【问题描述】:

我有以下帮助方法将字符串输入到输入字段并按回车键,但似乎从未按下回车键。我看到输入字段中输入了字符串,但是在按 Enter 时发生的事件从未发生过。

我已经在一个实际的浏览器中测试了 enter 键正确地触发了预期的事件。我不确定我错过了什么。

def fill_and_trigger_enter_keypress(selector, value)
  page.execute_script %Q(
                          var input = $('#selector');
                          input.val('#value');
                          input.trigger("keypress", [13]);
                         )
end

编辑:

我也尝试了以下方法,但无济于事:

find('#q_name').native.send_keys(:return)
find('#q_name').native.send_keys(:enter)

它们不会导致任何错误,但仍然没有按下回车键。

【问题讨论】:

【参考方案1】:
find('#q_name').native.send_keys(:return)

为我工作。我的字段没有名称或 ID,但类型是输入,所以我使用了类似

find('.myselector_name>input').native.send_keys(:return)

工作得很好!

【讨论】:

作为附加信息,Selinium 不会模拟隐藏元素上的关键事件,而此解决方案即使在隐藏元素上也能正常工作。 @Mysterio Man 此解决方案不适用于 Capybara 2.5。它抛出 NoMethodError: undefined method send_keys' for "5":String` 错误。【参考方案2】:

现在(Capybara 版本 2.5+)您可以通过以下方式模拟<enter> 键:

find('.selector').set("text\n")

\n(新行)是这里非常重要的部分。

【讨论】:

【参考方案3】:

通常当您运行 page.execute_script 时,您会得到与在页面控制台中运行相同的结果。尝试在控制台中手动运行它,看看是否得到预期的结果。这通常是我所做的.. 在浏览器控制台窗口中制作所需的 js 代码,并在它工作时使用 execute_script 将其粘贴到水豚代码中。

【讨论】:

正在努力。当我执行 $('#input_selector').trigger('keyPress', [13]) 时,我没有收到任何错误,但似乎仍然没有触发,好像我要在浏览器中按 Enter 键一样。 是的,所以您可能需要调整您正在触发的事件。尝试先触发一个焦点事件,模拟你点击输入进入它,然后是keyPress..我发现你通常必须玩正确的事件 这是我为填充自动完成所做的,例如:page.execute_script %Q$('#selector').val('#value').focus() .keydown() 听起来像代码驱动测试...而不是测试驱动代码:)【参考方案4】:

Capybara 没有对 send_keys 类型事件的原生支持。你也许可以下到 selenium 来做,或者你可以试试这个 gem https://github.com/markgandolfo/send-keys

【讨论】:

太好了,我去看看那个宝石。但是 Capybara 应该不是问题,因为我将 jQuery 直接发送到 selenium,对吧?【参考方案5】:

对我有用

page.execute_script("$('form.css-class/#form_id').submit()")

【讨论】:

$('form.css-class/#form_id') 不是有效的 jQuery - 运行它会引发错误。 我觉得需要格式化不带斜线,所以$('form.css-class#form_id')【参考方案6】:

@Page.selector.send_keys :return

这对我有用,其中selector 是页面对象中的元素 元素:selector, '<css selector>'

【讨论】:

以上是关于如何使用 Capybara 和 ChromeDriver 在输入字段中模拟输入?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 rspec 中使用 capybara 点击下拉选项

如何使用 Capybara 和 ChromeDriver 在输入字段中模拟输入?

问:如何使用 Turnip、capybara 和 Gherkin 测试 ActionMailer Deliver_later

如何在测试之间重复使用 Capybara 会话?

如何使用 capybara 访问电子邮件中的链接

Capybara -> 如何使用本地方法的结果