PythonでSeleniumを使っていたときに発生した例外とその対処について


概要

seleniumを使用した中で発生した問題と対処法をまとめていきます。今後追記するかもしれません。
pythonで使用したケースとなります。
以前の記事を作成中や仕事でやっていた時の問題と対処を記載しています。
seleniumOperationBase.py を参照していただければ対処例がわかります。
いろいろと至らないところもあるかもしれますが・・・

TimeoutException

たぶん一番多く見ることになります。
原因としては

  • 画面描画前にクリックなどをしようとしてしまった。
  • そもそも要素の指定を誤っている

が考えられます。
要素の指定のほうは画面を改めて確認するしかないのですが、描画前にクリックしてしまう場合は

        driver=webdriver.Chrome('C:/webdrivers/chromedriver.exe')
        # 画面描画の待ち時間
        wait=WebDriverWait(self.driver,20)
        driver.implicitly_wait(30)

と事前に設定をしておいて

        wait.until(expected_conditions.element_to_be_clickable((By.XPATH,webElement)))
        driver.find_element_by_xpath(webElement).click()

要素が表示されるまで待つようにすれば time.sleep などで固定の秒数を待たせたりしないですみます。

  • 以下のような disabled-content-overlay が出た場合
selenium.common.exceptions.ElementClickInterceptedException: Message: Element <button class="btn btn-sm submit-btn menu-btn extra-btn " type="button"> is not clickable at point (875,551) because another element <div class="disabled-content-overlay"> obscures it

画面のボタンをクリックすることで表示されるメニューをクリックしたいときに
要素が重なっている場合に発生します。
画面によってはお目にかかることはないですが発生したときは困りました・・・
以下のようにjavascriptでクリック処理を行えば対応できました。

            target = driver.find_element_by_xpath(webElement)
            driver.execute_script("arguments[0].click();", target)

StaleElementReferenceException

waitを入れていてもアプリの状況によって画面が描画される前に
クリックした扱いになって発生する例外です。

        except StaleElementReferenceException:
            # 画面描画前に押下してしまったときの対応
            time.sleep(1)
            driver.find_element_by_xpath(webElement).click()

と発生したときはちょっと待機を明示的に入れて押下してみました。

MoveTargetOutOfBoundsException

クリック後マウスを動かす処理を ActionChains で実施しているときに
画面の範囲外の場合失敗するのでその時は以下のようにスクロール処理をいれました。
この例外をキャッチして動かす方法と事前に動く方法があります。
事前に画面の位置を動かしても失敗することがあるので画面の位置を動かしてから失敗したら例外をキャッチして動くようにしています

            inputLabel=driver.find_element_by_xpath(webElement)
            driver.execute_script("arguments[0].scrollIntoView();", inputLabel)

javascript error: arguments[0].scrollIntoView is not a functionとエラーが出てしまう場合は以下の方法でも対応できます。
ただし公式ドキュメントでは予告なしで変わるかもとあるので注意

inputLabel.location_once_scrolled_into_view

SessionNotCreatedException

webdriverのバージョンが異なっているときに発生します。webdriverのバージョンを更新しましょう。

selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 76