Javascript 函数中的CasperJS querySelectorAll(变量)不返回任何结果

Javascript 函数中的CasperJS querySelectorAll(变量)不返回任何结果,javascript,phantomjs,casperjs,selectors-api,Javascript,Phantomjs,Casperjs,Selectors Api,我正在编写一个网站刮板,从一个没有实际链接、只有可点击文本的ajax网站上抓取一些特定内容。我现在只使用javascript大约一个星期了,我正在使用CasperJS,因为它将减少很多工作 我发现的问题是,我正在编写多个函数,它们都做相同的事情,只是根据它所在的页面搜索不同的链接。 因此,我: function getLinks() { var links = document.querySelectorAll('div.AjaxLink h3'); return Array.p

我正在编写一个网站刮板,从一个没有实际链接、只有可点击文本的ajax网站上抓取一些特定内容。我现在只使用javascript大约一个星期了,我正在使用CasperJS,因为它将减少很多工作

我发现的问题是,我正在编写多个函数,它们都做相同的事情,只是根据它所在的页面搜索不同的链接。 因此,我:

function getLinks() {
    var links = document.querySelectorAll('div.AjaxLink h3');
    return Array.prototype.map.call(links, function(link) {
        return link.innerText;
    });
}
其运行方式为:

casper.then(function() {
    var myLinks = this.evaulate(getLinks);
    /* ... link manipulation code code ... */
});
这个很好用。很明显,我不希望有半打函数只是有一个不同的查询字符串。所以我想做的是:

function getLinks(findText) {
    var links = document.querySelectorAll(findText);
    return Array.prototype.map.call(links, function(link) {
        return link.innerText;
    });
}
然后我尝试通过以下方式运行它:

casper.then(function() {
    var myLinks = getLinks('div.AjaxLink h3');
    /* ... link manipulation code code ... */
});
findText变量已正确传入,但查询选择器似乎始终返回空节点列表


我做错了什么?document是在该函数中创建的空文档吗?

CasperJS构建在PhantomJS之上。PhantomJS有两个上下文。可通过访问的沙盒页面上下文和可访问
的外部上下文需要
幻影
。奇怪的是,这两个上下文都可以访问
窗口
文档
,但是
文档
在外部上下文中没有任何意义,因为DOM是空的。这就是为什么
querySelectorAll()
找不到元素的原因。只能通过
evaluate()
访问页面DOM

因此,您需要在中执行函数。函数的附加参数被传递到
evaluate()
中,而不是传递给函数:

function getLinks(findText) {
    ...
}

casper.then(function() {
    var myLinks = this.evaluate(getLinks, 'div.AjaxLink h3'); // THIS
    ...
});
页面底部还有一个重要提示:

注意:参数和
evaluate
函数的返回值必须是一个简单的原语对象。经验法则:如果可以通过JSON对其进行序列化,那么就可以了

闭包、函数、DOM节点等将无法工作