Google analytics Google Analytics的Spy dataLayer与Puppeter和Mocha/Sinon(或类似产品)合作

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

因此,我试图用无头Chromes+木偶师+摩卡+西农对我的Google Analytics呼叫进行自动测试,但无法读取数据层值,以便西农进行侦察

这就是我目前所拥有的。但窗口总是未定义的。 test是一个将Puppeter调用代理传递到内部浏览器的类

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)获取数据层值并对其进行测试?