javascript - 带有 js : true not finding checkbox 的 capybara

标签 javascript ruby-on-rails checkbox rspec capybara-webkit

我需要测试在选中一个复选框后是否在验证过程中显示 Javascript 警报。 我将 RSpecCapybaraWebkitDatabase Cleaner 一起使用。

我的测试没有 JS: true :

  it "alerts to choose two players" do
    set_and_visit
    first("input[type='checkbox']").set(true)
    expect(page).to have_content('Remember that you must choose two players to start a game.')
  end

找到一个复选框但找不到警告消息。

当我添加 JS - "alerts to choose two players", js: true do 它返回一个错误

NoMethodError:
       undefined method `set' for nil:NilClass

我已经尝试使用 check 'John Doe'first("input[type='checkbox']").check 但它仍然无效.

最佳答案

有两个可能的问题:

异步问题

默认驱动程序 (rack-test) 是同步的,所以当您第一次运行时,页面总是会完全加载。当使用像 capybara-webkit 这样的异步驱动程序时,您需要注意竞争条件。当调用 first 时,页面可能仍在加载(或通过 Ajax 更新),因此 input 元素可能尚未出现。

解决方案:使用 find("input[type='checkbox']").set(true) 而不是 first。这将导致 Capybara 在放弃并引发错误之前最多等待两秒以等待 input 出现,而​​不是立即返回 nil

我在 blog post 中写了更多关于编写异步测试的内容.

隐藏元素

因为默认驱动程序 (rack-test) 不解析 CSS 或运行 JavaScript,所以它不了解哪些元素是隐藏的或可见的。这意味着您可以与真实用户无法点击或填写的隐藏元素进行交互。

另一方面,像 capybara-webkit 这样的驱动知道用户实际上可以看到哪些元素。默认情况下,Capybara 会忽略它知道隐藏的所有元素。

解决方案:使用find("input[type='checkbox']", visible: false).set(true)

请注意,如果元素实际上是可见的,这将不起作用,并且最好找出元素被隐藏的原因。毕竟,如果 capybara-webkit 找不到它,您的用户可能也找不到。

您可以在 elabs blog 上阅读更多关于 Capybara 如何处理可见性的信息.

关于javascript - 带有 js : true not finding checkbox 的 capybara ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29889981/

相关文章:

html - 在 div 中垂直居中复选框

javascript - 从 JSON 加载数据表时出错

ruby-on-rails - 你的 Ruby 版本是 2.2.4,但是你的 Gemfile 指定了 2.3.0?

javascript 复选框功能仅工作一次

Symfony2 : Set label of checkbox from Class Field

ruby-on-rails - 托尔已经被需要了。这可能会导致 Bundler 以意想不到的方式出现故障

javascript - 使用 JavaScript 为元素分配 ID

javascript - 带鼠标悬停 javascript 的链接菜单

javascript - 在javascript中将图像url从变量传递到html

ruby-on-rails - 在 Rails 中,我应该使用生成器吗?