我正在尝试为我们的谷歌分析跟踪编写 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事件是否已被触发?
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);
})
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)
})