こんにちはアイダです。今回は Selenium にて Chrome を自動操作してみたMさんからの投稿です。実用的なTips が「使える!」と社内で沢山の方を唸らせました。ではMさんどうぞ!
Selenium の用途
Selenium といえば画面テストですが、大きく三つの用途があると考えます。
1.画面テスト
説明不要でしょう
2.スクレイピング
スクレイピングについては、HTTP ライブラリを利用するのが一般的かと思います 。しかし、SPA などの JavaScript が DOM を置き換える場合において意図した値を得ることが出来ません。こういったケースで Selenium が使えるはずです(が、業務利用はしていないので実体は分かりません)
3.作業の自動化
今回の本題です。といっても、Webアプリの画面操作を自動化するツールなので、Webアプリの画面操作を自動化できる、というだけです。Webアプリに限定されますが RPA っぽく使えます。
どれも「Webアプリの画面操作を自動化する」という点では共通です。
Selenium を RPA っぽく使ってみた感想
そもそもの経緯ですが、WinActor で自動化を試していたところ費用面が課題となり、Selenium の利用を検討することになりました。
※アイダ注:当社は WinActor を利用して積極的にRPA対応を実施しております。詳細は過去記事をご参照ください
結論から申し上げますと、問題無く自動化できました。課題となるのは、エラーハンドリングや画面要素の特定方法など、どちらのツールでも同様のものが多いです。
その上で、Selenium をRPAっぽく使ってみて私が感じたメリット・デメリットを簡単に。
メリット
1.無料
決め手です。
2.バックグランド実行が可能
この点も大きいです。WinActor は画面を占有し、PCを起動しての実行となります。
夜間は鍵付きロッカーに突っ込むなどの手段がありますが、顧客によってはセキュリティ上NGになる可能性もあり、バックグランド実行が出来るGUI不要の Selenium は魅力的でした。
ちなみに WinActor でもVMを利用して実現する方法があるみたいで、別部署で実施されているとのことです。
デメリット
1.プログラミングスキルが必要
ノンプログラマーでもシナリオ作成できることがRPA導入目的の一つであったため、コーディングが必要な点は大きなデメリットです。
2.自動化対象はWebアプリに限定される
Webアプリの画面操作を自動化するツールなので、その他のことはできません。
ただし、各言語で別途ライブラリにより補うことは可能です。いろいろ退屈なことをやってくれる言語もあるそうです。
比較結果
今回の要件では基本的にWebアプリが自動化対象のため、実現できることにほとんど差異は無く、コーディングの有無が大きな違いとなりました。
※一部CSVファイルの編集が必要でしたが、大抵の言語は対応できます。ちなみに、ファイル編集を画面操作で自動化すると実行時間がかかるため、 WinActor でも PowerShell でスクリプトを書いて実行するようにしていました。結局、書いてます。
RPAっぽく使う際に役立った技
★1 Chromeの自動更新を停止する
Webブラウザに Chrome を利用する場合に、chromedriver とのバージョンを一致させないと動作しません。
画面テストの用途で Selenium を使う場合には、失敗してもすぐに対応できるためそこまで問題無いのですが、自動化用途で夜間に日時処理を行う場合にはバージョン不一致による失敗は避けたいところです。
そこでChromeの自動更新を停止する方法を二つ紹介します。
1.Googleアップデータを使用する
手順は Google Chrome 公式サイトに書いてあります。
「chrome://settings/help」を見ると自動更新が無効化されていることが確認できます。
2.「GoogleUpdate.exe」をリネームする
「C:\Program Files (x86)\Google\Update」にあると思われる「GoogleUpdate.exe」を適当にリネームします。 無効化、というかエラーが発生して自動更新されません。非公式のパワープレイです。
そもそも更新を止めるとセキュリティリスクもあるため、自動バージョンアップのスクリプトを組むなど別の方法を検討した方が良いかもしれません。
★2 プロフィールパスを指定してchromedriver を起動する
Chromeのキャッシュやブックマークの情報は「chrome://version」に記載のプロフィールパスに保存されています。
chromedirver から Chrome を起動した際にはプロフィールパスが自動作成されるため、二つ立ち上げた場合でも異なるプロフィールパスが指定され、キャッシュが共有されることはありません。
プロフィールパスを指定してChromeを起動したい場合にはオプションを追加します。
プロフィールパスを指定してchromedriverを起動する
USER_DATA_DIR = r'C:\Users\XXXXXXXXXXXXXXX\AppData\Local\Google\Chrome\User Data' PROFILE_DIR = '--profile-directory=Default' options = webdriver.ChromeOptions() options.add_argument(f'--user-data-dir={USER_DATA_DIR}') options.add_argument(f'--profile-directory={PROFILE_DIR}') driver = webdriver.Chrome(options=options)
ログイン情報などのキャッシュが利用できるようになります。
★3 Headlessモードでファイルをダウンロードする
Headlessモードではデフォルトでファイルのダウンロードができない設定になっています。
ダウンロード設定方法は下記の通りです。※最低限の設定のため他のoptionが必要な場合もあります。
Headlessモードでファイルをダウンロードする
DOWNLOAD_PATH = r'C:\Users\XXXXXXXXXXXXXXX\Documents' options = webdriver.ChromeOptions() options.add_argument('--headless') driver = webdriver.Chrome(options=options) params = {'behavior': 'allow', 'downloadPath': DOWNLOAD_PATH} driver.execute_cdp_cmd('Page.setDownloadBehavior', params)
おわりに
Webアプリに対して Selenium を RPA っぽく使えた、という話でした。
メリットとしてRPAツールには(多分)無いクラスを活かしたアーキテクチャなどを挙げられれば良かったのですが、私自身上手くできませんでした。精進します。
WinActor に関して付け加えると、公式が心強かったです。
ユーザーフォーラム
https://winactor.com/questions/
プチライブラリ
https://winactor.biz/library/?search=
プチライブラリは本当に限定的なものがあったりと面白いです。逆のアプローチですが、ここを眺めていると使えそうな作業や業務を思いつくかもしれません。
長くなりましたが、お読みいただきありがとうございました。