tag:crieit.net,2005:https://crieit.net/tags/selenium-webdriver/feed 「selenium-webdriver」の記事 - Crieit Crieitでタグ「selenium-webdriver」に投稿された最近の記事 2023-07-31T23:48:38+09:00 https://crieit.net/tags/selenium-webdriver/feed tag:crieit.net,2005:PublicArticle/18545 2023-07-29T23:01:28+09:00 2023-07-31T23:48:38+09:00 https://crieit.net/posts/fix-chromedriver-v115-distribution-change 【Ruby/Selenium】v115からChromeDriverの配布元が変わったようなので対応した話 <p>こんにちは、しきゆらです。<br /> 数年ごとに時たま書いているSeleniumネタ、 今回は久々に大きく動かなくなったので調べつつ対応した記録を残しておきます。</p> <h2 id="webdriversが動かなくなった"><a href="#webdrivers%E3%81%8C%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F">webdriversが動かなくなった</a></h2> <p>これまでは<code>webdrivers</code>というgemを使い、インストールされているChromeのバージョンにあったChromeDriver良しなに取得するようにしていました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/titusfortner/webdrivers">GitHub - titusfortner/webdrivers: Keep your Selenium WebDrivers updated automatically</a></p> <p>さっくり<code>webdrivers</code>の中身を見てみましたが、インストールしているChromeのバージョンを確認し、必要なDriverがなければ以下のサイトから該当バージョンのものを取得・配置するようです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://chromedriver.storage.googleapis.com/"></a></p> <p>「https://chromedriver.storage.googleapis.com/LATEST_RELEASE_114」のようにChromeのバージョン値を指定するとその最新版となるChromeDriverのバージョンを取得できるので、これをもとに取得する感じでした。</p> <p>ところが、先日Seleniumを動かしたらChromeDriverがない、とエラーが出て動かなくなっていました。<br /> 何事かと思って調べてみました。</p> <h3 id="ChromeDriverの配布先が変わった"><a href="#ChromeDriver%E3%81%AE%E9%85%8D%E5%B8%83%E5%85%88%E3%81%8C%E5%A4%89%E3%82%8F%E3%81%A3%E3%81%9F">ChromeDriverの配布先が変わった</a></h3> <p>ChromeDriverのサイトを見てみると、配布先が変更されたようです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://chromedriver.chromium.org/downloads">ChromeDriver - WebDriver for Chrome - Downloads</a></p> <blockquote> <p><strong>Latest ChromeDriver Binaries</strong></p> <ul> <li>Starting with M115 the latest Chrome + ChromeDriver releases per release channel (Stable, Beta, Dev, Canary) are available at <a target="_blank" rel="nofollow noopener" href="https://googlechromelabs.github.io/chrome-for-testing/">the Chrome for Testing availability dashboard</a>. For automated version downloading one can use the convenient <a target="_blank" rel="nofollow noopener" href="https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json">JSON endpoints</a>.</li> <li>The older releases can be found at the <a target="_blank" rel="nofollow noopener" href="https://chromedriver.chromium.org/downloads">Downloads</a> page.</li> </ul> </blockquote> <p>ということで<code>webdrivers</code>が参照していたサイトとは別のところで配布するようになったようです。</p> <p>ついでに調べていると、Chrome for Testingなるものが出てきました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://developer.chrome.com/blog/chrome-for-testing/">Chrome for Testing: reliable downloads for browser automation - Chrome Developers</a></p> <p>以前も何かのタイミングでちらっと見た気がするんですが、あまり詳しく見てはいなかったので今回読んでみました。</p> <p>どうやら、Chromeは自動更新なので開発者はテストをするタイミングによって意図しないバージョンになっていたりしてつらい、そうだテスト用に自動更新がないChromeを作ろう、ということのようです。</p> <p>ということでテスト用Chromeとそのバージョン向けのChromeDriverが以下のサイトで一緒に配布されるようになっていました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://googlechromelabs.github.io/chrome-for-testing/#stable">Chrome for Testing availability</a></p> <p>自前でChromeDriverを取得するスクリプトを組んでいる場合は、この辺の対応が必要になりそう。</p> <h2 id="対応方法"><a href="#%E5%AF%BE%E5%BF%9C%E6%96%B9%E6%B3%95">対応方法</a></h2> <h3 id="暫定対応"><a href="#%E6%9A%AB%E5%AE%9A%E5%AF%BE%E5%BF%9C">暫定対応</a></h3> <p><code>webdrivers</code>でも対応するPRが上がってますが、記載時点(2023/07/29)ではまだマージされてません。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/titusfortner/webdrivers/pull/249">Fixed Webdrivers::VersionError with chrome version greater than 115 by sadahiro-ono · Pull Request #249 · titusfortner/webdrivers</a></p> <p>こちらのissueで対応方法が記載されていました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/titusfortner/webdrivers/issues/247">Webdrivers trying to load a Chrome version that doesn't exist · Issue #247 · titusfortner/webdrivers</a></p> <p>現在はv114向けのChromeDriverでも動くようなので、コード内でChromeDriverのバージョンを決め打ちすることでその場しのぎをすることができます。<br /> ただ、これもこのバージョンで動作しなくなるのは時間の問題なのでいつまで使えるかは不明です。</p> <pre><code class="ruby">Webdrivers::Chromedriver.required_version = "114.0.5735.90" </code></pre> <h3 id="Selenium Manager"><a href="#Selenium+Manager">Selenium Manager</a></h3> <p>issueを見ていくと、Selenium Managerなるものが出てきました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.selenium.dev/documentation/selenium_manager/">Selenium Manager (Beta)</a></p> <p>まだBetaのようですが、Selenium自体に含まれる各WebDriverの取得などをしてくれるツールのようです。</p> <p>これまでは、手動で配布サイトから取得したり上記<code>webdrivers</code>のような別ツールでWebDriverを取得して使う必要がありましたが、Selenium Managerを使えば外部ツールを使わずにSeleniumだけで完結するようになりますね。</p> <p>使い方も、以下の3点を満たしていれば勝手に動いてくれるようです。</p> <ul> <li><code>Service</code>クラスでWebDriverのパスを指定していない</li> <li><code>webdrivers</code>のような外部のWebDriver管理ツールを使っていない</li> <li>環境変数<code>PATH</code>の中にWebDriverがない</li> </ul> <p>ということで、<code>webdrivers</code>が動かないのでこっちを使ってみることにしました。</p> <p>ここでは、タイトルの通りRuby環境である前提で記載しますが<br /> <code>selenium-webdriver</code>のgemを最新にしたうえで、上記3点を満たすように環境を整えるだけで勝手に使えるようになります。</p> <p>なお、<code>selenium-webdriver</code>のCHANGELOGを見てみると、4.6.0のころからSelenium Managerへ対応が入っているようです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES"></a></p> <p>手元では、<code>webdrivers</code>のみしか使っていないのでこれを削除するだけで利用できました。</p> <p><code>webdrivers</code>がない状態でSeleniumを使ってブラウザを立ち上げようとするとターミナル上に以下のように記載されてChromeが立ち上がるようになりました。</p> <pre><code class="ruby">2023-07-29 20:53:08 WARN Selenium applicable driver not found; attempting to install with Selenium Manager </code></pre> <p>Selenium Managerが良しなに動いてくれているようです。</p> <p>これで、対応はおしまいです。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>今回はSeleniumを使っていたらChromeDriverを取得できずに死んでしまったので、原因を調べつつ対応してみました。</p> <p>結果としては、外部ツールに頼ることなくSeleniumが擁してくれているSelenium Managerを使うことで無事動くようになりました。</p> <p>今回は、ここまで。</p> <p>おわり</p> しきゆら