【Python】Selenium:no such element: Unable to locate elementの解決(iframe要素取得)

2021.02.19 /

【Python】Selenium:no such element: Unable to locate elementの解決(iframe要素取得)

本記事ではPythonのSeleniumを使用したブラウザ自動操作中に発生する、no such element: Unable to locate elementエラーの原因と解決方法について解説していきます。

PythonのSeleniumモジュールは、ブラウザで行っている作業の自動化、データ収集の自動化で使用されています。

Seleniumによるブラウザ操作方法については以下記事で詳しく解説しています。

それではこのSeleniumでのブラウザ操作中に発生するエラーについて見ていきましょう。

本記事を通して以下の知識を学べます。

学べる知識
  • no such element: Unable to locate elementの原因
  • no such element: Unable to locate elementの解決方法
  • iframeについて

エラー内容

Seleniumでブラウザ操作をしていると次のエラーに遭遇することがあります。

NoSuchElementException: Message: no such element: Unable to locate element

このエラーは要素検索を行うfind_element_by_*メソッドを使用した際に発生します。

エラー内容を確認すると、エレメント(要素)が見つからないという内容です。
このエラーはfind_element_by_*メソッドで検索した要素がページ内に存在しない場合に表示されます。

エラー発生の原因を調査しよう

ページ内の要素確認

find_element_by_*メソッドで検索をしている要素がそもそも存在するのか確認しましょう。

確認方法は2つあります。

  1. デベロッパーツールで確認
  2. page_sourceで確認

デベロッパーツールはキーボードのF12を押すことで起動できます。
起動したデベロッパーツールには、表示しているページのソースコードが表示されます。

2つ目のpage_sourceは、次のようにWebDriverオブジェクトに対して使用することで、現在操作しているブラウザのページソースコードを取得できます。

driver.page_source

これらの方法を使用して要素の確認をしてみてください。

iframeが使われているか

もし対象のWebページ内でiframeが使われていれば注意が必要です。
私自身もiframeの罠にはまってしまったことがあります。

IT用語の確認

iframeとは、インラインフレーム要素である、HTMLファイルの中に別のHTMLを組み込むことができるタグです

iframeを使うことで、iframe内は別のウィンドウであると言えます。
そのためiframe内の要素はSeleniumで操作しているブラウザ(webdriver)とは異なるのです。

だからiframe内の要素をfind_element_by_*メソッドで検索しても、見つかりませんというエラーが発生したのです。

iframe内の要素を検索する方法

ここまでで、iframe内の要素はそのままではfind_element_by_*メソッドで検索できないことがわかりました。

iframe内の要素を検索するためには、操作対象のウィンドウをiframeに変更する必要があります。

現在の操作ウィンドウからiframeに変更するには、WebDriverオブジェクトに対してswitch_to.frame()メソッドを使用します。

driver.switch_to.frame(iframe)

これにより、ウィンドウをiframeに切り替えることができ、iframe内の要素を検索できます。

switch_to.frame()の引数iframeは、find_element_by_*メソッドで検索したiframe要素を指定しましょう。

iframe = driver.find_element_by_css_selector('〇〇〇')

driver.switch_to.frame(iframe)

元のページに戻りたい場合は、swich_to.default_content()メソッドを使用します。

driver.switch_to.default_content()

まとめ

本記事「Selenium:no such element: Unable to locate elementの解決(iframe要素取得)」はいかがでしたか。

初めてiframeを使用しているWebサイトをSeleniumで操作すると、ほぼ必ずこのエラーでみなさんハマります。

本記事で紹介している方法で、このエラーをすぐに回避していただければと思います。