ちょっと話題の記事

Chromeの安定最新バージョンに合わせてChrome Driverの最新バージョンを取得する方法

事業開発部ではEC/CRMのWebAPIプラットフォーム prismatix の開発の中で、Web UIを使った自動化テストに Chrome Driver を使用しています。この Chrome Driver は最新バージョンを使うようにしていたのですが、年に数回ほど Chrome のメジャーアップのタイミングで、 Chrome の安定最新バージョンとの食い違いで動作しなくなることがありました。このエントリでは、この問題にどのように対応したか紹介します。
2021.04.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

事業開発部の高野です。事業開発部ではEC/CRMのWebAPIプラットフォームprismatixの開発の中で、Web UIを使った自動化テストにChrome Driverを使用しています。このChrome Driverは最新バージョンを使うようにしていたのですが、年に数回ほどChromeのメジャーアップのタイミングで、Chromeの安定最新バージョンとの食い違いで動作しなくなることがありました。

このエントリでは、この問題にどのように対応したか紹介します。

TL;DR

  • https://omahaproxy.appspot.com/ からChromeの最新安定バージョンを取得
  • 取得したChromeの最新安定バージョンからメジャーバージョンを切り出し
  • ChromeDriverのメジャーバージョンにChromeのメジャーバージョンを指定して最新バージョンを取得する

発生した問題

まず、どのような問題が発生したのかについて、かんたんに説明します。

prismatixはEC/CRMに必要な各種の機能を「マイクロサービス」として提供しています。このあたりの詳しい話については、弊部の塩谷の下記エントリをご覧ください。

クラスメソッドの自社開発EC/CRMプラットフォーム「prismatix」のご紹介 | DevelopersIO

これらのマイクロサービスの中に、クレジットカードなどの決済を扱うための「決済サービス」があります。この決済サービスは、ベリトランスStripeといった外部の決済サービスへのやり取りを汎用化して扱うためのAPIを持っています。そして、その処理の中で外部決済サービスを使って決済を行う際、本人確認のため決済代行会社のサイトでの操作が必要です。このあたりの詳しい話は、弊部の野村の下記エントリをご覧ください。

EC サイトの決済(与信)処理を非同期的に実施する場合の処理フローについて紹介 | DevelopersIO

このUI操作を自動化テストの中で実現するために、ヘッドレスブラウザとしてのChromeと、その操作を行うChrome Driverを用いています。

さて、このChrome Driverですが、Chrome本体とは微妙にバージョンアップのタイミングが異なるようで、例えば2021/4/14時点での「Chromeの安定最新バージョン」と「Chrome Driverの最新バージョン」は下記のようになっていました。

  • Chrome: 89.0.4389.128
  • Chrome Driver: 90.0.4430.24

この状態で自動化テストを実行すると、Chrome Driverの最新バージョンがChromeの安定最新バージョンに対応していないため、下記のようなエラーが発生してしまいます。

org.openqa.selenium.SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 90
Current browser version is 89.0.4389.128 with binary path /usr/bin/google-chrome
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: '42328681aeb9', ip: '172.26.0.3', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-1092-aws', java.version: '1.8.0_282'
Driver info: driver.version: ChromeDriver

原因は何か

Chrome Driverの最新バージョン番号は、Chrome Driverの開発チームが提供している、下記のAPIを使って取得していました。

Version Selection - ChromeDriver - WebDriver for Chrome

In addition, the version of ChromeDriver for the current stable release of Chrome can be found at https://chromedriver.storage.googleapis.com/LATEST_RELEASE.

しかし、すでに述べたようにこのAPIではまれにChromeの安定最新バージョンに対応していないバージョンが取得されることがあります。そのため、「Chromeの最新安定バージョン」に合わせて、Chrome Driverのバージョン番号を取得する方法を考えなければなりません。

解決方法

上記のChrome Driverのバージョン取得APIですが、下記のように「メジャーバージョン」を指定して取得することができます。

https://chromedriver.storage.googleapis.com/LATEST_RELEASE_(メジャーバージョン番号)
  • First, construct a LATEST_RELEASE URL using Chrome's major version number. For example, with Chrome version 73.0.3683.86, use URL "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_73". Try to download a small file from this URL. If it successful, the file contains the ChromeDriver version to use.

よって、何らかの手段でChromeの最新安定バージョンが取得できれば、これを利用して対応したChrome Driverの最新バージョンが取得できることになります。

そのために必要なChromeの最新安定バージョンを取得するには、Chromiumのチームがメンテナンスしている、下記のAPIを使用します。

https://omahaproxy.appspot.com/(OS)?channel=(チャンネル)

OmahaProxy - Google Chrome

This application is supported by the Chromium team, as a tool to track current releases and release history.

例えば、Linuxの安定版の最新バージョンを取得するには、下記のURLにアクセスします。

https://omahaproxy.appspot.com/linux?channel=stable

これで問題を解決するための材料は揃いました。後はこれらを組み合わせてやるだけです。

最終的に、次のようなshスクリプトが完成しました。

# Chromeの安定最新バージョンを取得
CHROME_LATEST_VERSION=$(curl -sS "omahaproxy.appspot.com/linux?channel=stable")
echo "CHROME_LATEST_VERSION: ${CHROME_LATEST_VERSION}"

# Chromeの安定最新バージョンからメジャーバージョンを切り出す
CHROME_LATEST_MAJOR_VERSION=$(echo $CHROME_LATEST_VERSION | cut -d . -f 1)
echo "CHROME_LATEST_MAJOR_VERSION: ${CHROME_LATEST_MAJOR_VERSION}"

# Chromeの安定最新メジャーバージョンに合わせてChrome Driverの最新バージョンを取得
CHROME_DRIVER_VERSION=$(curl -sS "chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_LATEST_MAJOR_VERSION}")
echo "CHROME_DRIVER_VERSION: ${CHROME_DRIVER_VERSION}"

このスクリプトを問題が発生した2021/4/14に実行すると、下記のような結果が出力されした。

CHROME_LATEST_VERSION: 89.0.4389.128
CHROME_LATEST_MAJOR_VERSION: 89
CHROME_DRIVER_VERSION: 89.0.4389.23

あとは、これらの変数をChrome Driverのバージョンを指定するところで使用するだけです。我々のチームでは、テスト用に使用しているDockerイメージのDockerファイルにこの処理を追加して問題を解決しました。

Chromeの最新メジャーバージョンを元にChromeDriverの最新バージョンを取得するよう修正する by masaru-b-cl · Pull Request #16 · prismatix-jp/openjdk-with-git

最後に

我々事業開発部では、こういった日々の小さな問題を始め、ともに悩みプロダクトを成長させてくれるメンバーを募集しています。

募集中のポジションは下記のとおりです。ご興味があればぜひご一報をお願いします!