【Excel VBA×Selenium】NoSuchElementエラーの原因と対処法|要素が見つからない場合
みなさんこんにちは。
Excel VBAとSeleniumを使ってWebページを操作していると、XPathやCSSセレクターを指定しているのにNoSuchElementErrorが発生することがあります。
このエラーは、指定した要素をSeleniumが現在のページから見つけられないときに発生します。原因はセレクターの間違いだけではなく、読み込み待ちやiframeなどいくつか考えられます。
今回は、NoSuchElementエラーが発生したときに確認したいポイントを順番にご紹介したいと思います。
この記事はこんな人におすすめ
- FindElementByXPathで要素を取得できない人
- NoSuchElementErrorの原因を切り分けたい人
- 動的に表示される要素やiframe内の要素を操作したい人
NoSuchElementエラーが発生する例
例えば、ページ内に存在しないidを指定して要素を取得するとエラーになります。
Dim target As Selenium.WebElement
'存在しない要素を取得しようとするとエラーになる
Set target = driver.FindElementByXPath( _
"//button[@id='btnLogin']" _
)

まずセレクターが正しいか確認する
最初にChromeのデベロッパーツールで対象要素を確認し、XPathやCSSセレクターが現在のHTMLと一致しているか確認します。idやclassが画面表示のたびに変わるサイトもあるため注意してください。
idが動的に変わる場合は、固定部分を使ったXPathも検討できます。
Set target = driver.FindElementByXPath( _
"//button[contains(@id,'btnLogin')]" _
)
ページの読み込みを待ってから取得する
セレクターが正しくても、JavaScriptで後から表示される要素では、取得処理の方が先に実行されることがあります。SeleniumBasicではtimeoutを指定して一定時間待つことができます。
Dim target As Selenium.WebElement
'========================================
' 最大10秒間、対象要素が見つかるまで待つ
' raise=Falseで未取得時のエラーを抑える
'========================================
Set target = driver.FindElementByXPath( _
"//button[@id='btnLogin']", _
timeout:=10000, _
raise:=False _
)
If target Is Nothing Then
MsgBox "対象要素を取得できませんでした。"
Exit Sub
End If
target.Click

iframe内の要素か確認する
デベロッパーツールでは要素が見えているのに取得できない場合は、対象要素がiframe内にないか確認します。iframe内の場合は、先に操作対象を切り替える必要があります。
'iframeへ操作対象を切り替える
driver.SwitchToFrame "sampleFrame"
'iframe内の要素を取得する
Set target = driver.FindElementById("btnLogin")
画面更新後は要素を再取得する
検索や画面遷移によってHTMLが更新された場合は、更新後のページを対象にもう一度FindElementを実行します。操作する直前に現在のDOMから取得するようにすると、動的なページでも処理を整理しやすくなります。
'検索処理を実行する
driver.FindElementById("btnSearch").Click
'画面更新後の要素を改めて取得する
Set target = driver.FindElementByXPath( _
"//button[@id='btnLogin']", _
timeout:=10000, _
raise:=False _
)
NoSuchElement発生時の確認順序
- XPath・CSSセレクターが現在のHTMLと一致しているか
- 対象要素が表示されるまで待てているか
- 対象要素がiframe内に存在していないか
- 画面更新後のDOMから要素を取得し直しているか
最後に
いかがでしたでしょうか。
今回は、Excel VBA×SeleniumでNoSuchElementエラーが発生した場合の原因と対処法をご紹介しました。
要素が見つからない場合は、セレクターだけを何度も変更するのではなく、読み込み待ちやiframeなども順番に確認すると原因を切り分けやすくなります。
Seleniumで要素を取得できず困ったときに、少しでも参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
