我正在使用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)上周问过这个问题 - 虽然没有得到太多回应。
干杯, 维克多
答案 0 :(得分:1)
你应能够像这样代理对_gaq.push的调用:
var old_push = _gaq.push;
_gaq.push = function(options){
console.log("Calling google analytics");
old_push.call(this, options);
}