2013-04-02 9 views
6

Z jakiegoś powodu, gdy próbuję uruchomiony następujący kod:Korzystanie XPath z CasperJS QuerySelectorAll nie działa

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(); 

zwraca obiekt zerowy, ale kiedy używam bardzo sam selektor xpath w związku ze sposobem thenClick, wszystko działa dobrze i zmiany adresu URL. Dlaczego na tym koniec?

Odpowiedz

9

Okazuje się, że metoda querySelectorAll w rzeczywistości nie obsługuje XPath. W rzeczywistości wcale nie pochodzi od casperjs i jest obsługiwany przez przeglądarkę, dlatego akceptuje selektory CSS3, a nie XPath. Trudno było mi to rozgryźć, więc pomyślałem, że podniosę to na wypadek, gdyby ktoś inny miał ten problem. Musisz użyć selektorów CSS3 dla tego ciągu casperjs więc linii:

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

musi być zmieniony na:

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

Szczęśliwy hacking

+1

To nie jest metoda 'querySelectorAll()' CasperJS ... to przeglądarka. Spec jest przeznaczony tylko do użycia z selektorami CSS: http://www.w3.org/TR/selectors-api Wyrażenia XPath, podczas gdy są używane do wybierania rzeczy, są zupełnie inną rodziną. – BoltClock

+0

Ah, dzięki za tę odrobinę wyjaśnienia. Zaktualizuj odpowiedź. –

2

Poniższa funkcja działa dla mnie z 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'); 
}); 
} 
Powiązane problemy