Javascript Casperjs click()不';无法正确触发单击事件
我正在使用CasperJS进行web抓取,但是在抓取下面描述的页面时遇到了一些问题 页面的html如下所示:Javascript Casperjs click()不';无法正确触发单击事件,javascript,ajax,click,casperjs,image-loading,Javascript,Ajax,Click,Casperjs,Image Loading,我正在使用CasperJS进行web抓取,但是在抓取下面描述的页面时遇到了一些问题 页面的html如下所示: <img id="trigger"> <img id="cur_img_xxx" class="show"> <img id="cur_img_yyy" class="cache"> 我想这是一个提高用户体验的好策略,也有助于避免网络抓取,但我还是想抓取:p 我尝试了$(“#trigger”)。在web控制台中单击(),图像将被导航并正确下载。然而,
<img id="trigger">
<img id="cur_img_xxx" class="show">
<img id="cur_img_yyy" class="cache">
我想这是一个提高用户体验的好策略,也有助于避免网络抓取,但我还是想抓取:p
我尝试了$(“#trigger”)。在web控制台中单击()
,图像将被导航并正确下载。然而,当我尝试使用CasperJS模拟这个过程时,导航和图像下载都不起作用。请参阅代码:
var casper = require ("casper").create({
clientScripts: [
'include/jquery.js'
],
pageSettings: {
loadImages: false, // this won't affect since this will only forbid
loadPlugins: false // inline imgs from loading, but all imgs in this
}, // page are loaded dynamically
verbose: true
});
casper.start("http://www.example.com/1234.html");
casper.then(function () {
console.log("Connected! Current Url = " + this.getCurrentUrl());
});
casper.then(function () {
// findInitialImgs will find imgs that have already been loaded
imgs = this.evaluate(findInitialImgs);
this.waitForSelector("#image_trigger").thenClick("#image_trigger");
var next = this.evaluate(function () {
return $("img[id^='cur_img_']").last().attr("href");
});
console.log(next);
});
casper.run(function () {
this.echo('End').exit();
});
在右侧,单击
“#触发器”
后,最后一个条目将不同,即从
变为
。但是,next
仍然保持
。我做错什么了吗?你如何确认什么都没有发生?所有wait*()
和then*()
函数都是异步步进函数,但evaluate
不是,因此它在其他两个函数之前执行。您需要将最后一个evaluate
调用包装在然后
块中,以确保包含它的步骤在单击后执行
由于图像加载可能是异步执行的,因此您需要将最后一个evaluate
调用包装在wait
块中,并使用较短的等待时间:
casper.then(function () {
// findInitialImgs will find imgs that have already been loaded
imgs = this.evaluate(findInitialImgs);
this.waitForSelector("#image_trigger")
.thenClick("#image_trigger")
.wait(1000, function(){
var next = this.evaluate(function () {
return $("img[id^='cur_img_']").last()[0].id;
});
console.log(next);
});
});
请注意,您不能将DOM节点传递出页面上下文(evaluate()
),因此需要使用某种表示形式。这里我使用了最后一个元素的id
For(casper.evaluate()
只是PhantomJS的一个包装器,page.evaluate()
):
注意:参数和evaluate
函数的返回值必须是一个简单的原语对象。经验法则:如果可以通过JSON对其进行序列化,那么就可以了
闭包、函数、DOM节点等将无法工作强>
这似乎是JQuery的问题。在我删除了
JQuery
injection并将$(“img[id^='cur\u img\u'])更改为.last().attr(“href”)
之后
var imgs = document.querySelectorAll("img[id^='cur_img_']");
return imgs[imgs.length - 1].getAttribute("href");
一切正常
然后我发现这个答案非常有力:
因此,当您将
JQuery
注入使用$
作为JQuery
的页面时,确认原始脚本将被破坏。我编辑了上面的问题,以显示我是如何验证没有发生任何事情的。我会接受你的建议试试:)我已经用一个例子扩展了我的答案,并解决了一个我以前没有注意到的问题。哦,表达不清楚是我的错。在代码中应该是$(“img[id^='cur\u img'])。last().attr(“href”)
。很抱歉:`(
var imgs = document.querySelectorAll("img[id^='cur_img_']");
return imgs[imgs.length - 1].getAttribute("href");