Seleniumの処理でエラーが出てから、chromeのwebdriverが更新されていることに気がついてファイルを置き換える、というのを何度も繰り返してウンザリしていたので自動化することにしました。
という、まさに自分もやりたかったことをbashスクリプトで実現されている記事を見かけたので、Windows環境下でも手軽に使えるようにC#で実装した。
実装したコード
プログラム内部で用いる一部の変数を、外部ファイル(JSONファイル)から読み込めるようにした。JSONファイルの読み取りには、neuecc氏作のDynamicJsonライブラリを利用。
とりあえずgistで公開。
変更点
基本的にオリジナルのbashスクリプトと、1:1で対応するように似せて書いた。(差異を把握しやすいように)
以下の点については変更した。
- プログラム内部で用いる一部の変数を、外部ファイル(JSONファイル)から読み込めるように
- ZIPファイルの展開(解凍)方法を変えた
- chromedriverの実行ファイルのみを取り出すように
- アーカイブフォルダに、chromedriverの実行ファイルを直接配置するように(旧バージョンをフォルダ分けして保存しない)
- シンボリックリンクは作成しないように
また以下の点を改良している。
- アーカイブフォルダにChromeDriverがない場合、最新版をダウンロードするように
- メジャーバージョン、マイナーバージョンが2桁以上の場合でもバージョン情報を正しく取得できるように
- ZIPファイル展開時の例外処理の実装
社内での利用例
Seleniumを利用したプログラムを、社内で不特定多数に配布している。
ChromeDriverを利用者のPCごとに定期的にアップデートする仕様は保守性を考えて避けたかったため、
社内のファイルサーバ(ネットワークドライブ)上にChromeDriverを配置し、利用者に配布するプログラムは当該ネットワークドライブ上のChromeDriverを用いてChromeを操作する仕様にしている。(※ ChromeDriverのコンストラクタの引数で、利用するChromeDriver実行ファイルのディレクトリを指定できる。)
ファイルサーバ上で、タスクスケジューラに今回作成したChromeDriverUpdatorを登録することで、利用者が呼び出すChromeDriverを最新状態に保つことができる。
この構成だと
- ChromeDriver.exeを配置する場所を一箇所にできる
- 利用者のPCで、アップデート作業が必要ない
- 利用者のPCで、PATHを通すなどの管理者権限の必要な作業が発生しない
のがメリット。