使用XPath与CasperJS QuerySelectorAll不工作



由于某些原因,当我尝试运行以下代码时:

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

返回一个空对象,但是当我将相同的xpath选择器与thenClick方法结合使用时,一切都工作正常,url发生了变化。这到底是为什么?

所以,querySelectorAll方法实际上并不支持XPath。事实上,它根本不是来自casperjs,而是由浏览器支持的,这就是为什么它接受CSS3选择器,而不是XPath。这对我来说很难弄清楚,所以我想我应该把这个放在上面以防其他人有这个问题。你必须在casperjs中使用CSS3选择器所以这一行:

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

需要修改为:

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

快乐黑客

下面的函数适用于我的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');
});
}

最新更新