Posted at

[PhantomJS]ネットワーク由来でないタイムアウトも、きちんと切断する

More than 5 years have passed since last update.

PhantomJSでタイムアウトを設定したい場合、公式ドキュメントには何故か載っていないresourceTimeoutでOKなハズなんですが。

var page = require('webpage').create();

page.settings.resourceTimeout = 5000;
page.open('http://example.com', function(status){
// do something
});

こちら、ネットワーク要員のタイムアウトしか拾ってくれず。コンテンツが異様に大きいとか、JSで継続的にロードを行っていて...など、タイムアウトしないでonLoadFinishedもコールされない、困った場面に直面してました。

仕方ないのでsetTimeoutを使って自力でタイムアウトさせる処理を追記。

var page = require('webpage').create();

page.settings.resourceTimeout = 5000;
var timeout = setTimeout(function(){
page.stop();
}, 5000);
page.open('http://example.com', function(status){
clearTimeout(timeout);
// do something
});

このstopメソッドで強制切断した場合も、openのコールバック引数のstatusにちゃんと"fail"が返ってくるので、普通にエラー処理しておけば良い(当然ながらonResourceTimeoutはコールされないので、そこで同じ処理を書くなら、ちょっと工夫が必要)。