【Selenium】要素を取得・発見できない場合はフレーム(iframe)を疑う【Python】

Pythonでブラウザを自動操作する際、非常に便利なのがSeleniumというライブラリである。そのSeleniumを使う際によく起きる問題が、「要素が見つからない」というものだ。その中でも特に初心者が陥りがちなのが、フレーム分割されたページの要素取得トラブルだ。ここではその解決方法を記載する。

筆者は以前、PythonとSeleniumを用いてRPA(Robotic Process Automation)を行う記事を執筆している。Seleniumの基礎を確認したい人は以下記事を確認してほしい。

Seleniumで要素が見つからないときの「no such element: Unable to locate element」エラー

Seleniumでdriver.find_element_by_を実行すると、「no such element: Unable to locate element」というエラーが出たとする。idは一意であるため、それだったらidで要素を取得しようと考えてdriver.find_element_by_idを実行するが、やはり「no such element: Unable to locate element」となる。「コードは間違いないはずなのに要素を取得できない」、という場合に疑うべきことが、フレームである。

フレーム分割されたページの要素取得方法~iframeを探す~

ウィンドウがフレームでいくつかのセクションに分割されているとき、デベロッパーツールを開いてHTML内に「iframe」というタグが使用されていないかを確認しよう。もし使用されていたら、それが問題の原因である可能性が高い。その際は以下のコードを実行する。

iframe = driver.find_element_by_css_selector("******")#iframeをCSSセレクタで特定
driver.switch_to.frame(iframe)#親フレームからiframeに移動

 
ここではCSSセレクタを用いているが、他のものでもかまわない。後は、これまで通りdriver.find_element_by_を行えば要素を取得できるはずだ。iframeから元の親フレームに戻るには以下のコードを実行しよう。

driver.switch_to_default_content()

 

それでもまだ要素を取得できないときの解決法

iframeに移動してもまだ要素を取得できないことがある。特に、ウィンドウが3つや4つに分割されているときに生じる可能性が高い。筆者はここでつまづいた経験がある。その際の解決方法は、「さらにもう一度フレームを移動する」だ。再度デベロッパーツールを開いてHTML内に「frame」というタグがないかを調べてほしい。該当のframeを発見できたらname属性を調べよう。ここで判明したframeの名前を仮に「framename」としよう。そうすれば、以下のコードで解決できる。

iframe = driver.find_element_by_css_selector("******")
driver.switch_to.frame(iframe)
driver.switch_to.frame("framename")

 
筆者は初めてこのエラーに遭遇したとき、解決するのに1時間ほどかかってしまった。この記事を読んだあなたの時間を節約できれば幸いである。この記事はここまでとなる。

また、SeleniumではなくPyAutoGuiを用いたRPAに関しては、以下の記事も参考にしてほしい。

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