Webブラウザの自動化において、Webサイトが「通知を許可しますか?」といったポップアップを表示することは珍しくありません。
Seleniumを使用したスクレイピングや自動テストの実行中にこうした通知が表示されると、要素のクリックが阻害されたり、実行が停止したりする原因となります。
この記事では、PythonのSeleniumを用いて、ChromeやFirefoxでブラウザ通知をあらかじめ無効化する方法について詳しく説明します。
ブラウザ通知が自動化に与える影響
近年、多くのニュースサイトやSNSでは、プッシュ通知の許可を求めるダイアログが表示されるようになっています。
通常のブラウジングではユーザーが手動で閉じれば済みますが、Seleniumによる自動操作ではこれが大きな障害となります。
通知ポップアップはブラウザ固有のUI(ユーザーインターフェース)であり、HTML上の要素ではないため、通常のfind_elementメソッドでは操作できません。
そのため、プログラム側からブラウザの起動オプションを指定し、最初から通知機能をオフにしておく必要があります。
通知を放置すると、テストが不安定になる(Flaky Test)の大きな要因となるため、適切な設定を学びましょう。
Chromeで通知ポップアップを無効化する方法
Google Chromeを使用している場合、ChromeOptionsクラスを利用して通知を無効化できます。
Chromeには、起動時のコマンドライン引数(Arguments)を指定する方法と、ユーザープロファイルの詳細設定(Prefs)を変更する方法の2種類が存在します。
起動オプション(Arguments)による無効化
最もシンプルでよく使われる方法は、--disable-notificationsという引数を追加する方法です。
この設定を追加するだけで、ほとんどのサイトで通知許可のダイアログが表示されなくなります。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Chromeのオプションを設定
chrome_options = Options()
# 通知を無効化する引数を追加
chrome_options.add_argument("--disable-notifications")
# WebDriverの初期化
driver = webdriver.Chrome(options=chrome_options)
# 任意のサイトへアクセス
driver.get("https://www.google.com")
# 処理完了後にブラウザを閉じる
driver.quit()
ユーザー設定(Prefs)による詳細な制御
特定の環境やサイトによっては、引数だけでは不十分な場合があります。
その場合は、prefs(環境設定)を用いて、通知のデフォルト設定値を明示的に「ブロック(2)」に変更します。
設定項目は profile.default_content_setting_values.notifications です。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# ユーザー設定で通知をブロック(2はブロック、1は許可)
prefs = {"profile.default_content_setting_values.notifications": 2}
chrome_options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://example.com")
driver.quit()
Firefoxで通知ポップアップを無効化する方法
Firefoxの場合も、Chromeと同様にOptionsクラスを使用しますが、設定方法が異なります。
Firefoxでは「プロパティ(Preference)」を書き換えることで、ブラウザ内部の設定を変更します。
dom.webnotifications.enabledの設定変更
Firefoxの設定画面(about:config)にあるdom.webnotifications.enabledという項目をFalseに設定します。
これにより、Web Notification API自体が無効化され、通知の許可を求めるポップアップが表示されなくなります。
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
# Firefoxのオプションを設定
firefox_options = Options()
# 通知機能を無効化
firefox_options.set_preference("dom.webnotifications.enabled", False)
# 位置情報通知なども無効にしたい場合は以下も設定
firefox_options.set_preference("geo.enabled", False)
# WebDriverの初期化
driver = webdriver.Firefox(options=firefox_options)
driver.get("https://example.com")
driver.quit()
通知以外のポップアップへの対処法
通知ポップアップの他にも、Seleniumの操作を妨げる「ダイアログ」は存在します。
これらは通知(Notification)の設定とは別のアプローチが必要です。
JavaScriptのAlert(警告ダイアログ)
ブラウザ通知と混同されやすいのが、JavaScriptのalert()やconfirm()によるダイアログです。
これらはブラウザの設定で無効化するのではなく、Alertクラスを使用してプログラム内で操作する必要があります。
from selenium.webdriver.common.alert import Alert
# アラートが表示されるまで待機(必要に応じてWebDriverWaitを使用)
alert = Alert(driver)
# 「OK」ボタンを押す
alert.accept()
モーダルウィンドウや広告ポップアップ
HTML内の要素として表示されるモーダルや広告は、ブラウザの設定では消せません。
これらは通常の要素と同じように、click()メソッドで閉じるボタンを押すか、JavaScriptを実行して要素を非表示にする必要があります。
「通知」の設定だけでは不十分な場合は、表示されているものが「ブラウザの機能」なのか「サイト上の要素」なのかを見極めることが重要です。
ブラウザ別・設定方法の比較表
各ブラウザでの主要な設定項目をまとめました。
| ブラウザ | 設定方法 | 主な設定項目 / 引数 |
|---|---|---|
| Chrome | Arguments(引数) | --disable-notifications |
| Chrome | Prefs(環境設定) | profile.default_content_setting_values.notifications: 2 |
| Firefox | Preferences | dom.webnotifications.enabled: False |
| Edge | Arguments(引数) | --disable-notifications (Chromeと共通) |
ヘッドレスモードでの通知動作について
ブラウザを表示させない「ヘッドレスモード」を利用している場合でも、通知の設定は有効です。
むしろ、ヘッドレスモードではエラーの発生箇所を視覚的に確認しにくいため、あらかじめ通知を無効化しておく設定が強く推奨されます。
設定が漏れていると、通知ポップアップによって本来クリックすべき要素が覆い隠され、ElementClickInterceptedExceptionといったエラーが発生することがあります。
# ヘッドレスモードと通知無効化の併用例
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-notifications")
まとめ
Seleniumを用いたWebブラウザの自動化において、通知ポップアップは処理の中断を招く厄介な存在です。
Chromeでは--disable-notifications引数やprefs設定を、Firefoxではdom.webnotifications.enabledを無効にすることで、これらを確実に回避できます。
安定した自動化スクリプトを作成するためには、WebDriverのオプション設定を適切に構築することが第一歩となります。
まずは今回紹介したコードをベースに、自分の環境に合わせてカスタマイズしてみてください。
