I am attempting to use CasperJS to take a screenshot of my Twitter Analytics page.
The script successfully signs into Twitter and redirects to https://analytics.twitter.com/user/USERNAME, but as soon as that page is loaded I get an error TypeError: 'undefined' is not a function (evaluating 'function(t,e){s&&s.isAttachedTo(e)||(new this).initialize(e,i)}.bind(this)')
associated with https://ton.twimg.com/insights/js/en-app-175067a4b13730ff0a223fa1c6009fde.js
. The screenshot still captures the page, but as you can see, many of the page's elements aren't loaded and there is an error displayed. Any ideas as to what's going on here? How can I get the full page to load for capture?
My CasperJS script:
var casper = require("casper").create({
viewportSize: {
width: 1024,
height: 768
},
logLevel: "debug",
verbose: true
});
var errors = [];
casper.start();
var utils = require('utils');
var resourcesTime = [];
casper.on('resource.requested', function(resource) {
var date_start = new Date();
resourcesTime[resource.id] = {
'id': resource.id,
'id_received': '',
'start': date_start.getTime(),
'end': -1,
'time': -1,
'status': resource.status,
'url': resource.url,
'url_received': ''
};
});
casper.on('resource.received', function(resource) {
var date_end = new Date();
resourcesTime[resource.id]['end'] = date_end.getTime();
resourcesTime[resource.id]['time'] = resourcesTime[resource.id]['end'] - resourcesTime[resource.id]['start'];
resourcesTime[resource.id]['id_received'] = resource.id;
resourcesTime[resource.id]['url_received'] = resource.url;
});
casper.open('https://twitter.com/login?redirect_after_login=https%3A//analytics.twitter.com/user/USERNAME/tweets').then(function() {
if (this.exists('.signin')) {
this.fill('.signin', {
'session[username_or_email]': 'USERNAME',
'session[password]': 'PASSWORD'
}, true);
}
this.wait(5000, function() {
this.capture("tweetshot.png");
this.echo("Saved screenshot of " + (this.getCurrentUrl()));
});
});
casper.on("page.error", function(msg, trace) {
this.echo("Error: " + msg, "ERROR");
this.echo("file: " + trace[0].file, "WARNING");
this.echo("line: " + trace[0].line, "WARNING");
this.echo("function: " + trace[0]["function"], "WARNING");
errors.push(msg);
});
casper.run(function() {
if (errors.length > 0) {
this.echo(errors.length + ' Javascript errors found', "WARNING");
} else {
this.echo(errors.length + ' Javascript errors found', "INFO");
}
//utils.dump(resourcesTime);
casper.exit();
});
Log:
[info] [phantom] Starting...
[debug] [phantom] opening url: https://twitter.com/login?redirect_after_login=https%3A//analytics.twitter.com/user/USERNAME/tweets, HTTP GET
[debug] [phantom] Navigation requested: url=https://twitter.com/login?redirect_after_login=https://analytics.twitter.com/user/USERNAME/tweets, type=Other, willNavigate=true, isMainFrame=true
[info] [phantom] Running suite: 1 step
[debug] [phantom] url changed to "https://twitter.com/login?redirect_after_login=https://analytics.twitter.com/user/USERNAME/tweets"
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=false
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=false
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=false
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=false
[debug] [phantom] Successfully injected Casper client-side utilities
[info] [phantom] Step anonymous 1/1 https://twitter.com/login?redirect_after_login=https://analytics.twitter.com/user/USERNAME/tweets (HTTP 200)
[info] [remote] attempting to fetch form element from selector: '.signin'
[debug] [remote] Set "session[username_or_email]" field value to USERNAME
[debug] [remote] Set "session[password]" field value to *************
[info] [remote] submitting form to https://twitter.com/sessions, HTTP POST
[info] [phantom] Step anonymous 1/1: done in 1742ms.
[info] [phantom] Step _step 2/2 https://twitter.com/login?redirect_after_login=https://analytics.twitter.com/user/USERNAME/tweets (HTTP 200)
[info] [phantom] Step _step 2/2: done in 1773ms.
[debug] [phantom] Navigation requested: url=https://twitter.com/sessions, type=FormSubmitted, willNavigate=true, isMainFrame=true
[debug] [phantom] Navigation requested: url=https://analytics.twitter.com/user/USERNAME/tweets, type=FormSubmitted, willNavigate=true, isMainFrame=true
[debug] [phantom] url changed to "https://analytics.twitter.com/user/USERNAME/tweets"
Error: TypeError: 'undefined' is not a function (evaluating 'function(t,e){s&&s.isAttachedTo(e)||(new this).initialize(e,i)}.bind(this)')
file: https://ton.twimg.com/insights/js/en-app-175067a4b13730ff0a223fa1c6009fde.js
line: 4
function: l
Error: TypeError: 'undefined' is not a function (evaluating 'function(t,e){s&&s.isAttachedTo(e)||(new this).initialize(e,i)}.bind(this)')
file: https://ton.twimg.com/insights/js/en-app-175067a4b13730ff0a223fa1c6009fde.js
line: 4
function: l
[info] [phantom] wait() finished waiting for 5000ms.
[debug] [phantom] Capturing page to /Users/admin/Desktop/tweetshot.png
[info] [phantom] Capture saved to /Users/admin/Desktop/tweetshot.png
[debug] [phantom] Successfully injected Casper client-side utilities
Saved screenshot of https://analytics.twitter.com/user/USERNAME/tweets
[info] [phantom] Done 2 steps in 9363ms
2 Javascript errors found
Thank you