Seleniumでiframeに気づかずハマる

seleniumでテストを書いているときに、フレームでソースが参照されていることに気づかず大ハマり!

XPathをコピペするだけではフレーム内の要素に辿り着けない罠にかかった結果、多くの時間を費やしました、、、seleniumでフレーム内の要素を操作する備忘録を下記に記載します。

スポンサーリンク

概要

下記のようなページ(http://holiday-programmer.net/test/selenium-frame/)があったとして、「入力テスト」のテキストボックスにseleniumでテストデータを入力したいとします。

ページ

メイン側のHTML

<!DOCTYPE html>
<html lang="ja">
  <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
    <h1>フレーム処理(メイン側)</h1>
    <iframe src="/test/selenium-frame/frame.html" width="100%" height="100%"></iframe>
  </body>
</html>

フレーム側のHTML

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body style="background-color:#7fffff">
    <h1>フレーム処理(フレーム側側)</h1>
    入力テスト:<input type="text" name="input-name" id="input-id">
  </body>
</html>

ハマりました。。。

ハマりポイント1(開発者ツールのソースを信じてはいけない)

通常Seleniumでは参照したい要素がソース上でどのように書かれているか、参照するためのとっかかり(nameやid属性の値)を確認するのですが、開発者ツールで表示されるソースを参考にしてもエラーします。

例えば下記のように、inputタグのname属性を指定しても、該当タグを見つけることができません。

driver.find_element_by_name("input-name").send_keys("test")

ハマりポイント2(開発者ツールのxpathを信じてはいけない)

開発者ツールのinputタグを右クリックし、「Copy > Copy full XPath」でXPathを取得したとします。

xpathはnameやid属性などのとっかかりがなかった場合に、HTMLの構造から指定する方法で、開発者ツールでタグに至る構造がコピペできることもあり非常に便利ですが、、、これもエラーします。

driver.find_element_by_xpath("/html/body/input").send_keys("test")

※これはフレーム側のXPathを取得していて、メイン側のXPathとは異なるため(フレームのXPathとして指定する必要がある)

解決、frameの気づきへ・・・

こんな時はソースにiframeが存在しないかを確認します。

iframeが存在し、かつiframe内のタグを操作したい場合は、selenium側で操作するフレームを下記のように変更する必要があります。

#フレーム操作に変更
driver.switch_to_frame(driver.find_element_by_tag_name("iframe"))
driver.find_element_by_name("input-name").send_keys("test")

#フレーム操作から戻る
driver.switch_to_default_content()

XPathコピーしているはずなのにおかしいなー、、というときはiframeを疑った方がいいかも。

「DeprecationWarning」って警告が出るので、将来的にはどうだろうっていうのはあります。

スポンサーリンク
おすすめの記事