This version is yet to be released, and will possibly be tagged as 2.0 as not-so-backward-compatible refactoring occured on the master
branch. I don't know yet.
PhantomJS 1.8.1 or later is required for 1.1.
CasperJS 1.1 now internally uses PhantomJS' native require()
function, but it has side effect if you write your own casperjs modules; in any casperjs module, you now have to use the new global patchRequire()
function first:
// casperjs module code
var require = patchRequire(require);
// now you can require casperjs builtins
var utils = require('utils');
exports = {
// ...
};
Note: you don't have to use patchRequire()
in a standard casperjs script.
A new Tester.begin()
method has been introduced to help organizing tests better:
function Cow() {
this.mowed = false;
this.moo = function moo() {
this.mowed = true; // mootable state: don't do that
return 'moo!';
};
}
// unit style synchronous test case
casper.test.begin('Cow can moo', 2, function suite(test) {
var cow = new Cow();
test.assertEquals(cow.moo(), 'moo!');
test.assert(cow.mowed);
test.done();
});
// asynchronous test case
casper.test.begin('Casperjs.org is navigable', 2, function suite(test) {
casper.start('http://casperjs.org/', function() {
test.assertTitleMatches(/casperjs/i);
this.clickLabel('Testing');
});
casper.then(function() {
test.assertUrlMatches(/testing\.html$/);
});
casper.run(function() {
test.done();
});
});
Tester#setUp()
and Tester#tearDown()
methods have been also added in order to ease the definition of operations to be performed before and after each test defined using Tester#begin()
:
casper.test.setUp(function() {
console.log('executed before each test');
});
casper.test.tearDown(function() {
console.log('executed after each test');
});
Both can work asynchronously as well of you define the done
argument:
casper.test.setUp(function(done) {
setTimeout(function() {
console.log('asynchronously executed before each test');
done();
}, 1000);
});
casper.test.tearDown(function(done) {
setTimeout(function() {
console.log('asynchronously executed after each test');
done();
}, 1000);
});
Tester#begin()
itself has also local setUp()
and tearDown()
capabilities if you pass it a configuration object instead of a function:
casper.test.begin('range tests', 1, {
range: [1, 2],
setUp: function(test) {
this.range.push(3);
},
tearDown: function(test) {
range = [];
},
test: function(test) {
test.assertEquals(range.length, 3);
test.done();
}
});
Scraping and testing are now better separated in CasperJS. That involves breaking up BC on some points though:
- The Casper object won't be created with a
test
reference if not invoked using thecasperjs test
command, therefore the ability to run any test without calling it has been dropped. I know, get over it. - Passing the planned number of tests to
casper.done()
has been dropped as well, becausedone()
may be never called at all when big troubles happen; rather use the newbegin()
method and provide the expected number of tests using the second argument:
casper.test.begin("Planning 4 tests", 4, function(test) {
[1, 2, 3, 4].forEach(function() {
test.assert(true);
});
test.done();
});
Last, all the casper test suites have been upgraded to use the new testing features, you may want to have a look at the changes.
When using PhantomJS >=1.9.0, you can now abort outgoing requests:
casper.on('page.resource.requested', function(requestData, request) {
if (requestData.url.indexOf('http://adserver.com') === 0) {
request.abort();
}
});
- heavy lifting of casperjs bootstrap script
- fixed #387 - Setting viewport isn't quite synchronous
- fixed #410 - trigger
mousedown
andmousedown
events on click - fixed #433 -
assertField("field", "")
will always pass even though thefield
doesn't exist - closed #392 -
--direct
&--log-level
options available for thecasperjs
executable - closed #350 - Add a
Casper#waitForSelectorTextChange()
method - Added
Casper#bypass
,Casper#thenBypass
,Casper#thenBypassIf
,Casper#thenBypassUnless
methods - Added
Tester#skip
method - Added
Casper#eachThen()
- merged #427 - Added
keepFocus
option toCasper#sendKeys()
- fixed #441 - added
--ssl-protocol
option support to thecasperjs
executable - fixed #452 - allow uppercase http methods in
Casper#open()
- Added
Casper#fillSelectors()
andCasper#fillXPath()
- Added
Casper#getElementsAttribute()
andCasper#getElementsInfo()
- Added
Casper#waitForUrl()
- Added support for key modifiers to
Casper#sendKeys()
cli
: Now dropping an arg or an option will be reflected in their raw equivalentcli.get()
now supports fallback values
- fixed #431 - fix for visible/waitUntilVisible when selector matches multiple elements
- fixed #370 - mergeObjects failed to deep-clone when the target object did not contain the corresponding key
- fixed #375 - Fixes a bug with getting form values for radio inputs, and introduces a minor optimization to avoid processing the same form fields more than once.
- closed #373 - added RegExp support to
Casper.waitForText()
- fixed #368 - Remote JS error is thrown when a click target is missing after
click()
- merged PR #357 - fire the
input
event after setting input value (required to support angular.js apps)
- fixed #336 - Test result duration may have an exotic value
- Added
casper.mouse.doubleclick()
- fixed #343 - Better script checks
- fixed an edge case with xunit export when
phantom.casperScript
may be not defined
- PhantomJS 1.6.x support has been dropped. Both PhantomJS 1.7 & 1.8 will be supported.
- the deprecated
injector
module has been removed from the codebase (RIP dude) - a
1.0
maintenance branch has been created - CasperJS 1.1 development is now taking place on the
master
branch
- fixed
page.initialized
event didn't get the initializedWebPage
instance - fixed a bug preventing
Casper.options.onPageInitialized()
from being called - fixed #215 - fixed broken
--fail-fast
option creating an endless loop on error - fixed
Tester.renderFailureDetails()
which couldn't print failure details correctly in certain circumstances - fixed
Casper.getHTML()
wasn't retrieving active frame contents when usingCasper.withFrame()
- fixed #327 - event handler for
page.confirm
always returns true - merged PR #322 - Support number in
Casper.withFrame()
- fixed #323 -
thenEvaluate()
should be updated to take the same parameters asevaluate()
, while maintaining backwards compatibility. - merged PR #319, fixed #209 - test duration has been added to XUnit XML result file.
Casper.userAgent()
does not require the instance to be started anymore- dubious tests now have dedicated color & styling
- added hint printing when a possible
casperjs
command call is detected
I'm still expecting a 1.0 stable for Christmas. Feedback: bring it on.
A minimal convenient API has been added to Casper in order to ease the switch of current page context:
casper.start('tests/site/frames.html', function() {
this.test.assertTitle('CasperJS frameset');
});
casper.withFrame('frame1', function() {
this.test.assertTitle('CasperJS frame 1');
});
casper.then(function() {
this.test.assertTitle('CasperJS frameset');
});
Native mouse events didn't play well with (i)frames, because the computed element coordinates of the clicked element were erroneous.
So programmatic mouse events are reintroduced back into this corrective RC until a better solution is found.
- merged #269 - Windows Batch script: fixed unsupported spaces in path and argument splitting
I told you there won't be an 1.0.0-RC5? I lied. Expect 1.0 stable for Christmas, probably.
Casper.evaluate()
method signature is now compatible with PhantomJS' one, so you can now write:
casper.evaluate(function(a, b) {
return a === "foo" && b === "bar";
}, "foo", "bar"); // true
The old way to pass arguments has been kept backward compatible in order not to break your existing scripts though:
casper.evaluate(function(a, b) {
return a === "foo" && b === "bar";
}, {a: "foo", b: "bar"}); // true
In order to check that every planned test has actuall been executed, a new optional planned
parameter has been added to Tester.done()
:
casper.test.assert(true);
casper.test.assert(true);
casper.test.assert(true);
casper.test.done(4);
Will trigger a failure:
fail: 4 tests planned, 3 tests executed.
That's especially useful in case a given test script is abruptly interrupted leaving you with no obvious way to know it and an erroneous success status.
The whole CapserJS test suite has been migrated to use this new feature.
PhantomJS 1.7 ships with support for new opened pages — aka popups. CasperJS can now wait for a popup to be opened and loaded to react accordingly using the new Casper.waitForPopup()
and Casper.withPopup()
methods:
casper.start('http://foo.bar/').then(function() {
this.test.assertTitle('Main page title');
this.clickLabel('Open me a popup');
});
// this will wait for the popup to be opened and loaded
casper.waitForPopup(/popup\.html$/, function() {
this.test.assertEquals(this.popups.length, 1);
});
// this will set the popup DOM as the main active one only for time the
// step closure being executed
casper.withPopup(/popup\.html$/, function() {
this.test.assertTitle('Popup title');
});
// next step will automatically revert the current page to the initial one
casper.then(function() {
this.test.assertTitle('Main page title');
});
Native mouse events from PhantomJS bring a far more accurate behavior.
Also, Casper.mouseEvent()
will now directly trigger an error on failure instead of just logging an error
event.
- fixed #308 & #309 - proper module error backtraces
- fixed #306 - Raise an explicit error on invalid test path
- fixed #300 - Ensure that
findOne()
andfindAll()
observe the scope for XPath expressions, not just when passed CSS selectors - fixed #294 - Automatically fail test on any runtime error or timeout
- fixed #281 -
Casper.evaluate()
should take an array as context not object - fixed #266 - Fix
tester
module and its self tests - fixed #268 - Wrong message on step timeout
- fixed #215 - added a
--fail-fast
option to thecasper test
command, in order to terminate a test suite execution as soon as any failure is encountered - fixed #274 - some headers couldn't be set
- fixed #277 - multiline support in
ClientUtils.echo()
- fixed #282 - added support for remote client scripts loading with a new
remoteScripts
casper option - fixed #290 - add a simplistic RPM spec file to make it easier to (un)install casperjs
- fixed
utils.betterTypeOf()
to properly handleundefined
andnull
values - fixed
Casper.die()
andCasper.evaluateOrDie()
were not printing the error onto the console - added JSON support to
require()
- added
Tester.assertTruthy()
andTester.assertFalsy()
- added
Casper.sendKeys()
to send native keyboard events to the element matching a given selector - added
Casper.getFormValues()
to check for the field values of a given form - added
Tester.assertTextDoesntExist()
- added
Tester.assertFalse()
as an alias ofTester.assertNot()
- added
page.resource.requested
andpage.resource.received
events - added
translate.js
andtranslate.coffee
samples
Next version should be 1.0.0 stable.
- fixed #261 - Impossible to require CoffeeScript modules
- fixed #262 - Injecting clientScripts is not working
- fixed #259 - enhanced
Tester.assertField()
method, which can now tests for other field types thaninput
s. - fixed
Casper.getCurrentUrl()
could misbehave with encoded urls - added
Casper.echo()
to print a message to the casper console from the remote DOM environment - added
Casper.waitForText()
to wait for a given text to be present in page HTML contents - added
ClientUtils.getFieldValue()
- Local CoffeeScript version has been upgraded to 1.4.0
- the
injector
module is now deprecated, but kept for backward compatibility purpose. - BC BREAK: fixes #220, #237 - added a
waitTimeout
options, removeddefaultWaitTimeout
option. - BC BREAK (for the better): fixes #249 - default timeout functions don't
die()
anymore in tests - BC BREAK (for the better): merged #188 - Easy access to current response object; You can now access the current response object as the first parameter of step callbacks:
require('casper').create().start('http://www.google.fr/', function(response) {
require('utils').dump(response);
}).run();
That gives:
$ casperjs dump-headers.js
{
"contentType": "text/html; charset=UTF-8",
"headers": [
{
"name": "Date",
"value": "Thu, 18 Oct 2012 08:17:29 GMT"
},
{
"name": "Expires",
"value": "-1"
},
// ... lots of other headers
],
"id": 1,
"redirectURL": null,
"stage": "end",
"status": 200,
"statusText": "OK",
"time": "2012-10-18T08:17:37.068Z",
"url": "http://www.google.fr/"
}
To fetch a particular header by its name:
require('casper').create().start('http://www.google.fr/', function(response) {
this.echo(response.headers.get('Date'));
}).run();
That gives:
$ casperjs dump-single-header.js
Thu, 18 Oct 2012 08:26:34 GMT
The documentation has been updated accordingly.
- merged #234 - New Windows Loader written in Batch. Python is no more a requirement for using CasperJS on Windows. New installation instructions are available.
- a new
onWaitTimeout
option has been added, to allow defining a default behavior when awaitFor*
function times out. - Casper.resourceExists() and related functions now checks for non HTTP-404 received responses.
- fixed #167 - fixed opening truncated/uncomplete root urls may give erroneous HTTP statuses
- closes #205 -
debugHTML()
can have a selector passed; addedgetHTML()
- closes #230 - added
ClientUtils.getElementsBound()
andCasper.getElementsBound()
- fixed #235 - updated
Casper.evaluate()
to use phantomjs >= 1.6 native one. As a consequence, theinjector
module is marked as deprecated. - fixed #250 - prevent self tests to be run using the standard
casper test
command - fixed #254 - fix up one use of qsa, hit when filling forms with missing elements
- fixed edge case when current document url couldn't be properly decoded
- PhantomJS 1.6 is now the minimal requirement, PhantomJS 1.7 is supported.
- CasperJS continues to ship with its own implementation of CommonJS' module pattern, due to the way it has to work to offer its own executable. While the implementations are nearly the same, 100% compatibility is not guaranteed.
- fixed #119 -
Casper.currentHTTPStatus
now defaults tonull
when resource are loaded using thefile://
protocol - fixed #130 - added a
--no-colors
option to thecasper test
command to skip output coloration - fixed #153 - erroneous mouse event results when
event.preventDefault()
was used. - fixed #164 - ability to force CLI parameters as strings (see related documentation).
- fixed #178 - added
Casper.getPageContent()
to access raw page body contents on non-html received content-types. - fixed #180 - CasperJS tests are now run against a local HTTP test server. A new
casper selftest
command has been added as well. - fixed #189 - fixed invalid XML due to message colorization
- fixed #197 & #240 - Added new tester methods:
- fixed #202 - Fix test status timeouts when running multiple suites
- fixed #204 - Fix for when the url is changed via javascript
- fixed #210 - Changed
escape
toencodeURIComponent
for downloading binaries via POST - fixed #216 - Change clientutils to be able to set a global scope
- fixed #219 - ease chaining of
run()
calls (more explanations) - fixed #222 & #211 - Change mouse event to include an X + Y value for click position
- fixed #231 - added
--pre
and--post
options to thecasperjs test
command to load test files before and after the execution of testsuite - fixed #232 - symlink resolution in the ruby version of the
casperjs
executable - fixed #236 - fixed
Casper.exit
returnedthis
after callingphantom.exit()
which may caused PhantomJS to hang - fixed #252 - better form.fill() error handling
- added
ClientUtils.getDocumentHeight()
- added
toString()
andstatus()
methods toCasper
prototype.
- fixed #119 - HTTP status wasn't properly caught
- fixed #132 - added ability to include js/coffee files using a dedicated option when using the
casper test
command - fixed #140 -
casper test
now resolves local paths urls - fixed #148 -
utils.isWebPage()
was broken - fixed #149 -
ClientUtils.fill()
was searching elements globally - fixed #154 - firing the
change
event after a field value has been set - fixed #144 - added a
safeLogs
option to blur password values in debug logs. This option is set totrue
by default. - added
Casper.userAgent()
to ease a more dynamic setting of user-agent string - added
Tester.assertTitleMatch()
method - added
utils.getPropertyPath()
- added
Casper.captureBase64()
for rendering screen captures as base64 strings - closes #150 - added
Casper.reload()
- fixed failed test messages didn't expose the subject correctly
- switched to more standard
.textContent
property to get a node text; this allows a better compatibility of the clientutils bookmarklet with non-webkit browsers - casper modules now all use javascript strict mode
- added support of custom headers sending in outgoing request - refs #137)
- added support for
prompt()
andconfirm()
- closes #125 - fixed #157 - added support for PhantomJS 1.6
WebPage#zoomFactor
- added
url.changed
&navigation.requested
events - refs #151
- fixed #73 -
Casper.download()
not working correctly with binaries - fixed #129 - Can't put
//
comments in evaluate() function - closed #130 - Added a
Dummy
colorizer class, in order to disable colors in console output - fixed #133 - updated and fixed documentation about extensibility
- added
Casper.clickLabel()
for clicking on an element found by itsinnerText
content
As a side note, the official website monolithic page has been split across several ones: http://casperjs.org/
- BC BREAK: PhantomJS 1.5 is now the minimal PhantomJS version supported.
- fixed #114 - ensured client-side utils are injected before any
evaluate()
call - merged #89 - Support for more mouse events (@nrabinowitz)
- added a new
error
event, better error reporting - fixed #117 -
fill()
coulnd'tsubmit()
a form with a submit input named submit - merged #122 - allow downloads to be triggered by more than just
GET
requests - closed #57 - added context to emitted test events + complete assertion framework refactor
- fixed loaded resources array is now reset adequately reference discussion
- fixed incomplete error message logged when passed an erroneous selector (xpath and css)
- added support for XPath selectors
- added
Tester.assertNotEquals()
(@juliangruber) - fixed #109 - CLI args containing
=
(equals sign) were not being parsed properly
- fixes #107: client utils were possibly not yet being injected and available when calling
Capser.base64encode()
from some events - merged PR #96: make python launcher use
os.execvp()
instead ofsubprocess.Popen()
(@jart):This patch fixes a bug where casperjs' python launcher process won't pass along kill signals to the phantomjs subprocess. This patch works by using an exec system call which causes the phantomjs subprocess to completely replace the casperjs parent process (while maintaining the same pid). This patch also has the added benefit of saving 10 megs or so of memory because the python process is discarded.
- fixes #109 - CLI args containing
=
(equals sign) were not parsed properly - fixes #100 & #110 - googlepagination sample was broken
- merged #103 - added
Tester.assertNotEquals
method (@juliangruber)
- BC BREAK:: moved the
page.initialized
event to where it should have always been, and is now using native phantomjsonInitialized
event - fixed #95 -
Tester.assertSelectorExists
was broken
- BC BREAK: reverted 8347278 (refs #34 and added a new
clear()
method to close a page You now have to callcasper.clear()
if you want to stop javascript execution within the remote DOM environment. - BC BREAK: removed
fallbackToHref
option handling inClientUtils.click()
(refs #63) tester.findTestFiles()
now returns results in predictable order- added
--log-level
and--direct
options tocasper test
command - fixed 0.6.4 version number in
bootstrap.js
- centralized version number to package.json
- ensured compatibility with PhantomJS 1.5
- fixed
casperjs
command wasn't passing phantomjs native option in the correct order, resulting them not being taken into account by phantomjs engine: - fixed Python3 compatibility of the
casperjs
executable
- fixed #48 - XML Output file doesn't have classpath populated with file name
- refs #46 - added value details to Tester
fail
event - new site design, new domain, enhanced & updated docs
-
fixed #41 - injecting casperjs lib crashes
cmd.exe
on Windows 7 -
fixed #42 - Use file name of test script as 'classname' in JUnit XML report (@mpeltonen)
-
fixed #43 - Exit status not reported back to caller
-
suppressed colorized output syntax for windows; was making output hard to read
-
added patchy
fs.isWindows()
method -
added
--xunit=<filename>
cli option to$ casperjs test
command for saving xunit results, eg.:$ casperjs test tests/suites --xunit=build-result.xml
- restablished js-emulated click simulation first, then native QtWebKit events as a fallback; some real world testing have surprinsingly proven the former being often more efficient than the latter
- fixed casperjs executable could not handle a
PHANTOMJS_EXECUTABLE
containing spaces - fixed casper could not be used without the executable as documented
- fixed wrong
debug
log level onClientUtils.click()
error; set toerror
Please check the updated documentation.
- BC BREAK:
Casper.click()
now uses native Webkit mouse events instead of previous crazy utopic javascript emulation - BC BREAK: All errors thrown by CasperJS core are of the new
CasperError
type - BC BREAK: removed obsolete
replaceFunctionPlaceholders()
- Deprecated:
Casper.extend()
method has been deprecated; use natural javascript extension mechanisms instead (see samples) - added
$ casperjs test
command for running split test suites Casper.open()
can now perform HTTPGET
,POST
,PUT
,DELETE
andHEAD
operations- commonjs/nodejs-like module exports implementation
- ported nodejs'
events
module to casperjs; lots of events added, plus some value filtering capabilities - introduced the
mouse
module to handle native Webkit mouse events - added support for
RegExp
input inCasper.resourceExists()
- added printing of source file path for any uncaught exception printed onto the console
- added an emulation of stack trace printing (but PhantomJS will have to upgrade its javascript engine for it to be fully working though)
Please check the updated documentation.
- merged PR #30 - Add request method and request data to the
base64encode()
method (@jasonlfunk) casperjs
executable now gracefully exists on KeyboardInterrupt- added
Casper.download()
method, for downloading any resource and save it onto the filesystem
- fixed #31 - replaced bash executable script by a Python one
- first numbered version