我正在努力创造一个更便宜但我有严重的问题。
它是一个多帧网站,我现在只是被卡住了。我需要点击左侧菜单框中的每个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
});
答案 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'));
我不确定它是否传统,但这是一个开始。