events-filters.rst 12 KB

Events & filters

CasperJS provides an event handler very similar to the nodejs' one; actually it borrows most of its codebase. CasperJS also adds filters, which are basically ways to alter values asynchronously.

Events

Using events is pretty much straightforward if you're a node developer, or if you worked with any evented system before:

var casper = require('casper').create();

casper.on('resource.received', function(resource) {
    casper.echo(resource.url);
});

Emitting you own events

Of course you can emit your own events, using the Casper.emit() method:

var casper = require('casper').create();

// listening to a custom event
casper.on('google.loaded', function() {
    this.echo('Google page title is ' + this.getTitle());
});

casper.start('http://google.com/', function() {
    // emitting a custom event
    this.emit('google.loaded');
});

casper.run();

Events reference

back

Arguments: None

Emitted when the embedded browser is asked to go back a step in its history.

capture.saved

Arguments: targetFile

Emitted when a :index:`screenshot` image has been captured.

click

Arguments: selector

Emitted when the Casper.click() method has been called.

complete.error

Arguments: error

Emitted when a complete callback has errored.

By default, CasperJS doesn't listen to this event, you have to declare your own listeners by hand:

casper.on('complete.error', function(err) {
    this.die("Complete callback has failed: " + err);
});

die

Arguments: message, status

Emitted when the Casper.die() method has been called.

downloaded.file

Arguments: targetPath

Emitted when a file has been downloaded by :ref:`Casper.download() <casper_download>`; target will contain the path to the downloaded file.

error

Arguments: msg, backtrace

Emitted when an error hasn't been explicitly caught within the CasperJS/PhantomJS environment. Do basically what PhantomJS' onError() native handler does.

exit

Arguments: status

Emitted when the Casper.exit() method has been called.

fill

Arguments: selector, vals, submit

Emitted when a form is filled using the Casper.fill() method.

forward

Arguments: None

Emitted when the embedded browser is asked to go forward a step in its history.

http.auth

Arguments: username, password

Emitted when http authentication parameters are set.

http.status.[code]

Arguments: resource

Emitted when any given HTTP reponse is received with the status code specified by [code], eg.:

casper.on('http.status.404', function(resource) {
    casper.echo(resource.url + ' is 404');
})

load.started

Arguments: None

Emitted when PhantomJS' WebPage.onLoadStarted event callback is called.

load.failed

Arguments: Object

Emitted when PhantomJS' WebPage.onLoadFinished event callback has been called and failed.

load.finished

Arguments: status

Emitted when PhantomJS' WebPage.onLoadFinished event callback is called.

log

Arguments: entry

Emitted when the Casper.log() method has been called. The entry parameter is an Object like this:

{
    level:   "debug",
    space:   "phantom",
    message: "A message",
    date:    "a javascript Date instance"
}

..index:: click

mouse.click

Arguments: args

Emitted when the mouse left-click something or somewhere.

mouse.down

Arguments: args

Emitted when the mouse presses on something or somewhere with the left button.

mouse.move

Arguments: args

Emitted when the mouse moves onto something or somewhere.

mouse.up

Arguments: args

Emitted when the mouse releases the left button over something or somewhere.

navigation.requested

Arguments: url, navigationType, navigationLocked, isMainFrame

Emitted each time a navigation operation has been requested. Available navigation types are: LinkClicked, FormSubmitted, BackOrForward, Reload, FormResubmitted and Other.

open

location, settings

Emitted when an HTTP request is sent. First callback arg is the location, second one is a request settings Object of the form:

{
    method: "post",
    data:   "foo=42&chuck=norris"
}

page.created

Arguments: page

Emitted when PhantomJS' WebPage object used by CasperJS has been created.

page.error

Arguments: message, trace

Emitted when retrieved page leaves a Javascript error uncaught:

casper.on("page.error", function(msg, trace) {
    this.echo("Error: " + msg, "ERROR");
});

page.initialized

Arguments: WebPage

Emitted when PhantomJS' WebPage object used by CasperJS has been initialized.

page.resource.received

Arguments: response

Emitted when the HTTP response corresponding to current required url has been received.

page.resource.requested

Arguments: request

Emitted when a new HTTP request is performed to open the required url.

Arguments: requestData, request

You can also abort requests:

casper.on('page.resource.requested', function(requestData, request) {
    if (requestData.url.indexOf('http://adserver.com') === 0) {
        request.abort();
    }
});

popup.created

Arguments: WebPage

Emitted when a new window has been opened.

popup.loaded

Arguments: WebPage

Emitted when a new window has been loaded.

popup.closed

Arguments: WebPage

Emitted when a new opened window has been closed.

popup.created

Arguments: WebPage

Emitted when a new window has been opened.

remote.alert

Arguments: message

Emitted when a remote alert() call has been performed.

remote.callback

Arguments: data

Emitted when a remote window.callPhantom(data) call has been performed.

remote.message

Arguments: msg

Emitted when any remote console logging call has been performed.

resource.error

Arguments: resourceError

Emitted when any requested resource fails to load properly. The received resourceError object has the following properties:

  • errorCode: error code
  • errorString: error description
  • url: resource url
  • id: resource id

resource.received

Arguments: resource

Emitted when any resource has been received.

resource.requested

Arguments: request

Emitted when any resource has been requested.

run.complete

Arguments: None

Emitted when the whole series of steps in the stack have been executed.

run.start

Arguments: None

Emitted when Casper.run() is called.

starting

Arguments: None

Emitted when Casper.start() is called.

started

Arguments: None

Emitted when Casper has been started using Casper.start().

step.added

Arguments: step

Emitted when a new navigation step has been added to the stack.

step.complete

Arguments: stepResult

Emitted when a navigation step has been executed.

step.created

Arguments: fn

Emitted when a new navigation step has been created.

step.error

Arguments: error

Emitted when a step function has errored.

By default, CasperJS doesn't listen to this event, you have to declare your own listeners by hand:

casper.on('step.error', function(err) {
    this.die("Step has failed: " + err);
});

step.start

Arguments: step

Emitted when a navigation step has been started.

step.timeout

Arguments: [step, timeout]

Emitted when a navigation step has timed out.

timeout

Arguments: None

Emitted when the execution time of the script has reached the Casper.options.timeout value.

url.changed

Arguments: url

Emitted each time the current page url changes.

viewport.changed

Arguments: [width, height]

Emitted when the viewport has been changed.

wait.done

Arguments: None

Emitted when a Casper.wait()operation ends.

wait.start

Arguments: None

Emitted when a Casper.wait() operation starts.

waitFor.timeout

Arguments: [timeout, details]

Emitted when the execution time of a Casper.wait*() operation has exceeded the value of timeout.

details is a property bag describing what was being waited on. For example, if waitForSelector timed out, details will have a selector string property that was the selector that did not show up in time.

Filters

Filters allow you to alter some values asynchronously. Sounds obscure? Let's take a simple example and imagine you would like to alter every single url opened by CasperJS to append a foo=42 query string parameter:

var casper = require('casper').create();

casper.setFilter('open.location', function(location) {
    return /\?+/.test(location) ? location += "&foo=42" : location += "?foo=42";
});

There you have it, every single requested url will have this appended. Let me bet you'll find far more interesting use cases than my silly one ;)

Here'a the list of all available filters with their expected return value:

Filters reference

capture.target_filename

Arguments: args

Return type: String

Allows to alter the value of the filename where a screen capture should be stored.

echo.message

Arguments: message

Return type: String

Allows to alter every message written onto stdout.

log.message

Arguments: message

Return type: String

Allows to alter every log message.

open.location

Arguments: args

Return type: String

Allows to alter every url before it being opened.

page.confirm

Arguments: message

Return type: Boolean

Allows to react on a javascript confirm() call:

casper.setFilter("page.confirm", function(msg) {
    return msg === "Do you like vbscript?" ? false : true;
});

page.prompt

Arguments: message, value

Return type: String

Allows to react on a javascript prompt() call:

casper.setFilter("page.prompt", function(msg, value) {
    if (msg === "What's your name?") {
        return "Chuck";
    }
});