我们正在尝试为以下网站的最终产品页面生成屏幕截图,但由于站点上的JavaScript错误而导致在控制台中收到错误消息,并且生成的屏幕截图不超过1个。

链接:http://shop.reebok.com/us/product/Men-DMXSky-Impact-Shoes/NV326?cid=V61752

日志:


CODE [无错误处理]:

var page = require('webpage').create();
page.open('http://shop.reebok.com/us/product/Men-DMXSky-Impact-Shoes/NV326?cid=V61752', function () {
window.setTimeout(function () {
page.render('output.jpg');
phantom.exit();
});
});


将记录错误消息,并且不会生成屏幕截图。

CODE [带错误处理]:

var page = require('webpage').create();
page.onError = function(msg, trace) {

var msgStack = ['ERROR: ' + msg];

  if (trace && trace.length) {
    msgStack.push('TRACE:');
    trace.forEach(function(t) {
      msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
    });
  }
  //console.error(msgStack.join('\n'));
};

page.open('http://shop.reebok.com/us/product/Men-DMXSky-Impact-Shoes/NV326?cid=V61752', function () {
window.setTimeout(function () {
            page.render('output.jpg');
            phantom.exit();
});
});


这不会在控制台中记录错误消息,但是仍然不会创建Screenshot。

参考来自:
http://phantomjs.org/api/webpage/handler/on-error.html

最佳答案

有关屏幕截图的许多问题是因为渲染页面时调用page.render太早了。建议在调用回调后再等待一会儿。

使用setTimeout时,请提供这样的持续时间

page.open('http://shop.reebok.com/us/product/Men-DMXSky-Impact-Shoes/NV326?cid=V61752', function () {
    window.setTimeout(function () {
                page.render('output.jpg');
                phantom.exit();
    }, 1000);
});


另一方面,您是对的:页面上的js错误可能会阻止捕获正常工作;因此您必须向page.onerrorphantom.onerror添加错误处理程序。

09-20 22:17