SeleniumでFirefoxの複数タブを同時に開く時にポップアップブロックされる問題に対処する

SeleniumでFirefoxの複数タブを同時に開く時にポップアップブロックされる問題に対処する
目次

以前の記事 Pythonで自動化しよう! ー Selenium Webdriverをセットアップする では、 PythonでSeleniumの実行環境の構築手順を紹介しました。

今回は少しニッチですが、Firefoxで動作させる時に私が実際に陥った問題とその対処法を紹介します。

やりたかったこと

  • 複数のURL(100個くらい)を同時に開き、表示された画面を目視でチェックする
  • その時、SeleniumではJavascriptの window.open() 関数を実行してURLを開く

発生したこと:Firefoxで複数タブを多く開くとポップアップブロックが表示される

Firefoxのwebdriverを使って以下のようなコードを実行してみます。

1from selenium import webdriver
2
3driver = webdriver.Firefox()
4driver.get('https://www.google.com/')
5for i in range(0, 100):
6    driver.execute_script(f"window.open('https://www.google.com/', '{i}')")

すると、20個ほど順調にタブが開いた後、いきなり以下のようなポップアップブロックが表示されました。

popup_block

ポップアップブロックは window.open() 関数を実行しているタブに対してのみ表示されるため、間違いなく見落とします。 ポップアップブロックから「許可」を手動で行えばなんとか開けますが、自動化のうまみが消えてしまうのでなんとか対処したいです。

解決策:ポップアップの上限数を設定する

調査の結果、ブラウザの「設定」に該当するオプションをFirefoxのwebdriver生成時に Options クラスで指定できることがわかりました。 以下のサンプルコードでは2つのプロパティを使っています。

  • dom.disable_open_during_load: ページロード中におけるポップアップブロックを行う
  • dom.popup_maximum: ポップアップによる別タブ表示の上限数(デフォルトは 20
 1from selenium import webdriver
 2from selenium.webdriver.firefox.options import Options
 3
 4options = Options()
 5options.set_preference("dom.disable_open_during_load", False)
 6options.set_preference('dom.popup_maximum', -1)
 7
 8driver = webdriver.Firefox(options=options)
 9driver.get('https://www.google.com/')
10for i in range(0, 100):
11    driver.execute_script(f"window.open('https://www.google.com/', '{i}')")

dom.popup_maximum-1 に指定するとタブの表示上限が無制限扱いとなり、ポップアップブロックされなくなりました。

参考にさせていただいたサイト