Ruby
Selenium
Capybara
selenium-webdriver

CapybaraからSeleniumを通してPhantomJSを使ってみる

More than 3 years have passed since last update.

概要

CapybaraからPhantomJSと言えばCapybara用のPhantomJSドライバのPoltergeistなのですが、
SeleniumからもPhantomJSを使えるので、CapybaraからSeleniumを通してPhantomJSを動かしてみました。
別のマシンでPhantomJSを動かすときに有用ではないでしょうか。

PhantomJSとは

PhantomJS はヘッドレスな(ブラウザ画面のない)QtWebKit ベースのブラウザで、JavaScript の API を通じて、そのブラウザを自由自在にあやつることが出来ます。使用シーンとしては、Jenkins などの CI ツールとの組み合わせによる Web ページの GUI の自動テストや、Web ページのスクリーンキャプチャ、スクレイピングなどが挙げられます。

PhantomJS でログインが必要なページでも自由自在にスクレイピング - 凹みTips

仕様

PhantomJSをSeleniumから使う場合には、リモートで起動しているPhantomJSに対して操作をする必要があるので、
PhantomJSサーバが起動してない場合には、別プロセスとしてPhantomJSのサーバを起動しています。
起動したリモートサーバに対してCapybara-Seleniumから操作を送っています。

実装

PhantomJSが起動している環境で動作させる場合

phantomjs-use-remote.rb
require 'capybara'
require 'selenium-webdriver'
require 'capybara-webkit'

port = 8910
host = 'localhost'

Capybara.register_driver :phantomjs do |app|
  Capybara::Selenium::Driver.new(app, browser: :remote, url: "http://#{host}:#{port}")
end

browser = Capybara::Session.new(:phantomjs)

browser.visit 'http://qiita.com/'
browser.save_screenshot 'screenshot.png'

PhantomJSが起動していない環境で動作させる場合

phantomjs-stand-alone.rb
require 'capybara'
require 'selenium-webdriver'
require 'capybara-webkit'

port = 8910
host = 'localhost'

sleep_time = 2

# phantomjsのリモートサーバを別プロセスで起動
pid = spawn 'phantomjs', '-w', port.to_s, :out => '/dev/null'
sleep sleep_time

Capybara.register_driver :phantomjs do |app|
  Capybara::Selenium::Driver.new(app, browser: :remote, url: "http://#{host}:#{port}")
end

browser = Capybara::Session.new(:phantomjs)

browser.visit 'http://qiita.com/'
browser.save_screenshot 'screenshot.png'

# phantomjsのリモートサーバを終了
Process.kill 'KILL', pid

まとめ

ローカルで動作させるのであれば、Poltergeistを使った方がトリッキーなことをしなくて良さそうです。
Capybara資産を使ってリモートのサーバのPhantomJSを操作するときに有効かも。

ライセンス

こちらのコードはMITライセンスです。