Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Casperjs click()不';无法正确触发单击事件_Javascript_Ajax_Click_Casperjs_Image Loading - Fatal编程技术网

Javascript Casperjs click()不';无法正确触发单击事件

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控制台中单击(),图像将被导航并正确下载。然而,

我正在使用CasperJS进行web抓取,但是在抓取下面描述的页面时遇到了一些问题

页面的html如下所示:

<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");