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

标签 javascript google-analytics casperjs

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

我们想要测试的一件事是确保 Google Analytics 正在触发。

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

我正在使用 options.clientScripts() 将脚本注入(inject)远程 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 调用?或者我可能没有及早注入(inject)它?

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

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

此外 - 完全披露 - 上周我最初也在 CasperJS Google Group ( https://groups.google.com/d/topic/casperjs/shqwRoQ-CvE/discussion ) 上问过这个问题 - 但没有得到太多回应。

干杯, 维克多

最佳答案

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

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

关于javascript - 使用 CasperJS 在页面上测试 Google Analytics JavaScript 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20462812/

相关文章:

javascript - CasperJS/PhantomJS,一些测试随机失败

javascript - 即使外部页面发生错误也执行 javascript

google-analytics - 回溯URL查询参数排除

c# - 条件编译已关闭 VS 2012 razor javascript

android - 如何在移动设备上调试 Google Analytics 跟踪代码

google-analytics - 带有打印事件的按钮单击事件

javascript - thenEvaluate()的返回方式与evaluate()相同吗?

javascript - 在 CasperJS 的 XPath 表达式中使用 contains(text(), "string") 时如何使用忽略大小写?

javascript - Laravel 5.6,如何从一个函数返回两个 View

javascript - 在 div 选择上链接 div 和文本框值