1

我有一个可用的 casperjs 脚本,但它仅在大约 50% 的时间内成功执行 $.ajax 调用。

我知道它正在工作,因为当它工作时,我可以看到新数据显示在我的 api 日志中,并且我可以看到数据库中更新的字段。在失败的尝试中,我的 api 上没有任何活动,所以它似乎甚至没有触发 ajax 调用。什么会导致这个 ajax 调用只在某些时候起作用?casper 日志行总是返回 null,即使它确实更新了我的 db 字段。这是代码片段。我使用 GET 因为它是跨域的。

casper.then(function() {
    // Needs local copy of jquery right?
    this.page.injectJs('C:/jquery.min.js');

    response = this.evaluate(function() {

    var params = { "stuffIWantToSave" : "1000" };
    var foo = $.ajax({
      type: "GET",
      data: params,
      url: 'http://api.mysite.com/update',
      success: function (data) {
        return data;
      },
      error: function (xhr,status,error){
        return error;
      }
    }); // end $.ajax call
  }); // end this.evaluate

  casper.log('Ajax response:', 'info');
  casper.log(JSON.stringify(foo), 'info');

  this.die('End');

});// end casper.then(function()

我是 casperjs 的新手,所以我很感激指出我的代码中的任何其他错误。谢谢。

4

1 回答 1

0

在调用之前,jQuery 有可能不会被注入到页面中evaluate()

要测试是否是这种情况,您可以将以下内容放在脚本的顶部,它会让您知道远程页面上是否有任何错误。

casper.on("page.error", function(msg, trace) {
    this.echo("Error: " + msg, "ERROR");
});

如果是这种情况,您可以将注入移动到另一个then()块中

casper.then(function() {
    this.page.injectJs('C:/jquery.min.js');
});

casper.then(function() {
    response = this.evaluate(function() {
        . . .
    });
});

或者您可以将注入移动到create()中,但随后您会将 jQuery 注入到每个页面加载中,而不仅仅是一个。

var casper = require('casper').create({
    clientScripts: ["C:/jquery.min.js"]
});
于 2013-10-26T00:28:33.127 回答