Techioz Blog

Ruby/Rails および Selenium のリモート構成

概要

そこで、Docker 経由で Selenium/standalone-chrome をネットワーク内のマシンにデプロイし、ポート 4444 を 4444 にマッピングしました。

http://192.168.0.40:4444 でブラウザ経由でアクセスできます。

以下のコードを使用して Ruby/Rails アプリケーションでセットアップしようとすると、次のエラーが発生します。

Net::ReadTimeout: Net::ReadTimeout with #<TCPSocket:(closed)>
from /Users/thomas/.rbenv/versions/3.2.1/lib/ruby/3.2.0/net/protocol.rb:229:in `rbuf_fill'

Selenium Grid Webインターフェイスを確認すると、「セッション」が作成されていることがわかります…

これを機能させるには何をする必要があるのかわかりません。 Selenium のドキュメントは少しわかりにくいと思います…

Selenium を動作させるコード:

options = Selenium::WebDriver::Chrome::Options.new
# I found all of these on various websites - adding them all does not change the problem.
# options.add_argument('--headless')
# options.add_argument('--no-sandbox')
# options.add_argument('--disable-dev-shm-usage')
# options.add_argument('--remote-debugging-port=9222')
driver = Selenium::WebDriver.for :remote, url: 'http://192.168.0.40:4444', options:

ヒントやアドバイスをいただければ幸いです。

解決策

このエラーは、アプリケーションがネットワーク ソケットから読み取ろうとしているときにタイムアウトが発生する可能性があることを示唆しています。Selenium Docker コンテナーに接続するときは、次のように必要な機能を指定する必要があることがよくあります。

caps = Selenium::WebDriver::Remote::Capabilities.chrome
driver = Selenium::WebDriver.for(:remote, url: 'http://192.168.0.40:4444/wd/hub', desired_capabilities: caps, options: options)

これにより、テストを実行するブラウザとバージョンがグリッドに通知されます。エンドポイントは /wd/hub であることに注意してください。

上記が機能しない場合は、アプリケーションが接続する時間を増やすためにタイムアウトを増やす必要がある場合があります。

client = Selenium::WebDriver::Remote::Http::Default.new
client.read_timeout = 120 # seconds
driver = Selenium::WebDriver.for(:remote, url: 'http://192.168.0.40:4444/wd/hub', http_client: client, desired_capabilities: caps, options: options)

docker ログをまだ確認していない場合は、それも確認する必要があります。

docker logs <container_id_or_name>

そして、ネットワーク/ファイアウォールは常にチェックする価値があります。

curl http://192.168.0.40:4444/wd/hub/status

これにより、Selenium サーバーのステータスを含む JSON 応答が返されるはずです。お役に立てれば!