見出し画像

【SeleniumVBA】Webサイトの読み込み待ちについて

■Wait・・・

SeleniumVBAなどでWebスクレイピングをしていると、VBAの処理がブラウザより早すぎて指定のタグが見つけられずエラーになることがあります。

それを解消するために、SleepやWaitタイムで待ち時間を付加して処理が止まらないようにすることがあると思います。
ただ、思った以上にWebからの応答に時間がかかりすぎる場合は同様に処理が止まってしまうことがあります。
こういったことを無くし安定的にスクレイピングできるようにするためには、きちんと目当ての要素が表示されるまで待つ必要があります。

■Webページの要素の存在有無判定
driver.IsPresent(by.CssSelector,”●●●”))
driver.IsPresent(by.XPath,”●●●”))
driver.IsPresent(by.ID,”●●●”))
判定結果はTrue or Falseです

flagA = Flase
do  
  flagA = driver.IsPresent(by.ID,”●●●”))
  driver.wait 200
loop Until flagA=True

この判定結果がTrueになるまでDo~Loopでループして操作を待つようにします。

自分が作成したもので、過去に表示したHTMLタグがそのまま残っていて、以前のタグを検索してTrueを返してきたことがありました。
実際には表示されておらず、そのタグは無効状態になっていたため「IsEnabled」や「IsDisplay]などの状態判定メソッドを使って回避してました。

また、指定した要素がある一定の数を超えるまで待ちたい場合は、IsPresentでTrueになるまで待ち、さらにその要素をカウントさせ、指定した値に達するまで待たせることができます。
例えば、、、

do  
  set  objtag = driver.FindElementsByClass("aaa")  
  driver.wait 200
loop Until objtag.count > 10

上記は必要な要素が10より大きくなるまで待ちます。
これだと、タイムアウトを付加しないと無限ループになるので注意です。

こういった処理をサブルーチン化して、Callで呼び出すようにしておけば楽々です。


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