WaitForSelector passe, mais assertExists échoue pour le même sélecteur

Lorsque j'appelle la fonction suivante, waitForSelector passe pour 'selector', mais assertExists échoue pour le même sélecteur. Comment est-ce possible?

 casper.waitForSelector(selector, function() { casper.test.assertExists(selector, sectionName + " opened up successfully."); }, function() { casper.test.fail(sectionName + " did not load in given time"); }, max_timeout); 

Voici un exemple complet pour reproduire le problème avec un sélecteur :nth-child .

Il s'agit d'un bug connu (voir # 11632 , # 11737 ) dans la fourche Qt4 de WebKit (à partir de 2010). Cela se produit lorsque :nth-child() on utilise les sélecteurs CSS3 :nth-child() ou :nth-of-type() . La deuxième fois que le sélecteur est exécuté, il renvoie un résultat différent (la plupart du temps null ). La seule solution connue est d'utiliser les expressions XPath au lieu des sélecteurs CSS3. Ce bogue est résolu dans PhantomJS 2 car il utilise une fourche Qt5 de WebKit (version 538.1).

Il s'agit d'un script minimal pour reproduire le problème sur http://example.com (modifié à partir d' ici ):

 var casper = require('casper').create(), x = require('casper').selectXPath; casper.start('http://example.com', function() { var selector = 'p:nth-child(3) > a', xpSelector = '//*[local-name()="p" and position()=3]/a'; var first = this.exists(selector); var second = this.exists(selector); if(first !== second) { console.error('Expected First selector to equal the Second'); } else { console.log('Passed'); } first = this.exists(x(xpSelector)); second = this.exists(x(xpSelector)); if(first !== second) { console.error('Expected First selector to equal the Second'); } else { console.log('Passed'); } }).run(); 

Sortie:

 Premier sélecteur attendu pour égaler le deuxième
 Passé

Le marquage est:

 <div> <h1>text</h1> <p>text</p> <p><a href="url">text</a></p> </div> 

L'expression XPath semble un peu gênante, car elle reproduit directement le comportement voulu du sélecteur CSS. Normalement, on écrirait //p[2]/a .