2015-07-05 80 views
0

這是我的代碼中的錯誤,還是Selenium,RSpec等中的錯誤?Selenium chromedriver與at_exit不太好玩

我正在寫的黃瓜測試需要關閉並重新啓動Chrome驅動程序。但是,我無法讓第二個驅動程序正常關閉。下面的簡裝例子說明了問題:(下面的代碼是RSpec的,只是因爲它表明這個問題不添加黃瓜的複雜性)

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)機制按預期工作。黃瓜是否有相應的機制(at_exit,在這種情況下不起作用)?或者,有沒有辦法阻止chomedriver在at_exit區塊運行之前退出(所以我可以按照預期使用quit方法關閉它)?

我使用的是最新的硒和RSpec軟件包在Mac OS 10.9.5上運行的Ruby 2.0.0。

+0

代碼按照Safari和Firefox驅動程序的預期運行。在CentOS Linux中使用Chrome驅動程序運行此代碼時出現同樣的錯誤。 – Zack

回答

1

問題是我的代碼中存在一個錯誤。在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. env.rb
  6. at_exit掛鉤被
  7. 駕駛at_exit鉤叫

就我而言,我創建了一個司機黃瓜功能,這造成了env.rbat_exit鉤之後加以界定駕駛員at_exit鉤內。因此,驅動程序的at_exit掛鉤首先運行,致使env.rb中的$driver.quit調用失敗。

在這種情況下,最好的解決方案是在必要時創建第二個驅動程序,並在方案結束時銷燬第二個驅動程序(而不是用新驅動程序替換主驅動程序)。

感謝Alex Rodionov指出我的錯誤。 https://github.com/SeleniumHQ/selenium/issues/742