使用CasperJS在页面上测试Google Analytics JavaScript调用?

时间:2013-12-09 03:50:55

标签: javascript google-analytics casperjs

我正在使用CasperJS对网站进行功能测试。

我们要测试的一件事是确保Google Analytics正在解雇。

这篇博客文章(http://viget.com/extend/testing-google-analytics-with-phantomjs)提到将SinonJS(http://sinonjs.org)与PhantomJS一起使用 - 所以我认为它应该适用于CasperJS。

我正在使用options.clientScripts()将脚本注入远程DOM:

casper.options.clientScripts.push("./sinon-1.7.3.js");

然后我尝试在CasperJS evaluate()电话中调用它:

    casper.evaluate(function() {
        var spy = sinon.spy(_gaq, "push");
        console.log(spy.called);
        this.log(spy.called, 'debug');
    });

但是,console.log输出似乎没有传递给CasperJS。

而this.log意味着是一个CasperJS日志记录调用,但我不知道它是否可以在evaluate()内工作 - 而且它似乎根本没有做任何事情。

更新:我也试过了:

    spy = casper.evaluate(function() {
        var spy = sinon.spy(_gaq, "push");
        return spy;
    });
    this.log(spy, 'debug');

我得到了:

FAIL TypeError: No default value
#    type: uncaughtError
#    file: test_purchase.js:261
#    error: No default value
#           TypeError: No default value
#               at _replace (/usr/local/Cellar/casperjs/1.1-beta3/libexec/modules/utils.js:261)
#    stack: not provided

更新2:我现在有了:

    spy = casper.evaluate(function() {
        var spy = sinon.spy(_gaq, "push");
        return spy;
    });
    this.echo('Has GA been called? ' + spy.called, 'debug');

总是返回false:

Has GA been called? false

我也尝试过使用waitFor(),但这似乎也没有实现:

    spy = casper.evaluate(function() {
        var spy = sinon.spy(_gaq, "push");
        return spy;
    });

    this.waitFor(function checkspy() {
        return this.evaluate(function() {
            return spy.called;
        });
    }, function then() {
        this.echo('Aha - GA has called: ' + spy.called, 'debug');
    });

给了我:

[warning] [phantom] Casper.waitFor() timeout
FAIL "function checkspy() {
            return this.evaluate(function() {
                return spy.called;
            });
        }" did not evaluate to something truthy in 5000ms
#    type: uncaughtError
#    file: test_purchase.js
#    error: "function checkspy() {
            return this.evaluate(function() {
                return spy.called;
            });
        }" did not evaluate to something truthy in 5000ms

#    stack: not provided

我猜这可能是某种时间问题,GA尚未被召唤?在运行evaluate()/ SinonJS之前,有没有办法让CasperJS等待GA调用?或者我可能没有及早注射它?

如何正确设置SinonJS和CasperJS,以便我们可以检测是否已调用GA?

或者有没有人知道在CasperJS中正确测试Google Analytics的任何其他方法(使用SinonJS或其他方式)?

另外 - 完全披露 - 我最初也在CasperJS谷歌集团(https://groups.google.com/d/topic/casperjs/shqwRoQ-CvE/discussion)上周问过这个问题 - 虽然没有得到太多回应。

干杯, 维克多

1 个答案:

答案 0 :(得分:1)

能够像这样代理对_gaq.push的调用:

var old_push = _gaq.push;
_gaq.push = function(options){
   console.log("Calling google analytics");
   old_push.call(this, options);
}