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

PhantomJSを使ってWebSocketの開発を行う

WebSocket PhantomJS Ubuntu

「Webアプリケーションの開発はEmacs(emacs-nox)で行うべき」というは幼稚園児でも知っている常識だが、JavaScript中心のアプリケーションではどうしてもフォーカスがブラウザに行ってしまう。そこで、PhantomJSを使えばターミナルから離れる必要がなくなり、生産性が格段に上がるのではないかと考えた。

当方の環境はUbuntu 11.04。

PhantomJSのインストールは難しくない。Ubuntuの場合、ここに書いておるとおり、

$ sudo apt-get install libqt4-dev libqtwebkit-dev qt4-qmake
$ wget http://phantomjs.googlecode.com/files/phantomjs-1.2.0-source.zip
$ unzip phantomjs-1.2.0-source.zip
$ cd phantomjs-1.2.0
$ qmake-qt4
$ make

ソースコードを取得してqmake-qt4 && makeすればよい。

// hello.js
console.log("Hello PhantomJS");
phantom.exit();

上のようなごく単純なJSを用意して実行してみる。

$ ./bin/phantomjs ~/tmp/hello.js
Hello PhantomJS

ここまでは全く問題なし。今、空前のWebSocketブームということで、次に以下のようなスクリプトを書いてみた

// wsecho.js
var page = new WebPage;

page.onConsoleMessage = function(msg) {
    console.log(msg);
};

page.evaluate(function() {
    var ws = new WebSocket("ws://echo.websocket.org");
    ws.onopen = function(event) {
        ws.send("Hello PhantomJS");
    };
    ws.onmessage = function(event) {
        console.log(event.data);
    };
});

実行してみると次のようなエラーが出る。

$ ./bin/phantomjs wsecho.js
2011-07-22T03:12:26 [WARNING] QMetaObject::invokeMethod: No such method WebCore::SocketStreamHandlePriva
te::socketSentData()

このあたりのバグレポートを見た結果、QT版のWebKitのバグらしい。

ここで諦めてしまうのは悔しいので、もう少しUbuntu的な解決法があるのではないかと思いつつも、Oneiric Ocelot(Ubuntu 11.10)のlibqtwebkit-devlibqtwebkit4のdebをダウンロードして直接インストールした。

インストール後に先程のスクリプトを再実行してみる。

% ./bin/phantomjs wsecho.js
Hello PhantomJS

とりあえずはよしとしよう。