/*global phantom*/ "use strict"; // 单个资源等待时间,避免资源加载后还需要加载其他资源 var resourceWait = 500; var resourceWaitTimer; // 最大等待时间 var maxWait = 5000; var maxWaitTimer; // 资源计数 var resourceCount = 0; // PhantomJS WebPage模块 var page = require('webpage').create(); // NodeJS 系统模块 var system = require('system'); // 从CLI中获取第二个参数为目标URL var url = system.args[1]; // 设置PhantomJS视窗大小 page.viewportSize = { width: 1280, height: 1014 }; // 获取镜像 var capture = function(errCode){ // 外部通过stdout获取页面内容 console.log(page.content); // 清除计时器 clearTimeout(maxWaitTimer); // 任务完成,正常退出 phantom.exit(errCode); }; // 资源请求并计数 page.onResourceRequested = function(req){ resourceCount++; clearTimeout(resourceWaitTimer); }; // 资源加载完毕 page.onResourceReceived = function (res) { // chunk模式的HTTP回包,会多次触发resourceReceived事件,需要判断资源是否已经end if (res.stage !== 'end'){ return; } resourceCount--; if (resourceCount === 0){ // 当页面中全部资源都加载完毕后,截取当前渲染出来的html // 由于onResourceReceived在资源加载完毕就立即被调用了,我们需要给一些时间让JS跑解析任务 // 这里默认预留500毫秒 resourceWaitTimer = setTimeout(capture, resourceWait); } }; // 资源加载超时 page.onResourceTimeout = function(req){ resouceCount--; }; // 资源加载失败 page.onResourceError = function(err){ resourceCount--; }; // 打开页面 page.open(url, function (status) { if (status !== 'success') { phantom.exit(1); } else { // 当改页面的初始html返回成功后,开启定时器 // 当到达最大时间(默认5秒)的时候,截取那一时刻渲染出来的html maxWaitTimer = setTimeout(function(){ capture(2); }, maxWait); } });