使用 cypress 测试 google 分析跟踪

问题描述 投票:0回答:2

我正在尝试为我们的谷歌分析跟踪编写 cypress 测试。

乍一看,它适用于这样的测试:

describe('Basic GTM Tests', () => {
    it('Event ce.pageload gets fired on page load', () => {
        cy.visit('https://www.my.domain');
        cy.waitForResource('gtm.js');
        cy.wait(1000); // wait for events to be fired

        cy.window().then((win) => {
            assert.equal(win.dataLayer[14].event, 'ce.pageload')
        })
    });
});

这确实会检查事件

ce.pageload
是否已被触发。不幸的是,这似乎非常脆弱,因为代码依赖于事件存储在
dataLayer
内的特定位置(本例中为 14)的事实。

由于事件是异步的,并且将来可能会删除/添加事件,我想知道是否/如何检查 win.dataLayer 数组中是否存在一个对象(在任何位置),该对象具有属性

event
并保存值
ce.pageload 
.

问题1:如何断言数组内存在一个属性事件设置等于给定值的对象?

问题2:是否有更好的方法来检查某个GA事件是否已被触发?

testing google-analytics cypress
2个回答
0
投票

您可以使用

Array.filter()
Array.find()
在数组中查找满足某些条件的对象。

cy.window().then((win) => {
  const pageLoad = win.dataLayer.filter((x) => x.event === 'ce.pageload');
  // If you want to check that there is at least one dataLayer object found
  // If you are using `.find()`, then this assertion is functionally equivalent to the `.equal` below
  assert.isAbove(pageLoad.length, 0, 'No ce.pageload event found in win.dataLayer');
  // If you want to check that the there is exactly one dataLayer object found
  assert.equal(pageLoad.length, 1);
})

0
投票

Array.some方法返回

true
false

Array.prototype.some()

Array 实例的 some() 方法测试数组中至少一个元素是否通过所提供函数实现的测试。

如果在数组中找到所提供的函数返回 true 的元素,则返回 true;否则返回 false。

cy.window().then((win) => {
  assert(win.dataLayer.some(event => event === 'ce.pageload'), 'Page load was found')
})

“柏树”之路

Cypress 提供

.should()
断言包装器,它会重试直到 true(或超时限制)。这样可以去除可能呈片状的
cy.wait(1000)

chaiJs
断言
oneOf
相当于
Array.some()

cy.window().should((win) => {
  expect('ce.pageload').to.be.oneOf(win.dataLayer)
})
© www.soinside.com 2019 - 2024. All rights reserved.