PhantomJS
CasperJS
&
Other Automated Testing Tools
PhantomJS
What is it?
- Headless version of Webkit
- Window-less, command line web browser
- Programmable through JavaScript
- Supports WebDriver out of the box
PhantomJS
How do I get it?
- Install Node.js
- sudo npm install -g phantomjs
- (http://phantomjs.org/)
PhantomJS
How do I use it?
var page = require('webpage').create();
page.open('http://www.google.com/', function (status) {
// Page is loaded. Output content.
console.log(page.content);
phantom.exit();
});
> phantomjs myscript.js
PhantomJS
What else can I do?
- Inject/execute arbitrary JS code
- Perform actions
- Take screenshots
- Monitor performance
PhantomJS
That’s nice, but I’m interested in testing...
- PhantomJS is not a test framework. It’s the browser.
- But there are LOTS of frameworks available
- Mocha, Karma, Jasmine, & many more (check website)
- WebDriver support built in via --webdriver=PORT
- CasperJS!
CasperJS
What is it?
- API & test framework layer on top of PhantomJS
- Provides all the things you’re used to:
- Clicking, Typing, Waiting, Assertions, etc.
- Events, screenshots (even specific elements), & more.
CasperJS
How do I get it?
- Install Node.js
- sudo npm install -g casperjs
- (http://casperjs.org/)
CasperJS
How do I use it?
var casper = require('casper').create();
casper.start('http://google.com/', function() {
this.fill('form[action="/search"]', { 'q': 'ghost' });
this.click('#gbqfba');
});
casper.then(function() {
this.echo(this.getTitle());
});
casper.run();
> casperjs myscript.js
CasperJS
How do I use it?
var casper = require('casper').create();
casper.test.begin('Google tests', 1, function(test) {
casper.start('http://www.google.com/', function() {
test.assertTitleMatch(/Google/, 'Title contains Google');
}).run(function() {
test.done();
});
});
> casperjs test myscript.js
Advantages of PhantomJS/CasperJS
- High speed, low resources
- No need for VMs or external services
- Self-contained command line application
- Don’t have to worry about cache/cookies
Disadvantages of PhantomJS/CasperJS
- Lack of ecosystem!
- 1 version of webkit, and that’s it (and not even the latest)
- Good option for smoke testing (specifically JavaScript functionality), but not comprehensive testing.
How do we solve this?
- Headless versions of other browsers?
- Already underway:
- SlimerJS - Gecko/Firefox engine (Supported by CasperJS!)
- TrifleJS - Internet Explorer (For real? I think so...)
Moving Beyond Browsers:
Visual Regressions
- Developer botches a stylesheet
- Page “works” but is visually broken
- How do we catch this? Not as simple as pass/fail.
- A place to start: Awareness via screenshot comparison
Visual Regression Tools: ImageMagick
- Common open graphics package
- Comes with “compare” tool for diff’ing images
Visual Regression Tools: ImageMagick
Visual Regression Tools: ImageMagick
> compare -metric rmse form-1.png form-2.png output.png
5831.19 (0.0889782)
(0.0889 = 8.89% change)
Visual Regression Tools: Others
- PhantomCSS
- Huxley (Facebook)
- Wraith (BBC News)
- Hardy (Not screenshot-based, tests style assertions)
- SiteEffect.io (Screenshot + DOM to negate whitespace/offset issues)
Information
Justin Klemm
@justinklemm
jwklemm@gmail.com
Ghost Inspector
http://www.ghostinspector.com