非表示にできる< 目次 >
Seleniumのロード待ちとは?
EXCEL-VBAでSeleniumを使用する際に、
ブラウザ制御が速度が速すぎるせいで 自動化に安定性が出なかったりします。
ということで、Seleniumの動作を安定させるためにChromeのロード待ちをする方法を 本記事では紹介します。
正直 簡単です。
本記事でできること
本記事で紹介するコードでは、以下のことができます。
本記事で出来ること
EXCEL-VBAで Selenium利用時に Webサイトのロード待ちをすることができる。
※本記事ではChromeブラウザを前提に説明
ロード待ちしたい箇所に、ロード待ちのFunctionコードをバンバン打ち込んでいく感じです。
使用例も記載してますので併せて読んでおきましょう。
間違った記事に注意
Selenium自体に ブラウザのロード待ち機能を搭載しているWeb記事上では多く見受けられますが、
それはコア言語(PythonやJavaScript)に限ります。
つまり、VBAにおけるSelenium利用の場合、動作を安定させるためには、
自分でロード待ちのコーディングをしてあげる必要があります。
※一応 Selenium固有の読込完了待ちのコードはありますが、VBAの場合、動作が全然安定しない。
紹介コードのユースケース
ユースケースは、主に3点かな、と。
ユースケース-3例
- Selenium制御が早すぎて、ブラウザが読込完了する前に動作をしてしまう(動作安定性確保)
- Selenium制御が早すぎるのか、そもそものコードがNGなのか切り分けができない(課題明瞭化)
- Selenium固有の読込完了メソッドを信じられない(動作安定性確保)
Seleniumの動作を安定させるために、いろいろと試行錯誤をしてフラストレーションが溜まっていたため、ついつい書いてしまいたくなります。笑
紹介コード使用時の注意点
本記事で紹介する独自コードは、「私のPCでは期待通りに挙動しているコード」となります。
よって、あなたのPC環境では もしかしたら期待した動きをしない可能性があります。
ですので、この辺を考慮した上で、紹介するコードをご利用ください。
筆者のSelenium動作環境
- OS :Microsoft Windows 10 Pro
- CPU:IntelCore i7-9750H CPU
- メモリ:16GB
- EXCEL :EXCEL 2019 32bit
見るべきポイントは、OSとEXCELバージョンのみかなと。
言い方を変えれば、OSとEXCELバージョンが合致していれば問題なく動作するコードですので、
期待通りの動きをしない場合は、その他に問題があるとも言えます。
自力解決能力が高い人が集まっていることを信じています。笑
コードの紹介(※コピペでOK)★
EXCEL側のVBAコード上(Sub~EndSub内)で、以下のコードをコピペしてください。
念のために記載しますが、Chromeのロード待ちする箇所に コピペしてくださいね。
◆コピペ対象コード
1 2 3 4 5 6 7 8 9 10 11 |
'変数宣言(これは Sub~EndSub内の冒頭に宣言しといて) Dim FWFlag As Boolean ’判定用に使用 Dim driver As New Selenium.WebDrive 'Seleniumをdriverで制御している前提の意味 Dim myBy As New By 'ByクラスはSelenium独自搭載のクラスで要素検索に必要な偉いやつ。 '期待する要素があるか確認(ロード待ち) FWFlag = False Do FWFlag = driver.IsElementPresent(myBy. XPath(" [HTML-XPath要素] ")) '本コードだけでもいけそうですが、安定しないため、後述の wait1000で1秒待つ設定を入れています。 driver.Wait 1000 Loop Until FWFlag = True |
コード内の [HTML-XPath要素] については、都度 書き換えていく形です。
XPathの読込ができたら 変数FWFlagがTrueになり、Do~Loopから抜ける形です。
変数FWFlagがFalseだった場合は、driver.Wait 1000で1秒を待つを繰り返して、対象のXPathが出現するまで待つ構成となります。
コードの使用方法★
本記事ご覧の方は、VBA有識者のため、省略気味で説明しますね。(というか Sub~EndSubで書きます。)
使い方は、以下のイメージ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub selenium_sample() Dim driver As New Selenium.WebDriver Dim FWFlag As Boolean Dim myBy As New By driver.Start "chrome" driver.Get "https://www.yahoo.co.jp/" FWFlag = False Do FWFlag = driver.IsElementPresent(myBy.XPath("//*[@id=""ContentWrapper""]/header/section[1]/div/form/fieldset/span/input")) 'XPathは検索ボックスを選択しました。 driver.Wait 1000 Loop Until FWFlag = True '↑FWFlagがTrue = 対象XPathがあると Loopから抜ける仕様 Stop 'Yahooが開かれているか確認していましょう。 End Sub |
慣れてしまえば、ササっとできてしまうと思います。
Chromeでロード待ちが発生する箇所に、都度 XPathを書き換えて使用しましょう。
注意点:XPathコピペ時の注意
XPathをそのままVBE側にコピペすると、VBA側の入力ルール上 NGになります。
以下は一例ですが、
”(ダブルクォーテーション)がXPath内に記載がある場合は、
”(ダブルクォーテーション)を追記してあげましょう。
元XPath://*[@id="ContentWrapper"]/header/section[1]/div/form/fieldset/span/input
↓
正しい例://*[@id=""ContentWrapper""]/header/section[1]/div/form/fieldset/span/input
余談:IsElementPresentメソッドだけではだめなの?
勘のいい人でしたら、
それをIf文にすれば良いのでは?
と思う人がいるかと思います。
例えば、こんな感じ。
例文
If driver.IsElementPresent(myBy. XPath(" [HTML-XPath要素] ")) then
~Trueだった場合の処理コードを記載~
End if
僕も最初は、この形式で大丈夫と思っていました。
ですが、安定しなかったためやめました。笑
理由は分かりません。笑
一応 仮説を立てると、Seleniumが早すぎて処理としてVBA側が追い付いて無いんじゃなね?と自分に言い聞かせる形で諦めました。
オススメの参考本+終わりに
今回はここまでとなります。
ここまでご覧いただきありがとうございました。
本記事が皆様のVBAライフを良い感じで充実させるものになっているのであれば、記事作成冥利につきます。
もう少しSeleniumに関する有用性の高いWeb記事が増えたら嬉しいな。。。
ちょっとだけ宣伝ですが、僕がSeleniumを利用する際に参考にしている本を紹介しておきます。
注意:この本自体には「VBAにおけるSeleniumの使用方法」は記載しておりません。
紹介した本自体に「VBA×Selenium」のコーディング情報は載っていません。
主に コア言語である「Java」「JavaScript」「Python」「Ruby」等のSeleniumの使用方法が記載されているのですが、筆者は、PythonページからVBAに読み替える際に使用しています。
ちなみに、本記事で紹介しているコーディングは この本で紹介されているコードをVBAに読み替え+修正して 使用しています。
この本を取っかかりに自作コードを組んだりすると早くコーディングが出来ますので かなり助かっています。
というか、こんなんだから VBAのSelenium利用者が増えないんじゃないのかな・・・。笑
他にも Seleniumに関する情報や、VBAに関する記事も本ブログでは紹介しておりますので、
もしよろしければ ご覧になってください。
ちょっとだけ宣伝
ですので、読みにくかったりしたらすみませんorz (こんな最後尾に言うのは反則ですが。)
ちなみに、自分の記事ですが、ブックマーク登録してたりします。笑
コピペして利用できる記事は ブックマークしておくと 良いですよー。
無料ですし、向いて無かったら消せばいいだけですので。
さて、ここまでの長文をお読みいただきありがとうございました
今後もNakamuraBlog(ナカログ)をよろしくお願いいたします。
おわり。