【问题标题】:How to restart browser after each test scenario如何在每个测试场景后重新启动浏览器
【发布时间】:2016-03-23 11:13:47
【问题描述】:

我正在使用 Cucumber 与 Capybara 和 Selenium-Webdriver 一起测试 Chrome 扩展。

我的测试很简单:

  @chrome_extension
    @javascript
      Scenario: Test1
      Given I open a browser
      And I close the browser
      When I do nothing
      Then nothing happens

其中步骤定义为:

require 'selenium-webdriver'

Given /^I open a browser$/ do
  visit 'http://google.com'
  STDERR.puts self
end

Given /^I close the browser$/ do
  page.driver.browser.quit
end

Given /^I do nothing$/ do

end

Given /^nothing happens$/ do

end

当我调用 page.driver.browser.quit 时,它会退出浏览器会话。但随后出现以下错误:

Connection refused - connect(2) (Errno::ECONNREFUSED)
      /Users/rui/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:644:in `initialize'
      /Users/rui/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:644:in `open'
      /Users/rui/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:644:in `block in connect'
      /Users/rui/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/timeout.rb:44:in `timeout'
      /Users/rui/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/timeout.rb:87:in `timeout'
      /Users/rui/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:644:in `connect'
      /Users/rui/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:637:in `do_start'
      /Users/rui/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:626:in `start'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/webmock-1.7.8/lib/webmock/http_lib_adapters/net_http.rb:90:in `request_with_webmock'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/selenium-webdriver-2.3.2/lib/selenium/webdriver/remote/http/default.rb:73:in `response_for'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/selenium-webdriver-2.3.2/lib/selenium/webdriver/remote/http/default.rb:41:in `request'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/selenium-webdriver-2.3.2/lib/selenium/webdriver/remote/http/common.rb:34:in `call'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/selenium-webdriver-2.3.2/lib/selenium/webdriver/remote/bridge.rb:406:in `raw_execute'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/selenium-webdriver-2.3.2/lib/selenium/webdriver/remote/bridge.rb:384:in `execute'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/selenium-webdriver-2.3.2/lib/selenium/webdriver/remote/bridge.rb:228:in `deleteAllCookies'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/selenium-webdriver-2.3.2/lib/selenium/webdriver/common/options.rb:67:in `delete_all_cookies'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/capybara-1.1.2/lib/capybara/selenium/driver.rb:81:in `reset!'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/capybara-1.1.2/lib/capybara/session.rb:70:in `reset!'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/capybara-1.1.2/lib/capybara/dsl.rb:87:in `block in reset_sessions!'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/capybara-1.1.2/lib/capybara/dsl.rb:87:in `each'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/capybara-1.1.2/lib/capybara/dsl.rb:87:in `reset_sessions!'
      /Users/rui/.rvm/gems/ruby-1.9.2-p180@yesware/gems/capybara-1.1.2/lib/capybara/cucumber.rb:10:in `After'

在每种情况下重新启动浏览器的正确方法是什么?我需要每个测试都尽可能无状态。

提前致谢!

【问题讨论】:

  • 我在下面添加了一个答案。关键是,当你设置它时,你只需要确保你的 @After 钩子每次都彻底破坏 WebDriver 驱动程序。

标签: selenium cucumber capybara


【解决方案1】:

使用与 selenium 非常相似的 Watir-webdriver。

您可以使用钩子来做到这一点。对钩子进行一些研究以获得更好的理解,但是在项目的支持目录中,您需要创建一个钩子文件。我正在使用 ruby​​ 和 ruby​​mine 来运行我的测试,因此在您的环境中可能会有所不同。

你的钩子文件可能看起来像这样。

require 'watir-webdriver'



Before do
  @browser = Watir::Browser.new :chrome
end


After do
  @browser.close
end

然后,在每个场景运行之前,它会打开一个浏览器实例,并在场景完成后关闭浏览器。

【讨论】:

    【解决方案2】:

    在 After 挂钩中清除 cookie 并刷新浏览器。例如,我在 Watir-Webdriver 中使用这个

    After do |scenario|
      browser.cookies.clear
      browser.refresh
    end
    

    【讨论】:

      【解决方案3】:

      可能有一种更优雅的方式来做到这一点,但我会考虑将每个场景都放在自己的 rake 任务中,并在 cucumber 中使用标签,如下所示:

      desc "Run scenario 1"
      task :scenario_1 do
       cmd = "cucumber --tags @1"
       `#{cmd}`
      end`
      

      这样做将完全实现您所追求的,因为 Cucumber 使用 --tags 参数开箱即用地支持这一点。

      【讨论】:

        【解决方案4】:

        已删除 java 示例。

        Capybara 试图通过预测您想要做什么来节省您的工作量。 Capybara 在每一步之后都会关闭会话。如果您明确关闭浏览器会话,那么当水豚尝试清除 cookie 时,就没有要清除的会话了。

        如果你不想让水豚处理这些事情,那就不用水豚自己做。

        【讨论】:

        • 您可以在我的 GitHub 页面here 上查看更多详细信息。
        • 从他的错误信息来看,他正在使用 Ruby。在这种情况下,不确定 Java 实现是否会对他有所帮助。
        猜你喜欢
        • 2018-03-13
        • 1970-01-01
        • 1970-01-01
        • 2012-12-15
        • 2020-05-10
        • 2018-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多