CasperJS脚本无法使用querySelectorAll查找存在IT的元素

时间:2014-01-26 17:23:57

标签: javascript phantomjs casperjs

我正在努力创造一个更便宜但我有严重的问题。

它是一个多帧网站,我现在只是被卡住了。我需要点击左侧菜单框中的每个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

});

1 个答案:

答案 0 :(得分:0)

我有个主意。如果你可以在评估中获得元素,你可以在它上面使用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')); 

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