[Selenium] iframe 内の要素を指定する

2018年9月6日ITpython, Selenium

iframe 内の要素はそのまま指定しても要素がないといわれるので、driver の向き先を切り替えてやる必要があります。

HTML クイックリファレンスさんの iframe の説明をサンプルに使わせていただきました。

XPATH、セレクターの指定の仕方についてはこちら→
参考:[Selenium] Google Chrome を使って、簡単にXPATH、セレクターを調べる

driver を切り替えないと、、

test.py

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

# ブラウザを開く。
driver = webdriver.Chrome()
# HTMLクイック・リファレンスさんのホームページを開く
driver.get("http://www.htmq.com/html5/iframe.shtml")
# 「ヒント 未来からやってきたネコ型ロボットという設定でした。」 というテキストを取りたい
# XPATH は「/html/body/p」
text_hint = driver.find_element_by_xpath("/html/body/p").text
print text_hint

sleep(10)
# ブラウザを閉じる
driver.close()

実行結果

python test.py
File "test.py", line 13, in 
  text_hint = driver.find_element_by_xpath("/html/body/p").text
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 387, in find_element_by_xpath
  return self.find_element(by=By.XPATH, value=xpath)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 957, in find_element
  'value': value})['value']
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 314, in execute
  self.error_handler.check_response(response)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
  raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/p"}

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:

要素がないと言われました。

driver を切り替えると、、、

test.py

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

# ブラウザを開く。
driver = webdriver.Chrome()
# HTMLクイック・リファレンスさんのホームページを開く
driver.get("http://www.htmq.com/html5/iframe.shtml")
# iframe の XPATH 「//*[@id='content_left']/div[10]/iframe」 を指定
iframe = driver.find_element_by_xpath("//*[@id='content_left']/div[10]/iframe")
# driver を切り替える
driver.switch_to_frame(iframe)
# 「ヒント 未来からやってきたネコ型ロボットという設定でした。」 というテキストを取りたい
text_hint = driver.find_element_by_xpath("/html/body/p").text
print text_hint

sleep(10)
# ブラウザを閉じる
driver.close()

実行結果

python test.py
ヒント
未来からやってきたネコ型ロボットという設定でした。

テキストが取れました!

ひとこと

知ってればなんてことないのですが、id、クラス、XPATH、CSS セレクターといろいろ試してもなかなか取れず、「あれっ、おかしいな〜」と、思ってたら、要素が iframe 内にあったことが原因でした。知らなかったら、ハマりますね。

スポンサーリンク

Posted by nobuhiro harada