この記事は、Excel+SeleniumBasic+GoogleChromeでスクライピングしている方に向けた記事です。
#結論:.IsElementPresentを用いればよい。
SeleniumのChromeDriverに用意されている「.IsElementPresent」メソッドは、
現在のウェブページ上に任意の要素が存在するか否かズバリをBoolean型で返す。
if driver.IsElementPresent(myBy.ID("hogehoge")) Then
###経緯
IsElementPresentを私が知る以前は、ページの要素の存在のチェックはFindElementsBy云々で
取得したオブジェクトの要素数をチェックすればいいと思った。しかし、
if driver.FindElementsById("任意のID").Count > 0 Then
と記述したら「NoSuchElement……以下略」が表示されVBAマクロが中断されてしまった。
つまり「そんな要素ないんだけど?」というエラーがSeleniumから返ってきてVBAの処理が止まってしまうらしい。
そこでエラーを無視せず正攻法でウェブページの要素の存在判定する方法を探すことにした。
VBAオブジェクトブラウザを探っているとIsElementPresentというそれっぽいメソッドを見つけた。
説明文に
Inicates whether a WebElement is present using the given method.
=「指定されたメソッドを使用してWebElementが存在するかどうかを示します。(Google翻訳)」とあった
###.IsElementPresentの使い方
driver.IsElementPresent(by As By)
「たぶんこんな風だろう」と予想して、とりあえず試してみる。
Sub test()
Dim driver As New ChromeDriver
Dim myBy As New By
URL = "https://www.google.com/?hl=ja"
driver.Get URL
MsgBox driver.IsElementPresent(myBy.ID("hogehoge"))
End Sub
上記コードを実行すると「NoSuchElement……以下略」エラーポップアップすることなく"False"のメッセージを表示した(=正常終了)。
つまり、要素の存在判定は下記コードで実装すれば良い。
if driver.IsElementPresent(myBy.ID("hogehoge")) Then
ところで、引数の By クラスとは、Seleniumに搭載されたクラスである。
ByのインスタンスmyByを作ってmyByの中の「.id」メソッドを使って抽出用のタグやキーワードを指定する仕組みだ。
###Byクラスのメソッドたち
Byクラスは
Provides a mechanism by which to find elements within a document.
=「ドキュメント内の要素を検索するメカニズムを提供します。(Google翻訳)」というオブジェクトである。
このByクラス、「.id」のほか
・.Xpath
・.Class
・.Css
・.Tag
・.linktext
・.partiiallinktext
・.Any
・.name
などがある。
今後これらを必要に応じて試してみたい。
「IsElementPresent」の記事は以上です。