Javascript CasperJS脚本找不到使用querySelectorAll找到的元素

Javascript CasperJS脚本找不到使用querySelectorAll找到的元素,javascript,phantomjs,casperjs,Javascript,Phantomjs,Casperjs,我试图创造一个替罪羊,但我有严重的问题 这是一个多帧的网站,我现在被卡住了。我需要点击左菜单框中的每个h2、h3或h4,以加载右菜单框中的正确信息,从而实际获取有用的数据 然而,在我收集了所有的头ID之后,我似乎永远无法以任何方式访问它们。尽管链接数组中有1042个ID,但this.exists调用显示false。我做错了什么 这是我第一次尝试使用casperjs var links = []; var casper = require('casper').create(); functio

我试图创造一个替罪羊,但我有严重的问题

这是一个多帧的网站,我现在被卡住了。我需要点击左菜单框中的每个h2、h3或h4,以加载右菜单框中的正确信息,从而实际获取有用的数据

然而,在我收集了所有的头ID之后,我似乎永远无法以任何方式访问它们。尽管链接数组中有1042个ID,但this.exists调用显示false。我做错了什么

这是我第一次尝试使用casperjs

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


function getHeaderLinks() {
    var links = document.querySelectorAll('h2,h3,h4');
    return Array.prototype.map.call(links, function(e) {
        return '#'+e.getAttribute('id');
    });
}


casper.start('http://www.example.com', function() {

});


casper.then(function() {
    // aggregate results for the 'phantomjs' search
    this.page.switchToChildFrame("MidFrame");
    this.page.switchToChildFrame("MenuFrame");

    links = links.concat(this.evaluate(getHeaderLinks));
    this.echo(links.length);

    for (var i = 0; i < links.length; i++) {
        this.echo(links[i]);
        this.page.switchToChildFrame("MidFrame");
        this.page.switchToChildFrame("MenuFrame");      
        this.echo(this.exists(links[i]),'found');
    }


});



casper.run(function() {
    // echo results in some pretty fashion

});
var-links=[];
var casper=require('casper').create();
函数getHeaderLinks(){
var links=document.querySelectorAll('h2,h3,h4');
返回Array.prototype.map.call(链接,函数(e){
返回“#”+e.getAttribute('id');
});
}
卡斯珀,开始http://www.example.com,函数(){
});
casper.then(函数(){
//“phantomjs”搜索的聚合结果
此.page.switchToChildFrame(“中间帧”);
此.page.switchToChildFrame(“菜单框”);
links=links.concat(this.evaluate(getHeaderLinks));
this.echo(links.length);
对于(变量i=0;i
我有个主意。如果可以在evaluate中获取元素,则可以对其执行fireEvent。因此,创建一个函数,该函数将引发fireEvent

    function casperFireEvent(element, eventType) {
        if ("createEvent" in document) {
            var evt = document.createEvent("HTMLEvents");
            evt.initEvent(eventType, false, true);
            element.dispatchEvent(evt);
        } else {
            element.fireEvent("on"+eventType);
        }
    }
然后在循环中可以执行以下操作:

   this.evaluate(casperFireEvent(document.getElementById('links[i]'), 'click')); 

我不确定它是否传统,但这只是一个开始。

我认为您不需要添加此项。page.switchToChildFrame(“中间帧”);此.page.switchToChildFrame(“菜单框”);消息灵通的尝试不使用这两行。这将导致找不到任何链接。站点在帧中有多个帧。我只能在转到特定帧时访问链接。但是,exists不起作用……我的意思是保留前两行并删除for循环中的行。事实上,在循环中,你已经在画面中了;我把它拿出来了,还是一样的。你是对的,那不需要在那里,但它没有做任何改变。它最初是在那里的,因为在每个循环中,它都应该转到不同的框架来从主页上刮取信息,然后返回到菜单框架来单击下一个菜单项。仅供参考,我打开了详细日志记录,并得到了错误,例如[error][remote]findAll():提供的选择器无效“570_572_612_612-1”:Error:SYNTAX_ERR:DOM Exception 12我已验证570_572_612_-1是正确的IDNo骰子。。。TypeError:“undefined”不是函数(计算“casper.firevent('document.getElementById('+links[i]+'),'click'))我忘记了一个括号,我认为真正的问题如下。我似乎无法在javascript和casperjs之间传递参数。每次尝试传递参数时,都会出现未定义的情况。所有带参数的javascript函数调用都失败。有没有人能举一个很好的例子来说明我是如何获取参数的。evaluate(casperfirevent(document.getElementById('links[i]'),'click'));评估(casperFireEvent('document.getElementById('+links[i]+'),'click'));evaluate(casperfirevent(document.getElementById('570_572_612_-1'),'click'));还有很多其他的组合。都是未定义的