2017-02-27 65 views
0

我使用PhantomJS 2.1.1拍摄手机屏幕截图,但其中一些屏幕并未正确显示,因为页面未完全呈现。我试图使用onLoadFinished事件,但它不起作用。PhantomJS onLoadFinished无法正常工作

这里是我的代码:

var system = require('system'); 
var args = system.args; 

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

page.open(args[1]); 

page.onLoadFinished = function (status) { 

    page.viewportSize = { width: 414, height: 736 }; 

    page.clipRect = { top: 0, left: 0, width: 414, height: 736 }; 
    page.render(args[2]); 
    console.log(args[2]); 
    phantom.exit(); 

}); 

它只是挂起并没有返回。我通过使用2秒硬编码延迟来解决这个问题,但这并不好,因为我不知道每个站点都会在2秒内加载。

这是硬编码延迟即时通讯使用:

page.open(args[1], function() { 

    page.viewportSize = { width: 414, height: 736 }; 

    page.clipRect = { top: 0, left: 0, width: 414, height: 736 }; 

    setTimeout(function() { 
     page.render(args[2]); 
     console.log(args[2]); 
     phantom.exit(); 
    }, 2000); 

}); 

如何获得的代码与适当的负载情况下工作?

+0

有没有错误?使用[page.onError](http://phantomjs.org/api/webpage/handler/on-error.html)回调找出 – Vaviloff

回答

0

官方PhantomJS rasterize.js用于拍摄uses a 200ms timeout的网页截图脚本:

page.open(address, function (status) { 
    if (status !== 'success') { 
     console.log('Unable to load the address!'); 
     phantom.exit(1); 
    } else { 
     window.setTimeout(function() { 
      page.render(output); 
      phantom.exit(); 
     }, 200); 
    } 
}); 

这是确定的(从源代码上面链接复制),并建议做的,而不是直接在事件中呈现相同。

+0

这不使用加载事件。这与我上面发布的解决方法类似。我宁愿使用加载事件,而不是硬编码延迟http://phantomjs.org/api/webpage/handler/on-load-finished.html。超时是明智的,但我不能让加载事件工作,所以它会超时100%。 – Guerrilla

+0

这是不正确的;它使用'onLoadFinished'事件。传递给'page.open()'的回调函数[相当于手动使用'onLoadFinished'](http://phantomjs.org/api/webpage/method/open.html):'一旦页面被加载,可选的使用page.onLoadFinished'调用回调函数。请记住,我链接的脚本是一个官方的PhantomJS脚本,用于截取页面的截图。 PhantomJS团队本身推荐使用超时。 – Agop

+0

啊好吧,我现在明白了,谢谢你的解释。为什么有些网站需要更长的超时时间,这一定是另一个原因。 – Guerrilla