Webkitベースのheadless browser。つまりプログラムで制御可能な画面の無いブラウザと思ってよい
apt で一発で入る
コマンドとしてインストールされるので使うだけ 引数に制御用のJSファイルを指定する
$ phantomjs hoge.js
コマンドラインの引数で
$ phantomjs hoge.js piyo fuga
という風に渡して実行すると
hoge.js の中で phantom オブジェクトから
var piyo = phantom.args[0]; //=> piyo
という感じでとれる
以前のバージョンでは↑の方法で取得していたのだが、2系のバージョンでは、このように取得するように変更になったようだ
var system = require('system'); var args = system.args; var hogejs = args[0]; var piyo = args[1]; var fuga = args[2];
var page = require('webpage').create(); page.open('http://www.hogehoge.co.jp/', function(){ // ここで何かやる phantom.exit(); // 終了 });
PhantomJS ver 1.6.0
evaluate メソッドを使うことで開いたウェブサイト上でJavaScriptを実行することができる。
var result = page.evaluate(function(_hoge){ // ここで書かれるコードはopenで開いたページ環境で実行される // この関数スコープに外部からクロージャで環境を持ち込むことはできない return "hogehoge"; }, hoge);
しかし PhantomJS をコントロールする環境と、ウェブサイトという環境と2個の環境に跨ってJSコードを記述するので通常のJSと異なる制約がある。 この evalueate に渡す関数オブジェクト内にクロージャで外部(PhantomJS をコントロールする環境)から変数の参照を持ち込むことができない。 この制約は結構痛い。
↑1.6系 ではそうだったようだが、2系 では普通に PhantomJS を制御するコードからその内部のコードにクロージャで値を持ち込めそう・・・
evaluate の第二引数から実行する関数に値を渡すことができる。サンプルのコードではhoge変数の内容を_hoge引数で受けるように書いている。 ここに単純な値だけでなく関数自体も渡せるようだ。
しかしなんでもかんでも渡せるようはないみたいでこのへんの実装、挙動が若干怪しい。 使うときは自分が使う状況でも使えるのかというのをまずテストしたほうがいいだろう。
evaluate に渡した関数の return の値が evaluate メソッドの戻り値 として受け取れる。
こいつもなんでもかんでも受け取れるわけではないだろう・・・おそらく。 ウェブサイト環境のJSから関数オブジェクトを引き抜いて PhantomJS 環境に渡して実行・・・しかもそれがクロージャで繋がっているなんてことは考えにくい。 ここも使う前に用途に応じて挙動を確認しておいたほうがいいだろう。
画面が無いけどスクリーンショットは撮れる
page.render('screenshot.png');
open する前に設定する
var page = require('webpage').create(); page.settings.userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53';