読者です 読者をやめる 読者になる 読者になる

Knowlbo 開発者ブログ

株式会社Knowlboの開発者ブログです。

Selenium WebDriver で Web アプリのテストを自動化中 (PhantomJS 編)

開発部の本橋です。

先日の記事 で Chrome を自動操作しました。今回は Headless な Web ブラウザである PhantomJS を使って同じことをやってみます。 Headless であることで CI に組み込みやすくなったりと、幅が広がりますね。

PhantomJS の今後が微妙

いきなりですが、Chrome のベータ版で Headless モードが利用可能であるため、 PhantomJS の開発は終了しそうな感じです。

Phantom.jsのメンテナー、プロジェクトの将来に疑問を呈し、その座を降りる

そのうち Chrome の安定版にも降りてくると思われるので、もう少ししたらそちらを使うようになるかもしれません。

ひとまず今回は使用例も多い PhantomJS を使います。

PhantomJS (とPython) をインストール

Headless なので今回は Docker イメージでいけます。PhantomJSの公式な Docker イメージはないようなので DockerHub にある良さそうなイメージを使うか、もしくは以下のような Dockerfile を使って自分でイメージをビルドしましょう。

今回も Selenium を Python3 で使いたいので、Python も一緒にインストールします。

FROM debian:jessie

ENV PAHNTOMJS_VERSION 2.1.1

WORKDIR /tmp

RUN apt-get update \
    && apt-get install -y \
           curl \
           bzip2 \
           # linux用のバイナリには fontconfig が必要
           # http://phantomjs.org/download.html#linux-64-bit
           libfontconfig \
           python3 \
           python3-pip \

    # PhantomJS をインストール
    && curl -L -O https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-${PAHNTOMJS_VERSION}-linux-x86_64.tar.bz2 \
    && tar xvf phantomjs-${PAHNTOMJS_VERSION}-linux-x86_64.tar.bz2 \
    && ln -s $(pwd)/phantomjs-${PAHNTOMJS_VERSION}-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs \

    # selenium の Python バインディングをインストール
    && pip3 install selenium \

    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ENTRYPOINT ["python3"]
CMD ["/mnt/run.py"]

run したときに /mnt/run.py を実行するようにしています。

イメージのビルドはこんな感じです。

$ docker build . -t my/selenium-phantomjs

Selenium で操作する

WebDriver の使い方は前回と同じなので 先日の記事 を見ていただくとして、1点だけ変わるところがあります。

# run.py

# ...略

if __name__ == '__main__':
    # PhantomJS を使うようにする。
    driver = webdriver.PhantomJS()

    # ウィンドウサイズを設定。
    # レスポンシブ対応しているサイトなんかだと
    # ウィンドウ幅が狭いとリンクテキストで要素を取得できない場合がある。
    driver.set_window_size(width=1200, height=1000)

run.py をカレントディレクトリに置いたら以下のコマンドでイメージを run します。/mnt/run.py を実行するように Dockerfile を書いたので、カレントディレクトリを /mnt にマウントします。

$ docker run -v $(pwd):/mnt my/selenium-phantomjs
..
----------------------------------------------------------------------
Ran 2 tests in 8.846s

OK

これで Headless に Selenium を使えるようになりました!

冒頭に書いたように Chrome の Headless モードが安定版に降りてきたらそちらも試したいですね。