概要
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が起動している環境で動作させる場合
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が起動していない環境で動作させる場合
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ライセンスです。