Reputation: 83
We are using PhantomJS to access a internal website of our company and take a screenshot.
The script is basically one of the official examples of PhantomJS with an added waitTime variable (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);
}
});
}
The website we are accessing is running a JavaScript, that is doing a request to a database. However this request can, based on the given query, take very long (up to 10 minutes).
So what we want to do is instead of providing a static 10 minute wait time, we want to extract the status code from the JavaScript that is run on the accessed website and if it goes to 200 , the script should take the "screenshot".
Our problem is that we don't know how to get information from the website itself. (How can we overcome that "bridge" between the used PhantomJS script and accessed website?)
Upvotes: 1
Views: 205
Reputation: 61892
That is what page.onResourceReceived
is for.
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);
You can determine the specific response that should trigger a screenshot from the URL. I've used a simple string match, but you can also use Regular Expressions and whatnot.
Of course, this would look different if you're using PhantomJS through one of the available bridges from node.js.
Upvotes: 1