2013-04-02 13 views
6

Per qualche ragione quando provo eseguire il codice seguente:Uso XPath con CasperJS querySelectorAll non funzionante

var casper = require('casper').create(); 
var x = require('casper').selectXPath; 
var links = []; 

casper.start('http://www.website.com'); 

function getLinks() { 
    var links = document.querySelectorAll(x('//*[@id="horizontalList"]/li[@class="paddingRight6"]/a'); 
    return Array.prototype.map.call(links, function(e) { 
     return e.getAttribute('href') 
    }); 
} 

casper.then(function() { 
    links = this.evaluate(getLinks); 
    this.echo(links); 
} 

casper.run(); 

restituisce un oggetto nullo, ma quando uso la stessa selettore xpath in combinazione con il metodo thenClick, tutto funziona bene e l'URL cambia. Perché mai?

risposta

9

Quindi, il metodo querySelectorAll non supporta effettivamente XPath. Infatti non proviene affatto da casperjs ed è supportato dal browser, che è il motivo per cui accetta i selettori CSS3 e non XPath. È stato difficile per me capirlo, quindi ho pensato di metterlo nel caso in cui qualcun altro avesse avuto questo problema. Devi usare selettori CSS3 per questo all'interno casperjs così la linea:

var links = document.querySelectorAll(x('//*[@id="horizontalList"]/li[@class="paddingRight6"]/a'); 

deve essere cambiato in:

var links = document.querySelectorAll('ul#horizontalList li.paddingRight6 a'); 

Felice l'hacking

+1

Non è il metodo 'querySelectorAll()' di CasperJS ... è il browser. Le specifiche sono progettate solo per l'uso con selettori CSS: http://www.w3.org/TR/selectors-api Le espressioni XPath, mentre sono usate per selezionare le cose, sono una famiglia completamente diversa. – BoltClock

+0

Ah, grazie per quel po 'di chiarimenti. Aggiorna la risposta. –

2

La funzione di seguito lavora per me con XPath.

function getLinks() { 
var links =__utils__.getElementsByXPath('//*[@id="horizontalList"]/li[@class="paddingRight6"]/a'); 
    return Array.prototype.map.call(links, function(e) { 
    return e.getAttribute('href'); 
}); 
}