带 js 的水豚:真没有找到复选框
Capybara with js: true not finding checkbox
我需要测试 Javascript 警报是否在选中一个复选框后显示在验证过程中。
我正在使用 RSpec
、Capybara
和 Webkit
以及 Database 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
它 returns 一个错误
NoMethodError:
undefined method `set' for nil:NilClass
我试过使用 check 'John Doe'
和 first("input[type='checkbox']").check
,但还是不行。
有两个可能的问题:
异步问题
默认驱动程序 (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 找不到它,您的用户可能也找不到。
您可以在 elabs blog.
上阅读有关 Capybara 如何处理可见性的更多信息
所以,虽然听起来很愚蠢,但我犯的错误是 url - 在我的 set_and_visit
方法中,我是 visiting 'matches/new'
而不是 '/matches/new'
。测试时,puts page.bod
y 返回一个空字符串,因为它找不到 url。
我仍然不确定为什么包含 check 'John Doe'
的测试没有像 js: true
.
那样返回任何错误
我需要测试 Javascript 警报是否在选中一个复选框后显示在验证过程中。
我正在使用 RSpec
、Capybara
和 Webkit
以及 Database 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
它 returns 一个错误
NoMethodError:
undefined method `set' for nil:NilClass
我试过使用 check 'John Doe'
和 first("input[type='checkbox']").check
,但还是不行。
有两个可能的问题:
异步问题
默认驱动程序 (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 找不到它,您的用户可能也找不到。
您可以在 elabs blog.
上阅读有关 Capybara 如何处理可见性的更多信息所以,虽然听起来很愚蠢,但我犯的错误是 url - 在我的 set_and_visit
方法中,我是 visiting 'matches/new'
而不是 '/matches/new'
。测试时,puts page.bod
y 返回一个空字符串,因为它找不到 url。
我仍然不确定为什么包含 check 'John Doe'
的测试没有像 js: true
.