0

这是我的代码中的错误,还是 Selenium、RSpec 等中的错误?

我正在编写的 Cucumber 测试需要关闭并重新启动 Chrome 驱动程序。但是,我无法让第二个驱动程序正确关闭。下面的精简示例显示了这个问题:(下面的代码是 RSpec 只是因为它演示了这个问题而没有增加 Cucumber 的复杂性。)

require 'selenium-webdriver'

RSpec.configure do |config|
       config.before(:suite) do
           $driver = Selenium::WebDriver.for :chrome
         end
     end

describe "A potential rspec/selenium/chrome driver bug" do 
  it "doesn't play nice with at_exit" do    
    # quit the initial driver and start a new one.
    $driver.quit
    $driver = Selenium::WebDriver.for :chrome    
  end # it
end # end describe

at_exit do
  $driver.quit
end

当我运行此代码时,我收到以下错误:

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/net/http.rb:878:in `initialize': Connection refused - connect(2) (Errno::ECONNREFUSED)
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/net/http.rb:878:in `open'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/net/http.rb:878:in `block in connect'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/timeout.rb:52:in `timeout'

at_exit我可以说,当块运行时,第二个 chromedriver 进程不再运行。这会导致问题,因为导致关闭的任何机制都会使 Chrome 窗口保持打开状态。

RSpec 的after(:suite)机制按预期工作。Cucumber 是否有相应的机制(除了at_exit,在这种情况下不起作用)?或者,有没有办法阻止 chomedriver 在at_exit块运行之前退出(所以我可以使用预期的方法将其关闭quit)?

我正在使用最新的 selenium 和 rspec 包在 Mac OS 10.9.5 上运行 Ruby 2.0.0。

4

1 回答 1

2

问题是我的代码中的一个错误。env.rb在定义自己的at_exit钩子之前需要创建驱动程序。原因如下:

一个典型env.rb的黄瓜看起来像这样:

$driver = Selenium::WebDriver.for :chrome, :switches => %w[--disable-cache --ignore-certificate-errors]

at_exit do
  $driver.quit
end

创建驱动程序对象 ( Selenium::WebDriver.for :chrome) 的代码还注册了一个at_exit关闭chromedriver进程的钩子。

at_exit钩子以与它们创建时相反的顺序运行。因此,黄瓜的典型执行如下所示:

  1. env.rb创建一个新的驱动程序
  2. 驱动程序定义at_exit钩子以退出自身
  3. env.rb定义at_exit退出驱动程序的钩子
  4. 黄瓜功能运行
  5. at_exit钩子来自env.rb被称为
  6. 驱动程序的at_exit钩子被称为

在我的例子中,我在黄瓜功能中创建了一个驱动程序,这导致驱动程序的at_exit钩子at_exitenv.rb. 结果,驱动程序的at_exit钩子首先运行,导致对$driver.quitin的调用env.rb失败。

在这种情况下,最好的解决方案是在必要时创建第二个驱动程序,并在场景结束时销毁第二个驱动程序(而不是用新的驱动程序替换主驱动程序)。

感谢 Alex Rodionov 指出我的错误。 https://github.com/SeleniumHQ/selenium/issues/742

于 2015-07-07T19:35:03.420 回答