ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

Selenium 3 から 4 にしたら system spec が Net::ReadTimeout で通らなくなったときの対処

Railsrspec でのE2Eテスト(system spec)用に Selenium を使っているのですが、
バージョンが Selenium 3.141.59-20210929 だったので、
「ぼちぼち上げるか〜」と最新の 4.10.0-20230607 にバージョンアップしようとしました。

selenium/standalone-chrome:3.141.59-20210929
selenium/standalone-chrome:114.0-20230614 に書き換え、
ローカル環境では system spec が数ファイル通ったので、大丈夫そうだなと push しました。

ところが、CircleCI での rspec ジョブがいっこうに終わりません。
ふだん5分くらいで終わるのに、30分くらい経っても終わりません。

そして

Net::ReadTimeout:
  Net::ReadTimeout with #<TCPSocket:(closed)>

で落ちるテストが・・・。

調査

CircleCI はコンテナに SSH ログインできるので、その機能で試しました。

1ファイルだけ system spec を回してみるも、
テストがなかなか終わらず最終的に Net::ReadTimeout が出てしまいました。

……が、しばらくすると突然テストが通るようになりました。

「もしや、CircleCI でのテスト中は専有されていたけどそれが開放された?」と気付き、
いろいろ調査していった過程で、

circleci:~/project$ curl http://selenium:4444/status
{
  "value": {
    "ready": false,
    "message": "Selenium Grid not ready.",
    "nodes": [
      {
        "id": "39f5d00b-a8cb-4ece-ada8-ff8ada82d162",
        "uri": "http:\u002f\u002f192.168.240.4:4444",
        "maxSessions": 1,

となっていることに気付きました。

CI でのテストは test-queue を使って並列処理しているので、
maxSessions が 1 なら、それはたしかに、
セッションが取り合いになってテストが全然進まなそうです。

解決

調査を踏まえ、maxSessions の数を増やす方法がありそうだなと調べたら、
https://github.com/SeleniumHQ/docker-selenium#increasing-session-concurrency-per-container
に記載がありました。

By default, only one session is configured to run per container through the SE_NODE_MAX_SESSIONS environment variable. It is possible to increase that number up to the maximum available processors, this is because more stability is achieved when one container/browser has 1 CPU to run.

環境変数 SE_NODE_MAX_SESSIONS を設定すれば、
セッション数の最大を 1 から増やせそうです。

というわけで、CircleCI の vCPU数TEST_QUEUE_WORKERS の数を参照しつつ、
SE_NODE_MAX_SESSIONS を設定しました。

これでようやく解決しました。

解決までに4時間くらいはかかったと思います。
どなたかの助けになれば幸いです。