Google analytics Google Analytics的Spy dataLayer与Puppeter和Mocha/Sinon(或类似产品)合作
因此,我试图用无头Chromes+木偶师+摩卡+西农对我的Google Analytics呼叫进行自动测试,但无法读取数据层值,以便西农进行侦察 这就是我目前所拥有的。但窗口总是未定义的。 test是一个将Puppeter调用代理传递到内部浏览器的类Google analytics Google Analytics的Spy dataLayer与Puppeter和Mocha/Sinon(或类似产品)合作,google-analytics,mocha.js,sinon,google-chrome-headless,puppeteer,Google Analytics,Mocha.js,Sinon,Google Chrome Headless,Puppeteer,因此,我试图用无头Chromes+木偶师+摩卡+西农对我的Google Analytics呼叫进行自动测试,但无法读取数据层值,以便西农进行侦察 这就是我目前所拥有的。但窗口总是未定义的。 test是一个将Puppeter调用代理传递到内部浏览器的类 const { test } = require('../browser'); const sinon = require('sinon'); const dataLayerName = 'dataLayer'; const assert = s
const { test } = require('../browser');
const sinon = require('sinon');
const dataLayerName = 'dataLayer';
const assert = sinon.assert;
describe('Tests Analytics', () => {
let spy;
it('find home analytics', test(async (browser, opts) => {
const page = await browser.newPage();
await page.goto(`${opts.appUrl}`);
spy = sinon.spy(window.dataLayer, 'push');
assert.called(spy);
assert.calledWith(spy, [
'fail for me',
]);
spy.restore();
}));
});
这是Browser类:
const puppeteer = require('puppeteer');
/**
* This is a thin wrapper so that we use a singleton of
* the browser that puppeteer creates
*/
class Browser {
setUp(done) {
const puppeteerOpts = this.options && this.options.puppeteer ?
this.options.puppeteer :
{};
puppeteer.launch(puppeteerOpts).then(async (b) => {
this.setBrowser(b);
done();
});
}
setBrowser(b) {
this.browser = b;
const oldNewPage = this.browser.newPage.bind(this.browser);
this.browser.newPage = async function () {
const page = await oldNewPage();
this.lastPage = page;
return page;
};
}
setOptions(opts) {
this.options = opts;
}
test(promise) {
return (done) => {
promise(this.browser, this.options)
.then(() => done()).catch(done);
};
}
}
/*
* Create a new browser and use a proxy to pass
* any puppeteer calls to the inner browser
*/
module.exports = new Proxy(new Browser(), {
get(target, name) {
return name in target ? target[name].bind(target) : target.browser[name];
},
});
这对我来说是可行的:
let datalayer = await page.evaluate('dataLayer');
console.log(datalayer);
这对我来说是可行的:
let datalayer = await page.evaluate('dataLayer');
console.log(datalayer);
看看文档,这似乎是不可能的,因为您可以将函数从节点公开到页面上下文,在这个方向上,我仍然对一个解决方案感兴趣。您可以使用page.evaluate(“dataLayer”)访问数据层,它应该返回一个javascript数组。例如:const dl=wait page.evaluate('dataLayer');log('dl:',dl);至于你是否可以观看它,我想你可以在每次测试之前(比如onbeforerequest)获取数据层的值并对其进行测试?看看文档,这似乎是不可能的,因为你可以将函数从节点公开到页面上下文,仅在这个方向上,我还对一个解决方案感兴趣。你可以使用page.evaluate访问数据层('dataLayer'),它应该返回一个javascript数组。例如:const dl=await page.evaluate('dataLayer');console.log('dl:',dl);至于知道你是否可以观看它,我想你可以在每次测试之前(比如onbeforerequest)获取数据层值并对其进行测试?