⁉️

UnexpectedAlertPresentExceptionの対応

2023/02/04に公開

Pythonでスクレイピング中にアラートのポップアップ(UnexpectedAlertPresentException)が出て先に進めなくなってしまった時の対応方法

【環境】

OS: CentOS Stream release 8
Python3バージョン:Python 3.6.8
Seleniumバージョン(pip3 list): selenium 3.141.0

【事象】

PythonのSeleniumを使った、ブラウザの自動操作を行っている時、フォームのボタンをクリック操作した際に、UnexpectedAlertPresentException というエラーが発生。

エラー内容は次のようになります。

selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text:〇〇〇.
Message: unexpected alert open: {Alert text : 〇〇〇}

【原因】

UnexpectedAlertPresentExceptionはChromeのAlert(アラートモーダル)によって処理が止められたときに発生します。

【対応】

色々サイトを調べましたが、どれも上手くいかず、コードを一行づつ目視で確認して解消したので備忘録として記録しています。結論から言うと、どのサイトでもTry & Exception句を用いて対応していましたが、不要でした。

#seleniumのモジュールインポート
from selenium import webdriver
import chromedriver_binary
import requests
from bs4 import BeautifulSoup
…
#ブラウザ起動
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(options=options)
driver.set_window_size('1200', '1000')  #大事。デフォルトが800*600になっているのでheadlessだと要素部分が表示されないことがあるため。
…
driver.get(update_page)
update_btn = driver.find_element_by_xpath("//div[1]/form/button[@type='submit']")

#ボタンをクリック
update_btn.click()

#アラートメッセージ「XXXXXXXX?」が出るのでこれを回避
# ======この部分を追加======
alert = driver.switch_to.alert
print(alert.text)
alert.accept()
# ======/この部分を追加======

#遷移後の画面キャプチャ
driver.save_screenshot('情報更新.png')

【補足】

・ボタンの要素はxpathで指定しました。
・Try & Exception句は不要でした。

Discussion