質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

iframe

HTMLのタグ<iframe>です。<iframe>は、ドキュメント内に""inline frame""を作るHTML要素で、同じページでセパレートしているドキュメントが表示されるようにします。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

2回答

4282閲覧

vba seleniumでiframe内のElementを操作したい

t_matsumura

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

iframe

HTMLのタグ<iframe>です。<iframe>は、ドキュメント内に""inline frame""を作るHTML要素で、同じページでセパレートしているドキュメントが表示されるようにします。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2022/08/05 02:58

vbaとseleniumを使ってedge の自動化を行おうとしております。
iframeで開かれるページのElement取得がうまくいきません。

対象ページは下記のような構成になっており、①②③Elementを操作したいのですが、
「実行時エラー'7'
NoSuchElementError
Element not found for Css=#SyozokuCode」と表示されます。-④
iframeを切り替える必要があると思うのですが、いろいろ試しましたが、idが指定されていないiframeへの切り替え方がわかりません。方法を教えていただけないでしょうか。

html

1<iframe class="ui-helper-hidden" name="XW_BEAT" src "../x/lib/blankhtm" momo="・・・" cd_frame_id_="・・・">... 2</iframe> 345<iframe src "javascript:'' tabindex> 678<button id="output" clas="・・・">...</button> 91011<input class="txt SyozokuCode ・・・" id="SyozokuCode" size="・・・" title="・・・" type="text" maxlength="・・・" style="・・・"> 12<input type="checkbox id="chkKaiSyozoku" class="chkKaiSyozoku"> 131415</iframe>

以下、試したコードです。

vba

1 Dim driver As New Selenium.WebDriver 2 driver.Start "edge" 3 driver.Window.Maximize 4 driver.Get "http://・・・top.htm" 5 6 ' ログイン 7 driver.FindElementById("XW_LOGIN_USER").SendKeys "・・・" 8 driver.FindElementById("XW_LOGIN_PW").SendKeys "・・・" 9 driver.FindElementById("XW_LOGIN").Click 10 Sleep 3000 11 12 ' 月次処理 13 driver.FindElementByCss("#xw35").Click 14 Sleep 3000 15 16 ' 月次社員一覧 17 driver.FindElementByCss("#XW_TABS > ul > li:nth-child(4)").Click 18 ' Frameの切り替え これが動かないので以降の FindElementBy が Not Found になる!? 19 driver.SwitchToFrame driver.FindElementByTag("iframe") 20 ' 所属を入力 ここで上記エラーが発生 21④ driver.FindElementByCss("#SyozokuCode").SendKeys "109" 22

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_matsumura

2022/08/05 05:55

FindElementsByTag("iframe")(1) を試してみました。 「インデックスが境界の範囲外です」エラーが発生してしまいます。(0) にしても同様です。 .IsElementPresent(myBy.Tag("iframe")) も試したのですが False が返ってきました。 何か根本的な間違いをしているのでしょうか?
t_matsumura

2022/08/05 06:50

Dim bFlag As Boolean bFlag = False bFlag = driver.IsElementPresent(myBy.Tag("iframe")) bFlag = driver.IsElementPresent(myBy.Css("#xw72 > iframe")) bFlag = driver.IsElementPresent(myBy.XPath("//*[@id=""xw72""]/iframe")) 上記いずれもFalseが返ってきます。 どのようにすればiframeが取得できるのでしょうか?何か根本的なところに抜けがあるのでしょうか?
guest

回答2

0

FindElementByTag("iframe")

だと、iframeが複数あった場合にその1番目を使うと思いますが、それで目的と合ってますか?
HTMLを見たところ、1番目が目的じゃ無いように見えますが?

FindElementsByTag("iframe")(目的の添え字)では?

投稿2022/08/05 05:36

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_matsumura

2022/08/05 06:33

2番目のiframeがターゲットです。 FindElementsByTag("iframe")(1) を試してみました。 「インデックスが境界の範囲外です」エラーが発生してしまいます。(0) にしても同様です。 .IsElementPresent(myBy.Tag("iframe")) も試したのですが False が返ってきました。 何か根本的な間違いをしているのでしょうか?
otn

2022/08/05 09:11

質問文をそのまま読む限り、 > driver.SwitchToFrame driver.FindElementByTag("iframe") はエラーになってないと読めるのですが、合ってますか? > 「インデックスが境界の範囲外です」エラーが発生してしまいます。(0) にしても同様です。 は、FindElementsByTag("iframe")の結果の配列サイズがゼロと言うことで、FindElementByTag("iframe") がエラーにならないということと矛盾するので、どこかにあなたの勘違いがあると思われます。
guest

0

自己解決

下記のコードでフレームを入れ替えることで解決しました。
ありがとうございました。

VBA

1driver.SwitchToFrame driver.FindElementByCss("#xw72 > iframe")

投稿2022/08/08 02:17

t_matsumura

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2022/08/08 11:58

> FindElementsByTag("iframe")(1) を試してみました。 > 「インデックスが境界の範囲外です」エラーが発生してしまいます。(0) にしても同様です。 が間違いだったと言うことですね。やっぱり。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問