Skip to content

Instantly share code, notes, and snippets.

@cjoudrey
Created November 5, 2011 16:37
Show Gist options
  • Star 86 You must be signed in to star a gist
  • Fork 16 You must be signed in to fork a gist
  • Save cjoudrey/1341747 to your computer and use it in GitHub Desktop.
Save cjoudrey/1341747 to your computer and use it in GitHub Desktop.
Lazy-rendering in PhantomJS
// This example shows how to render pages that perform AJAX calls
// upon page load.
//
// Instead of waiting a fixed amount of time before doing the render,
// we are keeping track of every resource that is loaded.
//
// Once all resources are loaded, we wait a small amount of time
// (resourceWait) in case these resources load other resources.
//
// The page is rendered after a maximum amount of time (maxRenderTime)
// or if no new resources are loaded.
var resourceWait = 300,
maxRenderWait = 10000,
url = 'https://twitter.com/#!/nodejs';
var page = require('webpage').create(),
count = 0,
forcedRenderTimeout,
renderTimeout;
page.viewportSize = { width: 1280, height : 1024 };
function doRender() {
page.render('twitter.png');
phantom.exit();
}
page.onResourceRequested = function (req) {
count += 1;
console.log('> ' + req.id + ' - ' + req.url);
clearTimeout(renderTimeout);
};
page.onResourceReceived = function (res) {
if (!res.stage || res.stage === 'end') {
count -= 1;
console.log(res.id + ' ' + res.status + ' - ' + res.url);
if (count === 0) {
renderTimeout = setTimeout(doRender, resourceWait);
}
}
};
page.open(url, function (status) {
if (status !== "success") {
console.log('Unable to load url');
phantom.exit();
} else {
forcedRenderTimeout = setTimeout(function () {
console.log(count);
doRender();
}, maxRenderWait);
}
});
@dvjunior
Copy link

dvjunior commented Apr 7, 2017

I was able to solve with page.settings.userName and page.settings.password, but this script twitter.js did not solve my problem, was animation in page, the data is loaded via ajax, in my case, phantomjs render the animation.

@oeurnravuth
Copy link

Thank you so much for share this!

Copy link

ghost commented Aug 28, 2017

Thanks, it helps!!!

@peterruijter
Copy link

Nice script. A small side note; why do you declare the variable forceRenderTimeout? This one is never used and setTimeout can be called without an assignment to a variable.

@http91
Copy link

http91 commented Nov 17, 2017

It worked great!
Thanks a lot!

@opicron
Copy link

opicron commented May 12, 2018

This is actually doing nothing:

renderTimeout = setTimeout(doRender, resourceWait);

Increase the resourceWait and set to:

renderTimeout = setTimeout(function () {
                    //console.log(count);
                    doRender();
                }, resourceWait);

@mmehedin
Copy link

Excellent. Thank you!

It works with everything I tried except this:
https://myaccount.nytimes.com/auth/login

I do not get the rendering of the input for username, password and the submit button.
Any ideas why? Really thankful for your code.

@presiyanPeykov
Copy link

Works like a charm .
Thank you .

@cbilgili
Copy link

cbilgili commented Aug 7, 2019

Thank you! After 5 years, it's still working!

@bgerd
Copy link

bgerd commented Mar 7, 2020

Thank you! Feb-2020 and still good

@Mutale85
Copy link

How can I get through the five seconds wait for cloudflare?
Tried this, but its still getting stuck at the wait for 5 seconds as cloudflare redirects you.

@adeaji61
Copy link

adeaji61 commented May 27, 2021

i tried windy.com, but it didn't work

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment