はじめに
CentOSは基本CUIのため、seleniumを実行するときはheadlessモードで動かしていましたが
画面確認の度にスクリーンショットを撮っていて開発効率が落ちていました。
そこで開発時は非headlessモード、運用時はheadlessモードと分けたいと思いました。
以下のような方には当てはまるかと思います。
・ホストOSに開発環境を構築して汚したくない
・開発環境は統一しておきたい
・スクレイピングをする際、スクリーンショットでちまちま画面確認するのが面倒
環境
・macOS Catalina(ホスト)
・vagrant + CentOS7(ゲスト)
・python + selenium(chromedriver)
X11サーバーをインストール
X11サーバーをMacOSにインストールします。
現在は同梱していないそうなのでXQuartzプロジェクトから入手します。
XQuartz
https://www.xquartz.org/
Vagrantfile
以下の1行を追加することで、Linux側のDISPLAY環境変数が設定されます。
config.ssh.forward_x11 = true
X11 ForwardingでChrome(Xクライアント)は、DISPLAY環境変数で指示されたXサーバーと通信して画面を出します。
既にvagrant up
で起動済みの場合は、vagrant reload
で読み込み直して下さい。
ソースを修正する
headlessモードのオプションをコメントアウトします。
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
def main():
try:
options = Options()
# ヘッドレスモード
#options.add_argument('--headless')
# ユーザーエージェント
options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36')
# 日本語
options.add_argument('--lang=ja')
# 起動
driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', chrome_options=options)
# 10秒待機
sleep(10)
finally:
# 終了
driver.quit()
if __name__ == '__main__':
main()
実行
実行し、mac側にブラウザが表示されれば成功です。
$ python main.py
終わりに
文字化けする場合はフォントのインストール等行なってください。
X11 forwardingするとsend_keys
で一部の文字が入力できなくなる現象はなぜだろう?