Proxy環境でのGeckoDriverの使い方 ~FirefoxでSelenium、Windows10編~@2021/6/22
どうも~~!
Seleniumってますか~?皆さん!
今日は、久々にSeleniumをFirefoxで動かしてやるぞ!ってなことで、GeckoDriverでございます。
FirefoxでSeleniumやるメリット
Firefoxで動かすメリットってなんかあるの?って思われるかもしれません。ウェブのユーザーはChromeのほうが圧倒的に多いですからね。確かに結合テストに使うんだったら、Chromeは外せませんね。
Firefoxのいい所は、FirefoxESRがあるということです。延長サポート版です。これを使うと、Chromeみたいに勝手にバージョンが上がったりしません。マイナーバージョンアップしかしません。セキュリティパッチのみってことです。(それも停止したければ可能でもあります。停止しませんけど。。)だから、勝手に挙動が変わったりとかそういうのは極めて起きにくくなります。
(あ、Chromiumはセキュリティパッチも当たらなくなるし、社内インフラの監視システムにも出所不明のアプリってことで警告されるので、アカンとです。)
というわけで、Chromeでやってて、ある日突然動かなくなって、他の作業中に急に呼び出されて原因を考えたりとか、何が原因なのかの切り分けが難しくなったりだとか(バージョンが上がったからって即断できればラクですが、それが難しいって話)、そういうのを回避しやすくするためにはFirefoxってことです。特に結合テストとかじゃなくて、何かしらの自動化ツールとして使ってるだけなら、Chromeにこだわる必要ないですからね。動けばいいだけですから。
ブラウザのバージョンアップ対応は、FirefoxESRの新しいやつが出てから、自分のスケジュールがちょうど良い時にやればOKです。これ、超マイペース!
昔話
さて、なんですが、昔は、GeckoDriverって無かったですよね。Firefoxでは、WebDriverはFirefox本体に付属してて、考えなくて良かったです。確か。だから、Firefox本体とのバージョンごとの相性問題を考えなくてよくてラク、っていうのがFirefoxを使うメリットの一つでもありました。
今日の本題
で、Proxy環境で、
npm install geckodriver
しようとすると、エラーになりますよね。
RequestError: connect ETIMEDOUT
とかなんとか言うやつです。
npmに
npm -g config set proxy http://proxy:port
npm -g config set https-proxy http://proxy:port
はもちろんやってるとして、
set HTTPS_PROXY=http://proxy:port
set HTTP_PROXY=http://proxy:port
npm config set strict-ssl false
export NODE_TLS_REJECT_UNAUTHORIZED=0
とか、検索でヒットしたものを色々やっても結局ダメでした。あ、管理者権限でコマンドプロンプトを起動しないといけないというのもあります。でも、それだけでもダメです。
GeckoDriver が依存してるモジュールがproxyに対応してないとかいう話を見かけたような。だから、npmでgeckodriver.exeを入れるのは諦めました。
解決策
set GECKODRIVER_SKIP_DOWNLOAD=true
した上で、
npm install geckodriver
すると、exe以外のものは普通に入るので、exeはGitHubから自分で取って来ました。こちらです。
https://github.com/mozilla/geckodriver/releases
npmとのバージョンの対応関係はここに載ってます。
https://www.npmjs.com/package/geckodriver
まぁ、特に目新しい話ではなくて、npmとかが普及する前の時代は、ChromeDriverとかIEDriverとか、こういう取り方してましたからね。それに戻るだけです。
で、次に、geckodriver.exeのありかをSeleniumに教えないといけないわけですが、そのやり方として、
1. geckodriver.exeをWindowsのコンパネのシステムからPATH環境変数に追加する
2. setFirefoxServiceを使う
の2つがあるようですが、2.番はSelenium4.0.0以降かな。3.6.0でsetFirefoxServiceを使おうとしたらundefinedでしたから。。でも、まだ、4.0.0β4。。4.0.0への移行作業は後で別にやりたいので、まずは3.6.0でやるとして、結局、PATH通すんですけど、Windowsに直接登録するのは環境が汚れるし、他の場所で構築する際に忘れてハマりやすくて、避けたいので、私の場合、VSCode使ってるんで、settings.jsonに以下を追加しました。
"terminal.integrated.env.windows": {
"PATH": "${workspaceRoot}/bin/geckodriver-v0.29.1-win64;${env:PATH}"
}
※env:PATHは半角。なぜか全角だとnoteの保存の失敗する。
exeはプロジェクトの直下のbinの下に置いてるってことです。
一方、VSCodeではなく、バッチとかで実行するなら、先に
set PATH=/path_to/bin/geckodriver-v0.29.1-win64;%PATH%
みたいにしておく感じですね。
それと、VSCodeのデバッグでも、GeckoDriverを使うのであれば、launch.jsonの必要な各タスクにこれも入りますね。
"env": {
"PATH": "${workspaceRoot}/bin/geckodriver-v0.29.1-win64;${env:PATH}"
}
解決策2
driverのexeのダウンロード、ちゃんとnpm installで一緒にできる方法ありました。こちらに最新記事をご用意してあります。
おまけ
ちなみに、これはおまけですが、
GECKODRIVER_SKIP_DOWNLOADではなく、GECKODRIVER_FILEPATHを使う方法なら、
以下のようにフルパスで指定する必要があります。
set GECKODRIVER_FILEPATH=C:/Users/user/略/my-project/bin/geckodriver-v0.29.1-win64/geckodriver-v0.29.1-win64.zip
それと、指定するのはzipになります。
Windowsの場合は「/」ではなく「¥」でも行けますね。
以上を指定して、
npm install geckodriver
すると、以下の位置に入ります。
C:/Users/user/略/my-project/node_modules/geckodriver/geckodriver.exe
ただ、この方法だと、結局、node_modules/geckodriver にPATHを通さないといけないので、あまりメリットを感じません。それやるんだったら、最初からbinの下にPATH通すほうが、シンプルな気がします。というわけで、GECKODRIVER_FILEPATHを使うのはやめました。
そう言えば
MarionetteDriverってなんだっけ。。っていうのを思い出しました。ここ数年、おれ様がSeleniumから抜けてる間に登場したやつだという認識です。GeckoDriverに関係あるらしいことは知ってます。また、なんか分かったら書きますね。
以上ッ!!
追記
GeckoDriverの動作確認してたんですが、結構、魔窟ですね。とりあえず、selenium-webdriver 3.6.0で対応するのはやめました。3系での情報が少ないです。すぐ出て来るのは4系の情報ばかりです。探すのが面倒になりました。動けばなんでもいいので、まずは、Chromeで4.0.0β4に対応して、その後、Firefoxにも対応します。というか、Chromeで3.6.0⇒4.0.0β4の対応は速攻で済みました。1時間くらいです。driver.manage().xxx()あたりのメソッドがちょっと変わってたとか、それくらいでした。それで、Firefox対応に即戻ったわけですが、Chromeで簡単にできる所で引っかかってる感じです。昔のFirefoxは簡単だったんだけど。。GeckoDriverとか言って、Firefox本体の外に出してから、グダグダになってそうな気がします。どうしたもんか。。調査中。。