【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内の要素を取得しようとしても、要素が見つからないエラーになる場合があります。

Chromeのデベロッパーツールでidがiframe1のiframe要素を確認した画面

iframe内の要素を操作する流れ

  1. iframe要素を取得する
  2. SwitchToFrameでiframeへ操作対象を切り替える
  3. iframe内の要素を取得・クリックする
  4. SwitchToDefaultContentで元のページへ戻る

SwitchToFrameを使用してiframeへ切り替える

SeleniumBasicでは、SwitchToFrameメソッドを使用して操作対象をiframeへ切り替えることができます。

Dim iframe As Selenium.WebElement

Set iframe = driver.FindElementById("sampleFrame")

driver.SwitchToFrame iframe
Excel VBA Seleniumでiframe要素を取得してSwitchToFrameを実行するコード画面

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
Excel VBA Seleniumでiframe内のemail入力欄へtest@example.comを入力した画面

元のページへ戻る方法

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.comsampleFramesubmitButtonについては、実際に操作する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アプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA