Capybara与js:真的没找到复选框

时间:2015-04-27 07:46:59

标签: 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,但它仍然无效。

2 个答案:

答案 0 :(得分:2)

似乎有两种可能的问题:

异步问题

默认驱动程序(rack-test)是同步的,因此在运行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找不到它,你的用户可能也不会。

您可以详细了解Capybara如何处理elabs blog的可见性。

答案 1 :(得分:-1)

所以,愚蠢的,因为它听起来我犯的错误是在我的set_and_visit方法中,我是visiting 'matches/new'而不是'/matches/new'。测试时,puts page.bod y返回一个空字符串,因为它无法找到该网址。 我仍然不确定为什么包含check 'John Doe'的测试没有返回任何错误,例如js: true的错误。