これは私のコードのバグですか、それとも Selenium や RSpec などのバグですか?
私が書いている Cucumber テストでは、Chrome ドライバーをシャットダウンして再起動する必要があります。ただし、この 2 番目のドライバーを適切にシャットダウンすることはできません。以下の簡略化された例は、問題を示しています: (以下のコードは、Cucumber の複雑さを追加せずに問題を示しているため、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'
ブロックが実行されると、2 番目の chromedriver プロセスが実行されなくなっていることがわかりますat_exit
。これは、シャットダウンの原因となっているメカニズムが何であれ、Chrome ウィンドウを開いたままにするため、問題を引き起こします。
RSpec のafter(:suite)
メカニズムは期待どおりに機能します。Cucumber に対応するメカニズムはありますか (この場合は機能しない 以外at_exit
)? または、ブロックが実行される前に chomedriver が終了しないようにする方法はありますか (そのため、期待どおりにメソッドをat_exit
使用してシャットダウンできます)。quit
最新の Selenium および rspec パッケージを使用して、Mac OS 10.9.5 で Ruby 2.0.0 を実行しています。