【问题标题】:Capybara with js: true not finding checkboxCapybara with js:真的没有找到复选框
【发布时间】:2023-03-21 04:12:01
【问题描述】:

选中一个复选框后,我需要测试是否在验证过程中显示 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,但还是不行。

【问题讨论】:

  • 我们可以看到这个测试正在运行的页面的内容吗?
  • @sevenseacat 我的page.body 一直是空的,因为我在 url 上犯了一个错误,并且指向一个不存在的页面。感谢您的帮助!

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


【解决方案1】:

所以,听起来很傻,我犯的错误是在 url 中 - 在我的 set_and_visit 方法中,我是 visiting 'matches/new' 而不是 '/matches/new'。测试时,puts page.body 返回一个空字符串,因为它找不到那个 url。 我仍然不确定为什么包含check 'John Doe' 的测试没有返回任何像js: true 那样的错误。

【讨论】:

    【解决方案2】:

    似乎有两个可能的问题:

    异步问题

    默认驱动程序(机架测试)是同步的,因此在您运行first 时页面将始终完全加载。当使用像 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 如何处理可见性的更多信息。

    【讨论】:

    • 非常感谢您的帮助!我正在考虑隐藏的元素,并会熟悉你的笔记,但我的问题的答案是……一个错字。我指向了错误的 URL,所以我的 page.body 一直是空的。无论如何谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 2012-09-17
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多