Posted at

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ライセンスです。