Attendre le changement d'URL dans Casper.js?

Il existe une fonctionnalité waitForUrl() dans Casper.js , mais est-il possible waitForUrlChange() dans Casper.js ?

Je veux dire détecter un changement dans cette this.getCurrentUrl() . Je ne peux pas prédire la nouvelle valeur url. Cela peut être n'importe quoi.

Non intégré, mais vous pouvez écrire votre propre très facile:

 casper.waitForUrlChange = function(then, onTimeout, timeout){ var oldUrl; this.then(function(){ oldUrl = this.getCurrentUrl(); }).waitFor(function check(){ return oldUrl === this.getCurrentUrl(); }, then, onTimeout, timeout); return this; }; 

Il s'agit d'une extension de fonction appropriée, car elle a la même sémantique que les autres fonctions d' wait* (les arguments sont facultatifs et il attend) et il prend en charge le modèle de création (également appelé pattern de promesse par certains).

Comme mentionné par Darren Cook, on pourrait améliorer cela en vérifiant si waitForUrlChange existe déjà dans CasperJS et en utilisant une liste d'arguments dynamiques pour quand CasperJS change son API:

 if (!casper.waitForUrlChange) { casper.waitForUrlChange = function(){ var oldUrl; // add the check function to the beginning of the arguments... Array.prototype.unshift.call(arguments, function check(){ return oldUrl === this.getCurrentUrl(); }); this.then(function(){ oldUrl = this.getCurrentUrl(); }); this.waitFor.apply(this, arguments); return this; }; } 

Il y a un gestionnaire d'événements pour cela

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

Voici la documentation pour cela: http://casperjs.readthedocs.org/en/latest/events-filters.html#url-changed

Cependant, comme l'a mentionné Artjom B., cela ne couvrira pas tous les cas qu'une extension de fonction permettrait. Il est vraiment approprié lorsque vous n'avez pas besoin de cela dans le cadre du flux de contrôle, mais souhaitez simplement réagir de façon réactive à certaines valeurs lorsque cela se produit.