2013-04-02 10 views
6

Aus irgendeinem Grund zu arbeiten, wenn ich den folgenden Code versuchen ausgeführt wird:Verwendung von XPath mit CasperJS QuerySelectorAll nicht

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

Gibt ein Null-Objekt, aber wenn verwende ich die gleichen XPath Wähler in Verbindung mit dem thenClick Methode, alles funktioniert gut und die URL ändert sich. Warum in aller Welt ist das?

Antwort

9

So stellt sich heraus, dass die Methode querySelectorAll XPath tatsächlich nicht unterstützt. Tatsächlich stammt es nicht von casperjs und wird vom Browser unterstützt, weshalb es CSS3-Selektoren und nicht XPath akzeptiert. Es war schwer für mich, das herauszufinden, also dachte ich mir, dass ich das für den Fall aufstellen würde, dass jemand anderes dieses Problem hatte. Sie müssen CSS3-Selektoren für diese innerhalb casperjs so die Zeile verwenden:

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

geändert werden muss, um:

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

Happy Hacking

+1

Es ist nicht CasperJS 'querySelectorAll()' Methode ... es ist der Browser. Die Spezifikation ist nur für die Verwendung mit CSS-Selektoren gedacht: http://www.w3.org/TR/selectors-api XPath-Ausdrücke, während sie verwendet werden, um Dinge auszuwählen, sind insgesamt eine andere Familie. – BoltClock

+0

Ah, danke für diese kleine Erklärung. Aktualisieren Sie die Antwort. –

2

Die unten Funktion funktioniert für mich mit 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'); 
}); 
}