我正试图通过只打开和关闭浏览器一次来提高运行测试的速度。
http://watirmelon.com/2012/04/01/five-page-object-anti-patterns/
我在hooks.rb 中有以下内容
browser = Watir::Browser.new ENV['BROWSER'].to_sym
Before do
@browser = browser
end
After do |scenario|
@browser.cookies.clear
end
at_exit do
browser.close
end
它大大提高了测试套件的运行速度。但我也需要一些来自自定义格式化程序的json文件中的统计信息,而无需运行测试:
cucumber -t @test -d -f Cucumber::Formatter::MyCustomFormatter > result.json
问题是cucumber使用-d
选项捕获错误
uninitialized constant Watir (NameError)
/home/user/work/repository/features/support/hooks.rb:7:in `<top (required)>'
/home/user/.rvm/gems/ruby-2.0.0-p247/gems/cucumber-1.3.5/lib/cucumber/rb_support/rb_language.rb:122:in `load'
/home/user/.rvm/gems/ruby-2.0.0-p247/gems/cucumber-1.3.5/lib/cucumber/rb_support/rb_language.rb:122:in `load_code_file'
/home/user/.rvm/gems/ruby-2.0.0-p247/gems/cucumber-1.3.5/lib/cucumber/runtime/support_code.rb:180:in `load_file'
/home/user/.rvm/gems/ruby-2.0.0-p247/gems/cucumber-1.3.5/lib/cucumber/runtime/support_code.rb:83:in `block in load_files!'
/home/user/.rvm/gems/ruby-2.0.0-p247/gems/cucumber-1.3.5/lib/cucumber/runtime/support_code.rb:82:in `each'
/home/user/.rvm/gems/ruby-2.0.0-p247/gems/cucumber-1.3.5/lib/cucumber/runtime/support_code.rb:82:in `load_files!'
/home/user/.rvm/gems/ruby-2.0.0-p247/gems/cucumber-1.3.5/lib/cucumber/runtime.rb:183:in `load_step_definitions'
/home/user/.rvm/gems/ruby-2.0.0-p247/gems/cucumber-1.3.5/lib/cucumber/runtime.rb:42:in `run!'
/home/user/.rvm/gems/ruby-2.0.0-p247/gems/cucumber-1.3.5/lib/cucumber/cli/main.rb:47:in `execute!'
/home/user/.rvm/gems/ruby-2.0.0-p247/gems/cucumber-1.3.5/bin/cucumber:13:in `<top (required)>'
/home/user/.rvm/gems/ruby-2.0.0-p247/bin/cucumber:23:in `load'
/home/user/.rvm/gems/ruby-2.0.0-p247/bin/cucumber:23:in `<main>'
/home/user/.rvm/gems/ruby-2.0.0-p247/bin/ruby_noexec_wrapper:14:in `eval'
/home/user/.rvm/gems/ruby-2.0.0-p247/bin/ruby_noexec_wrapper:14:in `<main>'
然后我尝试将Watir.new
方法移动到Before
块中:
Before do
if !$somevar
browser = Watir::Browser.new ENV['BROWSER'].to_sym
@browser = browser
$somevar = true
end
end
并在at_exit
块中获取错误:
/home/user/work/repository/features/support/hooks.rb:26:in `block in <top (required)>': undefined local variable or method `browser' for main:Object (NameError)
如果我把@browser.close
放在at_exit
里面,我得到:
/home/user/work/repository/features/support/hooks.rb:26:in `block in <top (required)>': undefined method `close' for nil:NilClass (NoMethodError)
有没有办法在测试套件中打开/关闭浏览器一次,并使其与cucumber的-d
选项一起工作?
问题是干运行(-d)无法加载support/env.rb文件。如果你使用cucumber -h
查看帮助,它会显示:
-d、 --干式运行在不执行步骤的情况下调用格式化程序。如果support/env.rb文件存在,这也会省略对该文件的加载。
由于您在env.rb中需要watir网络驱动程序,而env.rb没有加载,那么您的hook文件将不知道watir是什么。
一种解决方案是将require 'watir-webdriver'
(或require 'watir'
)添加到hooks.rb文件中。
另一种解决方案是将浏览器创建和at_exit挂钩移动到env.rb文件中。这样,当使用干式运行选项时,您将不会看到浏览器打开和关闭。