Chromeの安定最新バージョンに合わせてChrome Driverの最新バージョンを取得する方法
事業開発部の高野です。事業開発部では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=(チャンネル)
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ファイルにこの処理を追加して問題を解決しました。
最後に
我々事業開発部では、こういった日々の小さな問題を始め、ともに悩みプロダクトを成長させてくれるメンバーを募集しています。
募集中のポジションは下記のとおりです。ご興味があればぜひご一報をお願いします!
- prismatix事業の急拡大に伴い、バックエンドエンジニアを募集します! - クラスメソッド株式会社のエンジニアリングの求人 - Wantedly
- 認証認可という最重要基盤の開発を通じてコアスキルを磨きたいエンジニア募集! - クラスメソッド株式会社のエンジニアリングの求人 - Wantedly
- 自社サービスECプラットフォームの運用・改善を行う、インフラエンジニア募集 - クラスメソッド株式会社のインフラエンジニアの求人 - Wantedly
- 自社サービスのソリューションアーキテクトとして活躍したい方、募集中です! - クラスメソッド株式会社のエンジニアリングの求人 - Wantedly
- 自社プロダクトの導入支援し、顧客に価値を届けたい!システムエンジニア募集! - クラスメソッド株式会社のエンジニアリングの求人 - Wantedly
- 最高のアウトプットを出す開発チームのプロジェクトマネージャーを募集中! - クラスメソッド株式会社のWebエンジニアの求人 - Wantedly