Joy*_*ful 6 javascript testing caching end-to-end cypress
我想在打开页面时处理对某些文件的一些请求。在屏幕截图中,您可以看到来自cypress面板的日志:
为了处理这些请求,我添加了如下代码:
it('Check intercept', () => {
cy.intercept('/settings.json').as('settings');
cy.intercept('/static/model/*').as('plates');
cy.visit('/editor/ckpdx02f7098c08632il2aetr');
cy.wait('@settings')
cy.wait('@plates')
});
Run Code Online (Sandbox Code Playgroud)
它适用于settings.json,但.stl不适用于文件
如果我这样写它也不起作用:
it('Check intercept', () => {
cy.intercept('/settings.json').as('settings');
cy.intercept('/static/model/ckpdwtgpg096g08636kd57n39/plate_4.stl').as('plate4');
cy.intercept('/static/model/ckpdwtgpg096g08636kd57n39/plate_3.stl').as('plate3');
cy.intercept('/static/model/ckpdwtgpg096g08636kd57n39/plate_2.stl').as('plate2');
cy.intercept('/static/model/ckpdwtgpg096g08636kd57n39/plate_1.stl').as('plate1');
cy.intercept('/static/model/ckpdwtgpg096g08636kd57n39/plate_0.stl').as('plate0');
cy.visit('/editor/ckpdx02f7098c08632il2aetr');
cy.wait('@settings')
cy.wait('@plate4')
cy.wait('@plate3')
cy.wait('@plate2')
cy.wait('@plate1')
});
Run Code Online (Sandbox Code Playgroud)
我在文档中没有找到任何关于它的限制,欢迎提出您的想法:)
赛普拉斯:v7.4.0
UPDATE 1:
我发现了一个更多细节:如果打开 chrome 开发人员工具并在“网络”选项卡中禁用缓存 - 它始终可以正常工作
UPDATE 2:
我使用演示存储库创建了一个问题:https ://github.com/cypress-io/cypress/issues/16766
使用该fetch()协议,磁盘缓存读取不会被cy.intercept().
您可以在应用程序中更改fetch()以关闭缓存,
fetch("http://127.0.0.1:2000/plate.stl", {cache: "no-store"});
Run Code Online (Sandbox Code Playgroud)
但如果您喜欢在测试中执行此操作,请将其添加到规范的顶部
beforeEach(() => {
const disableCache = (win) => {
const original = win.fetch;
win.fetch = (...args) => original(...args, {cache: "no-store"});
}
cy.on('window:before:load', win => disableCache(win))
})
Run Code Online (Sandbox Code Playgroud)
注意,通常你可以像这样修改拦截中的标头
cy.intercept("/plate.stl", req => {
req.headers['cache'] = 'no-store'
})
Run Code Online (Sandbox Code Playgroud)
但拦截似乎与缓存读取不匹配,因此它永远不会达到这一点。
附带说明一下,使用 Cypress v4.12.0 的工作分支使用 xhr 而不是 fetch。如果将 xhr 方法替换为 Cypress v7.4.0 版本(仍然使用拦截),问题就会消失。
这意味着您还可以通过使用旧的 fetch polyfill 来修复此问题,它将 fetch 即时转换为 xhr (但我还没有尝试过)。
基于此还有第三种方式
beforeEach(() => {
Cypress.automation('remote:debugger:protocol', {
command: 'Network.clearBrowserCache'
})
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2709 次 |
| 最近记录: |