見出し画像

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本体の外に出してから、グダグダになってそうな気がします。どうしたもんか。。調査中。。

この記事が気に入ったらサポートをしてみませんか?