python selenium 例外処理、エラーハンドリング、プロセス確認、強制終了

Python

Seleniumで使用するWebDriverが、何かしらのエラーで正常終了しないことはよくないとされています

・正常終了しなかったとき起こること

リソースの無駄遣い

WebDriverを起動すると、ブラウザインスタンスが立ち上がりますが、正常終了しないとそのインスタンスがバックグラウンドで動き続けます

これにより、メモリやCPUが無駄に消費され、システム全体のパフォーマンスに悪影響を与える可能性があります

メモリリークのリスク

終了しないWebDriverプロセスが蓄積すると、システムメモリが徐々に埋められ、最終的に他のアプリケーションに影響を与えることがあります。

・正常終了させるために

seleniumでは以下のようにコードでドライバーを終了させます

from selenium import webdriver

driver = webdriver.Chrome()

driver.quit()  # WebDriverを完全に終了

driver.quit()メソッドと違い、driver.close() は現在のブラウザタブを閉じるだけで、WebDriver自体は終了しません

他にも、複数タブを操作している場合、driver.quit()を使用しないとプロセスが残ることがあります

エラーが発生する可能性がある場合、以下のように例外処理のコードを追加するといいです

from selenium import webdriver

driver = webdriver.Chrome()

try:
    # 例外が発生する可能性のあるコード
except:
    # 例外が発生した場合の処理
else:
    # 例外が発生しなかった場合の処理
finally:
    # 必ず実行される処理
    driver.quit()  # WebDriverを完全に終了

もし途中でエラーが起きてWebDriverが終了していない場合、バックグラウンドで動作しているプロセスが存在する場合があります

バックグラウンドプロセスを確認

次のコマンドで、現在実行中のプロセスのリストを取得し、その中からchromedriverという名前を含むプロセスを検索します

windows

tasklist | findstr chromedriver

tasklistでプロセスを表示、findstrでchromedriverを含むプロセスのみに絞ります
パイプ (|) 演算子は、前のコマンドの出力を次のコマンドの入力として渡します

mac linux

ps aux | grep chromedriver

psコマンドは、現在実行中のプロセスを表示するためのツールです
a: 他のユーザーのプロセスも含めて表示します
u: プロセスの所有者、CPU使用率、メモリ使用率など、ユーザー中心のフォーマットで表示します
x: 端末に紐付けられていないプロセスも含めて表示します。
ps auxの出力を次のコマンド(ここでは grep chromedriver)に渡します
grep コマンドは、指定された文字列を含む行を検索して表示します

何も見つからなければプロセスは残っていません
見つかった場合は以下のコマンドで強制終了させることができます

windows

taskkill /F /IM chromedriver.exe

/Fは、 “Force” の略で、プロセスを強制終了します
プロセスが応答していない場合や、通常の終了手続きでは終了しないプロセスも終了させます
/IM(”Image Name”)は/IMの略で、プロセス名(イメージ名)を指定し、特定の名前を持つプロセスを終了できます

意味: “Image Name” の略。

mac linux

killall chromedriver

このように、まずエラーが起きる可能性があるところには、例外処理をプログラムを組み込み、たまにバックグラウンドでプロセスが残っていないか確認することが大切です

・エラーの種類によって異なる処理をする

何が原因でエラーが起きたか把握するため、エラーの種類によって出力を変えます

from selenium import webdriver
from selenium.common.exceptions import WebDriverException, NoSuchElementException, TimeoutException

# エラーの起きる可能性のあるコード
try:
    driver = webdriver.Chrome()
    driver.get("https://example.com")
    driver.find_element(By.ID,"btnLogin").click()

# 要素が見つからない場合
except NoSuchElementException:
    print("要素が見つかりませんでした")

# 処理が遅く、タイムアウトしてしまった場合
except TimeoutException:
    print("操作がタイムアウトしました")

# webdriver関連のエラーの場合
except WebDriverException:
    print("Selenium関連のエラーが発生しました")

# それ以外のエラーの場合
except Exception:
    print("その他のエラーが発生しました")

# 正常終了させる
finally:
    driver.quit()

コメント