Capybara::Driver::Base#evaluate_script 设置 Javascript 驱动程序后出错
Capybara::Driver::Base#evaluate_script Error After Setting Javascript Driver
我正在使用 Capybara 和 Minitest 来测试我的 Rails 4 应用程序。我们有一个我正在尝试测试的页面,它通过 AJAX 加载了 Google 地图和颜色框。
我们需要确保在检查特定元素之前加载 AJAX 并尝试按照本教程进行操作:
https://thoughtbot.com/blog/automatically-wait-for-ajax-with-capybara
大部分教程都使用RSpec,所以我把代码放在test_helper.rb
:
class ActionDispatch::IntegrationTest
# Make the Capybara DSL available in all integration tests
include Capybara::DSL
include Warden::Test::Helpers
Warden.test_mode!
Capybara.default_max_wait_time = 5
Capybara.javascript_driver = :webkit
def wait_for_ajax
page.evaluate_script("jQuery.active") == 0
yield
end
end
查看出现错误的其他人,他们似乎没有安装 capybara-webkit
gem。但是,我们这样做:
运行 bundle install
:
...
Using capybara 2.5.0
Using capybara-webkit 1.7.1
这是我未通过的测试:
test "colorbox should appear on pageload" do
visit trips_new_path
wait_for_ajax do
assert_selector "#colorbox", "colorbox not created on trips/new"
end
end
我收到错误消息:
Capybara::NotSupportedByDriverError: Capybara::NotSupportedByDriverError: Capybara::Driver::Base#evaluate_script
test/test_helper.rb:35:in `wait_for_ajax'
test/integration/trip_creation_test.rb:17:in `block in <class:TripCreationTest>'
我试过在几个不同的地方设置 JavaScript,但它似乎仍然不起作用。
更新:尝试了其他语法并得到相同的错误:
def wait_for_ajax
Capybara.javascript_driver = :webkit
Timeout.timeout(Capybara.default_wait_time) do
loop until finished_all_ajax_requests?
end
end
def finished_all_ajax_requests?
page.evaluate_script('jQuery.active').zero?
end
预先感谢您的帮助!
您收到 NotSupportedByDriver 错误意味着您的测试实际上并未使用 capybara-webkit 驱动程序,并且可能仍在使用默认的 racktest 驱动程序。您需要指定特定测试应该使用支持 JavaScript 的驱动程序。如果您使用 https://github.com/wojtekmach/minitest-capybara 之类的东西,您可以查看 gems README 以查看如何手动指定它的示例,或者进行设置以便您可以使用元数据标记测试。一旦您实际使用正确的驱动程序进行测试,您可能会发现您实际上并不需要 wait_for_ajax 方法,因为 Capybaras 查找器会自动等待内容出现。
我正在使用 Capybara 和 Minitest 来测试我的 Rails 4 应用程序。我们有一个我正在尝试测试的页面,它通过 AJAX 加载了 Google 地图和颜色框。
我们需要确保在检查特定元素之前加载 AJAX 并尝试按照本教程进行操作: https://thoughtbot.com/blog/automatically-wait-for-ajax-with-capybara
大部分教程都使用RSpec,所以我把代码放在test_helper.rb
:
class ActionDispatch::IntegrationTest
# Make the Capybara DSL available in all integration tests
include Capybara::DSL
include Warden::Test::Helpers
Warden.test_mode!
Capybara.default_max_wait_time = 5
Capybara.javascript_driver = :webkit
def wait_for_ajax
page.evaluate_script("jQuery.active") == 0
yield
end
end
查看出现错误的其他人,他们似乎没有安装 capybara-webkit
gem。但是,我们这样做:
运行 bundle install
:
...
Using capybara 2.5.0
Using capybara-webkit 1.7.1
这是我未通过的测试:
test "colorbox should appear on pageload" do
visit trips_new_path
wait_for_ajax do
assert_selector "#colorbox", "colorbox not created on trips/new"
end
end
我收到错误消息:
Capybara::NotSupportedByDriverError: Capybara::NotSupportedByDriverError: Capybara::Driver::Base#evaluate_script
test/test_helper.rb:35:in `wait_for_ajax'
test/integration/trip_creation_test.rb:17:in `block in <class:TripCreationTest>'
我试过在几个不同的地方设置 JavaScript,但它似乎仍然不起作用。
更新:尝试了其他语法并得到相同的错误:
def wait_for_ajax
Capybara.javascript_driver = :webkit
Timeout.timeout(Capybara.default_wait_time) do
loop until finished_all_ajax_requests?
end
end
def finished_all_ajax_requests?
page.evaluate_script('jQuery.active').zero?
end
预先感谢您的帮助!
您收到 NotSupportedByDriver 错误意味着您的测试实际上并未使用 capybara-webkit 驱动程序,并且可能仍在使用默认的 racktest 驱动程序。您需要指定特定测试应该使用支持 JavaScript 的驱动程序。如果您使用 https://github.com/wojtekmach/minitest-capybara 之类的东西,您可以查看 gems README 以查看如何手动指定它的示例,或者进行设置以便您可以使用元数据标记测试。一旦您实际使用正确的驱动程序进行测试,您可能会发现您实际上并不需要 wait_for_ajax 方法,因为 Capybaras 查找器会自动等待内容出现。