有很多关于如何使用 Capybara/Selenium/Rspec 执行 javascript 测试的示例,您可以在其中编写如下测试:
it "does something", :js => true do
...
end
但是,使用minitest您不能传递第二个参数来指示 selenium 执行测试。
有人对如何做到这一点有任何想法吗?
有很多关于如何使用 Capybara/Selenium/Rspec 执行 javascript 测试的示例,您可以在其中编写如下测试:
it "does something", :js => true do
...
end
但是,使用minitest您不能传递第二个参数来指示 selenium 执行测试。
有人对如何做到这一点有任何想法吗?
flag 在做什么:js
很简单。它将当前驱动程序从默认(机架测试)切换到另一个支持 javascript 执行(selenium、webkit)的驱动程序。你可以在 minitest 中做同样的事情:
require "minitest/autorun"
class WebsiteTest < MiniTest::Unit::TestCase
def teardown
super
Capybara.use_default_driver
end
def test_with_javascript
Capybara.current_driver = :selenium
visit "/"
click_link "Hide"
assert has_no_link?("Hide")
end
def test_without_javascript
visit "/"
click_link "Hide"
assert has_link?("Hide")
end
end
当然,为方便起见,您可以将其抽象为一个模块:
require "minitest/autorun"
module PossibleJSDriver
def require_js
Capybara.current_driver = :selenium
end
def teardown
super
Capybara.use_default_driver
end
end
class MiniTest::Unit::TestCase
include PossibleJSDriver
end
class WebsiteTest < MiniTest::Unit::TestCase
def test_with_javascript
require_js
visit "/"
click_link "Hide"
assert has_no_link?("Hide")
end
def test_without_javascript
visit "/"
click_link "Hide"
assert has_link?("Hide")
end
end
嗯,我注意到文档中有几行似乎说上述内容只能在 Rspec 中完成
但是,如果您使用的是RSpec 或 Cucumber,您可能希望考虑将fast 保留:rack_test
为default_driver
,并仅分别标记那些需要支持 JavaScript 的驱动程序using :js => true
或的测试@javascript
。
https://github.com/wojtekmach/minitest-metadata似乎为此提供了解决方案。
您可以执行以下操作:
describe "something under test" do
it "does not use selenium for this test" do
visit "/"
assert body.has_content?("Hello world")
end
it "does use selenium for this test", :js => true do
visit "/"
click_link "Hide" # a link that uses a javascript click event, for example
assert body.has_no_link?("Hide")
end
end
只是为了更新一些信息,现在有一个更强大的带有Ruby 绑定的 selenium-webdriver 。
要使用 Rails 4 和 selenium-webdriver 从终端快速测试 Firefox 上的 JavaScript,您需要执行以下 4 个步骤:
将 gem 添加到您的 Gemfile
gem 'selenium-webdriver' gem 'minitest-rails'
安装宝石
捆绑安装
生成测试用例(参考:官方指南)
bin/rails 生成 integration_test your_case_name
开始在您的测试用例中编写测试代码。实际上你可以在没有 Capybara 的情况下用 ruby 编写它,要使用 Capybara 编写案例你可以参考Github 的 Capybara
最小样本:
# create a driver
driver = Selenium::WebDriver.for :firefox
# navigate to a page
driver.navigate.to 'url_to_page'
# get element with class box
box = driver.find_element(:css, '.box')
# check width
# get width by execute JavaScript
assert_equal 100, driver.execute_script('return $(arguments[0]).width()', box)
目前似乎缺乏关于如何顺利使用 selenium-webdriver、CI 服务器(Jenkins)和 Rails minitest 的资源,我创建了一个简单的项目,希望它可以帮助任何人快速轻松地入门: Rails Selenium Working Case
也感谢让我可以做出更好答案的评论。