Windows環境でSeleniumからHeadless Chromeを動かしてみた

2017.11.01

はじめに

DI部のおおたきです。Headless ChromeがWindowsをサポートしたのでWindows上で動かしてみました。

環境

  • Windows7
  • Google Chrome 62.0.3202.75
  • Python 3.6.3
  • Pleiades 4.7.1

準備

Pythonはすでにインストールしてある前提で進めたいと思います。まずpipでライブラリをインストールします。

C:\Users\ootaki.kentaro>pip install selenium
Collecting selenium
  Using cached selenium-3.6.0-py2.py3-none-any.whl
Installing collected packages: selenium
Successfully installed selenium-3.6.0

次にWebDirverをここからダウンロードします。今回使用したドライバのバージョンは2.3.3になります。ダウンロードしたら適当な場所に解凍します。
今回開発はPleiades All in One(Eclipse)で行いました。使用したのはEclipse 4.7 OxygenのWindows64ビット Standard Edtion版のPython になります。
起動したらまず、Pythonのパスを設定します。メニューのウィンドウ > 設定からPyDev > インタープリター >Pythonインタープリターの新規ボタンからインストールしたPythonのパスを追加します。
pythonパス
以上で準備は完了です。

コードを書いてみる

弊社のブログサイトにアクセスして「めそ子」と検索し、検索結果のリンクを取得し最後にスナップショットを取ってみます。
以下今回のソースコードになります。

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.binary_location = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options, executable_path="D:\\Program\\chromedriver_win32\\chromedriver.exe")

#トップ画面を開く。
driver.get('https://dev.classmethod.jp/')

#検索メニュークリック
driver.find_element_by_xpath("//span[text()='検索']").click()
#キーワード入力
driver.find_element_by_id("searchKeywordInput").send_keys("めそ子")
#検索ボタンクリック
driver.find_element_by_id("searchKeywordInputButton").click()

#検索結果の一覧からリンクのタイトルを取得する
for a in driver.find_elements_by_css_selector('h2 > a'):
    print(a.text)

# スクリーンショットをとる。
driver.save_screenshot('search_results.png')
driver.quit()

5~8行目でwebdriverの設定を行っています。binary_locationはインストールされているChromeのパスを指定します。executable_pathは先ほどダウンロードしたWebDirverのパスを指定します。また--headlessを指定することでブラウザを起動せずheadlessモードで実行されます。
最後にスクリーンショットを取ったファイルは実行したpythonファイルと同階層に作成されます。

実行結果

検索結果のリンクの一覧が以下のように表示されます。

iOSアプリ「Pythonista3」でクラスメソッドのおみくじを占えるようにした
iOSアプリ「Pythonista3」でめそ子さんと記念写真を撮れるようにしてみた※追記あり
マーケティング部からのお知らせ(めそ子さんの壁紙ほかボリューム多めです):2017年10月2日〜10月6日
[イベントレポート] 俺コン day2 に参加してきました! #orecon_ios #akibaswift
パスワードの作成や管理に悩んだときに思い出していただきたいアイデア
ERC20準拠の「めそコイン」を発行して一攫千金を狙ってみた
[iOS 11] ARKitでソファー設置からあの子の身長測定まで色々やってみた
【めそ子通信】日本各地を飛び回る!Developers.IO WORLD開催します
GoogleのJPEGエンコーダーGuetzliを試してみた
同僚の家でリモートしてみた
【めそ子通信】AWSに関するコンサルティングや利用料金が一部無料に! Try!シリーズをご活用ください
Ethereumブロックチェーンでめそ子の握手券を作ってみた
【めそ子通信】7月開催セミナーのご案内 〜AWS導入相談会始めました〜
【来場御礼】Developers.IO 2017レポートまとめ #cmdevio2017
クラスメソッド2次元社員 2代目めそ子のコーナー
Developers.IO 2017 イベントフォトレポート #cmdevio2017
Google Sheets + Apps Script を使ってめそ子の壁紙を月替りで自動アップデートする
#cmdevio2017 めそ子が語るDevelopers.IO 2017の見どころと当日のご案内
EIPで料金発生するパターンとしないパターン #AWS
【好評御礼】DevelopersIO2017の全セッション概要紹介! #cmdevio2017
AWS Summit Tokyo 2017 参加レポート・ツイート・クラメソ的ニュースのまとめ #AWSSummit
クラスメソッドにJOINし、名前を襲名しました「めそ子」です
「AWS Summit Tokyo 2017」クラスメソッド展示ブースでお待ちしております
クラスメソッドに10年勤務してるワイが魅力と思い出を語ってく【採用/求人】
7/1(土)開催のDevelopers.IO 2017、登録受付中!
【めそ子通信】5月開催セミナーのご案内 〜AWS Summitでお待ちしております〜
【めそ子通信】4月開催セミナーのご案内 〜今年もアレやります〜
Tableau 10.2 新機能:データをCSVとしてエクスポート出来るようになりました #tableau
【めそ子通信】3月開催イベント・セミナーのおしらせだよ!たーのしー!
【新機能】Amazon Rekognitionに年齢解析機能がつきました【めそ子さんって何歳?】

スクリーンショットの画像です。
search_results

headlessとそうでない場合の実行速度の違い

headlessオプション指定してブラウザを表示しない場合とオブション指定しないでブラウザを表示した場合の速度を計測してみました。 以下、今回作成したプログラムでの実行結果の違いです。

headlessオプション有 headlessオプション無
5秒 8秒
5秒 8秒
5秒 7秒
5秒 8秒
5秒 8秒


やはりheadlessで実行したほうが処理速度も速いです。

まとめ

Windows上では簡単に実行することができました。headlessにすることでブラウザが起動しないしのでテストもやりやすいので、ブラウザのシェアが最も高いChromeがheadless対応したのは大きいかなと思います。
またheadlessにすることで処理速度も速くなるのでテストなどでたくさんの処理をさせる場合には時間短縮になると思います。
これを気にテストの一環に取り入れるのもいいのではないかと思います。
今回は以上です。