Selenium + PhantomJS を使う

ウェブインタフェイスの動作試験など、ある種の用途には、 単に Requests のようなHTTPで通信をしてダウンロードするだけのライブラリではなく、 画面も描写し、JavaScriptも実行できる、そういう「本物のブラウザ」をまるごと外から制御できる仕組みが必要となる。

Selenium は、要するにそういう『スクリプトからまるごと自動制御できるブラウザ』を実現するためにライブラリとなる。
具体的には、以下のようなことが出来る。
  • 指定したURLを開く
  • フォームに記入をする(キーストロークを送る)
  • ボタンなどをクリックする
  • 要素のテキストを取得する
  • 外からJavaScriptを挿入して実行させる
  • スクリーンショットをとる
  • クッキーを取得する・挿入する
Seleniumから制御できるブラウザは、Google Chrome, Firefox, Opera, Internet Explorer といったメジャーなブラウザもあるが、 こういったブラウザを用いる場合、Selenium実行中に裏でブラウザの画面も開くため、重かったり、取り回しが面倒だったりする。
こういうために出てきたのが、PhantomJS となる。 PhantomJS は、要するに「画面なしのSafari」みたいなもので、Selenium からとても取り扱いやすい。

install

以下は、Mac + Python 向けにインストールする手順となる。
pip install selenium
brew install phantomjs
pip install phantomjs

試してみる

import selenium
import selenium.webdriver
import os

driver = selenium.webdriver.PhantomJS()
driver.set_window_size(1440, 800) # 画面のサイズを指定する。横幅がスクリーンショットに関係する。

driver.get("http://www.google.co.jp/") # Google を開く
driver.save_screenshot(os.path.expanduser("~/Desktop/screnshot1.png")) # まずはスクリーンショットをとる。

driver.find_element_by_class_name("lst").send_keys("Yahoo") # 検索ワードを入れる
driver.find_element_by_class_name("lsb").click() # 検索ボタンをクリックする
print driver.current_url # 今のURLを取得。ボタンをクリックしたので、今は検索ページに飛んでいる。
# e.g. http://www.google.co.jp/search?...
driver.save_screenshot(os.path.expanduser("~/Desktop/screnshot2.png")) # スクリーンショットをとる

ほか

driver.quit() を実行し忘れると、PhantomJS のプロセスが実行しっぱなしになる。
ps auxw | grep phantom
# -> 色々表示される
止め忘れた時は、kill しておこう。
また、WebKit(Safariで用いられ、またGoogle Chromeのベースにもなったレンダリングエンジン)を用いたPhantomJSに対し、 Gecko(Firefoxなどで用いられているレンダリングエンジン)を用いた SlimerJS などもある。