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に関しては、以下の記事も参考にしてほしい。