お疲れ様です。すぺきよです。
仕事でSeleniumを使ってテストデータの登録作業を自動化しています。ちょこちょこ動いて次々に画面からデータ登録してくれるSeleniumは本当にかわいいです。
ほかにもデータ登録で苦労としているメンバーがいたので、プロジェクトを共有して使ってもらおうとお渡しすると、以下のメッセージが出てWebDriverの自動ダウンロードに失敗していました。
Error: Unable to obtain browser driver.
For more information on how to install drivers see
https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location/. Error: Error executing command for C:/(path to)/selenium-manager.exe with --browser,firefox,--language-binding,javascript,--output,json: error sending request for url (https://github.com/mozilla/geckodriver/releases/latest)
見た感じネットワークの制限なのかselenium-manager.exeが失敗を返してしまっているようですね。
仕方がないので自前でWebDriverをダウンロードして使えるように改造しようとすると、使い方を忘れていて、これが意外と手間がかかったので、今後の自分のために、サンプルコードを残しておきます。
ここしばらく、ずっとWebDriverの自動ダウンロードに頼ってきた弊害ですね。
今回はタイトルにある通りfirefoxが対象です。
エラーが出て繋がらなかった件について、後で話を聞くと、「Firewallの設定が厳しくて接続に失敗していたようだ」とのことだったので、許可されたアプリ以外はネットワークの疎通ができない設定が原因で上のエラーが出ていたようですね。
環境
OS
Windows 11
Node.js
v21.7.3
Selenium
4.21.0
Gecodriver
v0.34
事前準備
あらかじめ、以下のURLにアクセスして、最新のGecodriverを手動でダウンロードします。
https://github.com/mozilla/geckodriver/releases/latest
この時、自分の環境(アーキテクチャ)に合ったドライバーをダウンロードしなければなりません。
自動ダウンロードであれば、このあたりも自動的に判別してくれるんですけどね。
自分の環境(アーキテクチャ)の調べ方は、「Windows アーキテクチャ 確認」などで調べてください。
Macの場合は新しいものは大体apple siliconだと思いますので、aarch64になるのではないでしょうか。念のため、調べ方はGoogle先生に聞いてください。
実装コード
実装コードは以下のような感じです。
let webdriver = require('selenium-webdriver');
let firefox = require('selenium-webdriver/firefox');
main();
return;
async function main()
{
const webDriver = await buildFireFoxDriver();
await webDriver.get("https://www.google.com/")
}
async function buildFireFoxDriver()
{
const firefox_driver_path = "./driver/geckodriver-v0.34.0-win64/geckodriver.exe";
return await new webdriver.Builder()
.forBrowser(webdriver.Browser.FIREFOX)
.setFirefoxService(new firefox.ServiceBuilder(firefox_driver_path))
.build();
}
seleniumとfirefoxがインストールされていれば、firefoxが起動してgoogleのページが開くはずです。
もし、まだseleniumをインストールしていない場合は、以下のコマンドでnpmを使ってインストールしましょう。
npm i selenium-webdriver
さいごに
最初にネットワーク周りの設定が問題であることに気づいていれば、今回の実装は不要だったのかもしれませんが、今後、同じように外部ネットワークに繋ぐことができない環境が出てくるかもしれません。
またこんな状況になったときに慌てないように備忘録として残しておきます。
でも、無事にプロジェクトが使えるようになってほっとしています。
コメント