casperjs:如何触发jquery $ .ajax调用

时间:2013-10-26 00:02:22

标签: jquery phantomjs casperjs

我有一个工作的casperjs脚本,但它只在50%的时间内成功执行$ .ajax调用。

我知道它正在运行,因为我可以看到新数据显示在我的api日志中,当它确实有效时,我可以在数据库中看到该字段已更新。在失败的尝试中,我看到我的api上没有任何活动,所以它似乎甚至没有触发ajax调用。什么会导致这个ajax调用只在某些时候工作?即使更新了我的db字段,casper日志行也始终返回null。这是代码片段。我正在使用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的新手,所以我非常感谢我在代码中指出任何其他错误。感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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