【Excel VBA×Selenium】iframe内の要素を取得・クリックする方法|SwitchToFrame
みなさんこんにちは。
Excel VBAとSeleniumを使用してWebスクレイピングをしていると、XPathやIDを正しく指定しているにもかかわらず、要素を取得できない場合があります。
その原因のひとつとして考えられるのが、操作したい要素がiframe内に存在しているケースです。
iframe内の要素を操作する場合は、通常のFindElementだけではなく、先にSeleniumの操作対象をiframeへ切り替える必要があります。
今回は、SwitchToFrameを使用してiframe内の要素を取得・クリックする方法についてご紹介したいと思います。
この記事はこんな人におすすめ
この記事はこんな人におすすめです!
- VBAプログラミング:初級者~中級者
- Excel VBA×SeleniumでWebスクレイピングをしている人
- XPathやIDが正しいのに要素を取得できない人
- iframe内のボタンや入力欄を操作したい人
といったところでしょうか。
Seleniumに関する過去の記事
Excel VBA×Seleniumを使用した要素の取得方法や、要素が表示されるまで待機する方法については過去の記事でもご紹介しておりますのでそちらもどうぞ。
iframeとは
iframeは、現在表示しているHTMLの中に別のHTMLページを埋め込むための仕組みです。
ブラウザ上では同じ画面に表示されていても、Seleniumから見るとiframeの外側と内側は別の操作対象となります。
そのため、iframeの外側にいる状態でiframe内の要素を取得しようとしても、要素が見つからないエラーになる場合があります。

iframe内の要素を操作する流れ
- iframe要素を取得する
- SwitchToFrameでiframeへ操作対象を切り替える
- iframe内の要素を取得・クリックする
- SwitchToDefaultContentで元のページへ戻る
SwitchToFrameを使用してiframeへ切り替える
SeleniumBasicでは、SwitchToFrameメソッドを使用して操作対象をiframeへ切り替えることができます。
Dim iframe As Selenium.WebElement
Set iframe = driver.FindElementById("sampleFrame")
driver.SwitchToFrame iframe

iframe内の要素を取得・クリックする
iframeへ切り替えた後は、通常の要素取得と同じようにFindElementByIdやFindElementByXPathを使用できます。
driver.SwitchToFrame driver.FindElementById("sampleFrame")
driver.FindElementById("submitButton").Click
XPathを使用する場合も同様です。
driver.SwitchToFrame driver.FindElementById("sampleFrame")
driver.FindElementByXPath("//button[@id='submitButton']").Click

元のページへ戻る方法
iframe内の操作が完了した後に、iframeの外側にある要素を操作する場合は、操作対象を元のページへ戻す必要があります。
driver.SwitchToDefaultContent
SwitchToDefaultContentを実行すると、iframeの外側にあるメインページへ操作対象が戻ります。
サンプルコード
Sub IframeClickSample()
Dim driver As New Selenium.WebDriver
Dim iframe As Selenium.WebElement
With driver
.Start "Chrome"
.Get "https://example.com"
Set iframe = .FindElementById("sampleFrame")
.SwitchToFrame iframe
.FindElementById("submitButton").Click
.SwitchToDefaultContent
.Quit
End With
End Sub
https://example.com、sampleFrame、submitButtonについては、実際に操作するWebサイトのURLや要素に合わせて変更してください。
実際にiframeへ切り替えて入力する例
Selenium公式のiframe確認用ページを使用する場合は、以下のように動作を確認することもできます。
Sub IframeTest()
Dim driver As New Selenium.WebDriver
Dim iframe As Selenium.WebElement
With driver
.Start "Chrome"
.Get "https://www.selenium.dev/selenium/web/iframes.html"
Set iframe = .FindElementById("iframe1")
.SwitchToFrame iframe
.FindElementById("email").SendKeys "test@example.com"
.SwitchToDefaultContent
Stop
.Quit
End With
End Sub
Selenium公式:Working with IFrames and frames
iframeは番号やnameでも指定できる
SeleniumBasicのSwitchToFrameでは、WebElement以外にもiframeの番号やnameを指定することができます。
driver.SwitchToFrame 0
番号は0から始まります。
driver.SwitchToFrame "sampleFrame"
ただし、Webページの構成変更によってiframeの順番が変わることもありますので、IDやXPathでiframe要素を取得してからSwitchToFrameへ渡す方法のほうが分かりやすいかと思います。
iframeが入れ子になっている場合
driver.SwitchToFrame driver.FindElementById("outerFrame")
driver.SwitchToFrame driver.FindElementById("innerFrame")
driver.FindElementById("submitButton").Click
driver.SwitchToParentFrame
driver.SwitchToDefaultContent
iframeが複数階層になっている場合は、現在Seleniumがどの階層を操作しているのかを意識することが重要です。
要素を取得できない時に確認するポイント
- 操作したい要素がiframe内に存在していないか
- SwitchToFrameを実行してから要素を取得しているか
- 操作後にSwitchToDefaultContentで元のページへ戻しているか
- iframe自体の読み込みが完了しているか
- iframeが複数階層になっていないか
XPathやIDが正しいのに要素を取得できない場合は、まずChromeのデベロッパーツールで対象要素の親にiframeが存在していないか確認すると原因を切り分けやすくなります。
最後に
いかがでしたでしょうか。
今回は、Excel VBA×Seleniumでiframe内の要素を取得・クリックする方法についてご紹介しました。
画面上では同じWebページに見えていても、iframe内の要素についてはSwitchToFrameを使用して操作対象を切り替える必要があります。
また、iframe内の操作が完了した後はSwitchToDefaultContentを使用して元のページへ戻すことも忘れないようにしてください。
少しでもご参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
