Slide 1

Slide 1 text

Le Web au doigt et à l’œil avec CasperJS

Slide 2

Slide 2 text

Au doigt et à l’œil on te dit. (OLD!)

Slide 3

Slide 3 text

PhantomJS • Navigateur headless • Basé sur Webkit • Pilotable en ligne de commande (brr) • API full Javascript (brr^2)

Slide 4

Slide 4 text

JAVASCRIPT

Slide 5

Slide 5 text

PhantomJS var  page  =  require('webpage').create(); page.open('http://google.fr/',  function(status)  {        if  (status  !==  "success")  {                console.error('loading  failed');                phantom.exit();        }        console.log(page.evaluate(function()  {                return  document.title;        }));        phantom.exit(); });

Slide 6

Slide 6 text

PhantomJS $  phantomjs  phantom-­‐simple.js   Google

Slide 7

Slide 7 text

PhantomJS var  page  =  require('webpage').create(); page.open('http://sudweb.fr/2012/schedule/conferences/',  function(status)  {        if  (status  !==  "success")  {                console.error('loading  failed');                phantom.exit();        }        var  sessions  =  page.evaluate(function()  {                var  sessions  =  document.querySelectorAll('.schedule-­‐item');                return  Array.prototype.map.call(sessions,  function(node)  {                        return  {                                title:  node.querySelector('a').innerText.trim(),                                schedule:  node.querySelector('.schedule-­‐item-­‐timeframe')                                        .innerText.trim()                        };                });        });        console.log(JSON.stringify(sessions,  null,  4));        phantom.exit(); });

Slide 8

Slide 8 text

PhantomJS $  phantomjs  phantomjs-­‐sudweb.js [        {                "schedule":  "09h30",                "title":  "Mais  un  lead  dev,  c’est  quoi  ?"        },        {                "schedule":  "10h00",                "title":  "L’Open  Web  en  tant  que  pierre  angulaire  du  développement  multi-­‐objets"        },        //  ...  skipped        {                "schedule":  "16h40",                "title":  "CSS3  with  a  safety  net"        },        {                "schedule":  "17h10",                "title":  "Intégrateur,  lève-­‐toi  et  conçois  !"        },        {                "schedule":  "17h40",                "title":  "L’altruisme  pour  votre  bénéfice"        },        {                "schedule":  "18h15",                "title":  "Questions  à  l’ombre"        } ]

Slide 9

Slide 9 text

Oui, bon, mais • Comment on clique ? • Comment on interagit avec la page ? • Comment on enchaîne ces interactions ? • Comment on vérifie des trucs ? • D’où vient le vent ?

Slide 10

Slide 10 text

Pyramides de l’Enfer™

Slide 11

Slide 11 text

Pyramides de l’Enfer™ var  page  =  require('webpage').create(); page.open(url1,  function(status)  {        if  (status  ==  "fail")  phantom.exit();        page.open(url2,  function(status)  {                if  (status  ==  "fail")  phantom.exit();                page.open(url3,  function(status)  {                        if  (status  ==  "fail")  phantom.exit();                        page.open(url4,  function(status)  {                                if  (status  ==  "fail")  phantom.exit();                                //  Can  I  stop,  now?                        });                });        }); });

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

CasperJS • CasperJS est basé sur PhantomJS • Rajoute une API haut niveau par dessus : • simplifiant la gestion de l’asynchronicité (hou le vilain mot) • fournit des méthodes pour interagir avec la page • facilitant la création de scénarios de navigation • permet la création de tests fonctionnels

Slide 14

Slide 14 text

Asynchronicité var  casper  =  require('casper').create(); casper.on('load.finished',  function(status)  {        if  (status  ===  "fail")  {                this.echo("failed  to  load  page").exit();        } }); casper.start(url1); casper.thenOpen(url2); casper.thenOpen(url3); casper.thenOpen(url4); casper.run();

Slide 15

Slide 15 text

Click var  casper  =  require('casper').create() ,  startUrl  =  'http://sudweb.fr/2012/schedule/conferences/'; casper.start(startUrl,  function(status)  {        this.echo(this.getCurrentUrl());        this.click('h2  a[href*=casperjs]'); }); casper.then(function()  {        this.echo(this.getCurrentUrl()); }); casper.run(); $  casperjs  click.js   http://sudweb.fr/2012/schedule/conferences/ http://sudweb.fr/2012/talk/le-­‐web-­‐au-­‐doigt-­‐et-­‐a-­‐loeil-­‐avec-­‐ casperjs/

Slide 16

Slide 16 text

Tests casper.start('http://sudweb.fr/2012/',  function(status)  {        this.test.assertHttpStatus(200,  'Site  looks  to  be  up');        this.test.assertMatch(this.getTitle(),  /Toulouse/,                  'Event  is  located  in  Toulouse'); }); casper.thenClick('#menu-­‐item-­‐47  a',  function()  {        this.test.assertTitle('Programme  —  Sud  Web',                  'Link  to  schedule  is  ok');        this.test.assertEvalEquals(function()  {                return  __utils__.findAll('.schedule-­‐item').length;        },  3,  '3  main  events  are  listed'); }); casper.run(function()  {        this.test.done(); });

Slide 17

Slide 17 text

Tests On peut même exporter les résultats des tests au format XUnit —> intégration continue

Slide 18

Slide 18 text

Documentation

Slide 19

Slide 19 text

Limitations • Webkit only - CasperJS ne remplace donc pas Selenium • Pas d’interface graphique • Nécessité de s’abstraire du visuel pour concevoir ses scripts • Vos meilleurs alliés : Firebug, consoles et autres inspecteurs Gadget Web • CasperJS propose un Bookmarklet

Slide 20

Slide 20 text

Easter eggs • Rapide ! • CasperJS vous (ré)apprend Javascript • CasperJS vous (ré)apprend le DOM • CasperJS vous (ré)apprend le Web • … et souvent à mieux connaître votre propre site

Slide 21

Slide 21 text

casperjs.org