selenium エラーと原因
selemiumを使っていてエラーの原因が分かりづらいと思った。エラーが起きている位置とその原因の確認方法と、自分が起こしたミスで重要だと思ったものはメモしていく。
エラー発生位置とその原因の確認方法
実行中のコードの結果 ---------エラー発生------------------------------------ Traceback(most recent call last): ↑エラー発生の目印 File "hogehogehoge", エラーの起きた行 その行に書かれたコード File "hogehogehoge", エラーの起きた行 その行に書かれたコード File "hogehogehoge", エラーの起きた行 その行に書かれたコード エラーの原因
ミスと原因
driver.find_element_by_id("hoge")でエラー
この場合エラーが起きるのは、idのタイプミス(自分の場合はコピペするので可能性は低い)かjavascriptによるページの読み込みがなされている場合がある。iframeタグがあるか確認し、iframe内に当該idが存在しているか確かめること。
iframe内の要素をfind_element...でエラー
iframe内の要素を時間を取らずに取得しようとすると、javascriptのページの読み込みが完了しないまま実行する可能性がある。その場合には、
from time import sleep sleep(5)
とかしておけばエラーが解消できることがある。
click()でエラー
click()を含むコードでエラーが生じ、そのメッセージが以下の通りならそもそもclick()を使わない方法を行うも手だ。
案1
Message: element not interactableこれで試してみる。
from selenium.webdriver.common.keys import Keys
WebElement.send_keys(Keys.RETURN)
案2
クリックできないの仕様ならリンク先を取得し、そのリンク先に飛ぶ。
href = driver.find_element_by_id("hoge").get_attribute("href")
driver.get(href)
この方法はhref="javascript"の場合には利用できない可能性がある。
find_element_tag_name()系で要素を取得できない
seleniumで要素を取得したいときある角度から要素が取得できないとき別の角度から取得を試みることは有効である。自分の場合は困ったときは下が役に立った。
driver.find_elements_by_link_text()
By Link Text や By Partial Link Text
send_keysのコードでエラー発生
send_keysの引数のデータ型が100.25
のようなfloatの場合、エラーが発生するようだ。エラー内容はlen()とか出てくるが引数が問題である。引数はstrでなければならない。
select でエラー発生
ドロップダウンリストから一つの項目を選ぶ、ということをしたい。以下のようなエラーが出た。
raise NoSuchElementException("Cannot locate option with value: %s" % value) NoSuchElementException: Message: Cannot locate option with value: 125467527
今回はselect_by_valueやselect_by_visible_textで選択を試みたも上記のエラーが出てしまった。引数に変数を入れた状態にしていたが、変数.strip()で解決した。どうやら変数にスペースなどが紛れ込んでいたらしい。
参考https://github.com/SeleniumHQ/selenium/issues/2050