从PhantomJS站点上的Ajax请求获取状态代码

我们正在使用PhantomJS访问我们公司的内部网站并截图。

这个脚本基本上是PhantomJS的官方例子之一,增加了一个waitTimevariables( https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js )

var page = require('webpage').create(), system = require('system'), address, output, size; //waitTime is how long to to wait for kibana and the data to load in millis. //Increase this if your queries appear incomplete in your PDFs. 10s seems to work for me. var waitTime = 10 * 1000; if (system.args.length < 3 || system.args.length > 5) { console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]'); console.log(' paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"'); console.log(' image (png/jpg output) examples: "1920px" entire page, window width 1920px'); console.log(' "800px*600px" window, clipped to 800x600'); phantom.exit(1); } else { address = system.args[1]; output = system.args[2]; // Uncomment the following line to login. Replace user:pass with your username and password. //page.customHeaders={'Authorization': 'Basic '+btoa('user:pass')}; page.viewportSize = { width: 1280, height: 720 }; if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") { size = system.args[3].split('*'); page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' } : { format: system.args[3], orientation: 'portrait', margin: '1cm' }; } else if (system.args.length > 3 && system.args[3].substr(-2) === "px") { size = system.args[3].split('*'); if (size.length === 2) { pageWidth = parseInt(size[0], 10); pageHeight = parseInt(size[1], 10); page.viewportSize = { width: pageWidth, height: pageHeight }; page.clipRect = { top: 0, left: 0, width: pageWidth, height: pageHeight }; } else { console.log("size:", system.args[3]); pageWidth = parseInt(system.args[3], 10); pageHeight = parseInt(pageWidth * 3/4, 10); // it's as good an assumption as any console.log ("pageHeight:",pageHeight); page.viewportSize = { width: pageWidth, height: pageHeight }; } } if (system.args.length > 4) { page.zoomFactor = system.args[4]; } page.open(address, function (status) { if (status !== 'success') { console.log('Unable to load the address!'); phantom.exit(); } else { window.setTimeout(function () { page.render(output); phantom.exit(); }, waitTime); } }); } 

我们正在访问的网站正在运行一个JavaScript,这是一个对数据库的请求。 但是这个请求可以基于给定的查询花费很长时间(最多10分钟)。

所以我们想要做的不是提供一个静态的10分钟等待时间,我们想从被访问的网站上运行的JavaScript中提取状态码,如果达到200,脚本应该采取“屏幕截图”。

我们的问题是,我们不知道如何从网站上获取信息。 (我们如何克服使用的PhantomJS脚本和访问网站之间的“桥梁”?)

这就是page.onResourceReceived的用途。

 page.onResourceReceived = function(response) { if (response.stage === "end" && response.url.indexOf("/longrunningrequest") !== -1) { setTimeout(function(){ if ("200" === (""+response.status)) { page.render("screenshot_200.png"); } else { page.render("screenshot_other.png"); } phantom.exit(); }, 1000); } }; page.open(address); 

您可以确定应该从URL触发屏幕截图的特定响应。 我已经使用了一个简单的string匹配,但是你也可以使用正则expression式和什么。

当然,如果您通过node.js中的一个可用网桥使用PhantomJS,这看起来会有所不同。