Headless modeを内蔵したGoogle Chrome 59がリリースされたので、Python + Seleniumで使ってみました。
これまでheadlessと言えば、Xvfbを使って仮想的なディスプレイに作画することで実現していました。しかしGoogle Chrome 59以降ではChrome自体にheadless modeが内蔵され、Xvfbを使わなくてもディスプレイを持たないCLI環境でWebページのテストなどをできるようになりました。
そこでUbuntu 17.04上でGoogle ChromeのHeadlessモードを試してみました。
Chromeをインストール
Ubuntu 17.04にはChromeのパッケージがない1ので、まずChromeのダウンロードページからdebパッケージをダウンロードします。
Chromeはいくつか依存パッケージがあるので、それらのパッケージをインストールした後にdpkg
コマンドでインストールします。
$ sudo apt install libappindicator1 libindicator7
$ sudo dpkg -i google-chrome-stable_current_amd64.deb
$ which google-chrome-stable
/usr/bin/google-chrome-stable
Seleniumとchromedriverをインストール
Seleniumは問題ありませんが、Ubuntu 17.04にあるchromedriveはChrome 59をサポートしていません。そこで最新のChromeDriverをダウインロードしてインストールします。
$ sudo apt install python3-selenium
$ cd ~/bin
$ unzip ~/Download/chromedriver_linux64.zip
$ ./chromedriver -v
ChromeDriver 2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57)
Headless modeを試してみる。
Pythonで次のようなスクリプトを書いて、Chromeをheadless modeで使えるか試してみました。
#!/usr/bin/python3
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
CHROME_BIN = "/usr/bin/google-chrome-stable"
CHROME_DRIVER = os.path.expanduser('~/bin/chromedriver')
options = Options()
options.binary_location = CHROME_BIN
options.add_argument('--headless')
#options.add_argument('--remote-debugging-port=9222')
driver = webdriver.Chrome(CHROME_DRIVER, chrome_options=options)
#driver.get("chrome://settings/help")
#driver.save_screenshot("/tmp/help.png")
driver.get("https://www.yahoo.co.jp")
driver.save_screenshot("/tmp/yahoo.png")
print(driver.title)
driver.quit()
このスクリプトを実行してYahoo!のページタイトルYahoo! JAPAN
とスクリーンショットが作成されていれば成功です。
画面のサイズ指定ができない
これまでWindowsサイズをset_window_size()で指定していましたが、これがあると次のようなエラーを引き起こします。
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot get automation extension
from unknown error: page could not be found: chrome-extension://aapnijgdinlhnhlmodcfapnahmbfebeb/_generated_background_page.html
(Session info: headless chrome=59.0.3071.86)
(Driver info: chromedriver=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57),platform=Linux 4.10.0-21-generic x86_64)
解決策がないかとググってChromeDriver error “unknown error: cannot get automation extension”を見つけたのですが、私の環境では
options.add_argument("disable-extensions");
options.add_argument("--start-maximized");
というオプションを追加しても解決せず、set_window_size()を削除する必要がありました。
脚注
-
UbuntuにはChromeのパッケージはありませんが、オープンソース版のChromiumがあります。 ↩