4Manuals

  • PDF Cloud HOME

Chrome错误是否有解决方法:在Cypress测试期间,“需要用户手势才能进行卸载对话框” Download

    CSS / JS-如何覆盖一个孩子而不是其他孩子的父母过渡 我的Javascript从'string'转换为'integer'或'number'无效 反应:更改方向后触发重新渲染和offsetWidth的重新计算 如何删除外部索引并合并内部json 在React Native 图片无法通过javascript刷新 如何在react图表上的datakey中操作DateTime 在Cypress中保存变量 如何从作为请求传递的输入类型数据绑定中提取数据 通过dropzone laravel通过电子邮件发送多个图像

https://www.chromestatus.com/feature/5082396709879808

需要用户手势才能进行卸载对话框

  

仅当框架尝试进行以下操作时,才会显示beforeunload对话框:   显示它已收到用户手势或用户交互(或如果有)   嵌入式框架已收到此类手势)。 (不会有变化   分配到beforeunload事件,只是对是否   显示对话框。)

这是我们遇到的问题。在我们的单页应用中,业务规则规定,如果用户单击浏览器后退按钮,我们将向用户发出警报。

下面的代码在我们的app.js中是做什么的

componentDidMount = () => {
    window.addEventListener('beforeunload', event => {
        event.returnValue = `Are you sure you want to leave?`;
    });
}

如果用户在任意页面上导航,则会弹出默认警报框。

但是在赛普拉斯测试中,我们有一个beforeEach,它可以回到每次测试之前应用程序流程的开始。由于我们要离开页面,因此会触发beforeunload事件,但是我们看不到警报,而是收到了chrome错误:

  

在卸载对话框之前需要用户手势

有人遇到过这个问题吗?还是有一个变通的线索?

目前,我唯一能想到的就是删除beforeEach,但是对于要测试的每件事,我们都需要进行单独的测试。而不只是几个页面测试文件...

1 个答案:

答案 0 :(得分:0)

据我所知,目前尚无法以可被视为“用户手势”的方式与网站进行交互,因为赛普拉斯目前使用的编程浏览器API,Chrome并不将此视为真正的用户交互(当实施native events时才有可能)。

编辑:重新阅读问题,我实际上不确定您要做什么。如果您确实想防止重定向,即使在测试过程中,以下操作也无济于事。相反,如果您想断言该事件已正确注册,并且正在执行应做的工作,则请参见以下内容。


话虽这么说,您实际上并不需要阻止{{ studenDetails$ | async | json }} 事件(这实际上是您实际上不想要的事情,因为那样的话您就需要手动确认/取消该对话框,这是“可能是自动柜员机,尽管赛普拉斯有时会自动这样做)。回调仍被调用,您可以对此进行断言。

因此,您可以猴子修补事件处理程序,缓存返回值,并在重定向后对其进行断言:

unload

用法(请注意,出于演示目的,我在测试中注册了// cypress/support/index.js const beforeUnloadRets = []; // command used to assert on beforeunload event return values. Callback is // retried until it doesn't throw, and is invoked with the value // potentially-registered beforeunload handler return value. If handler was // registered, but didn't return anything (i.e. doesn't prevent the event), // the value is `null`. If no handler was registered, value is `undefined`. Cypress.Commands.add('assertBeforeUnload', ( cb ) => { cy.wrap(null, { log: false }).should(() => cb(beforeUnloadRets.shift())); }); beforeEach(() => { cy.on('window:before:load', ( win ) => { // monkey-patch `window.addEventListener` in case the `beforeunload` handler // is registered using this API // ------------------------------------------------------------------------- const _addEventListener = win.addEventListener; win.addEventListener = function (eventName, listener, ...rest) { if ( eventName === 'beforeunload' ) { const _origListener = listener; listener = (...args) => { const ret = _origListener(...args); beforeUnloadRets.push(ret === undefined ? null : ret); return ret; } } return _addEventListener.call(this, eventName, listener, ...rest); }; // monkey-patch `window.onbeforeload` in case it's registered in that way // ------------------------------------------------------------------------- let _onbeforeunloadHandler; win.onbeforeunload = ( ev ) => { if ( _onbeforeunloadHandler ) { const ret = _onbeforeunloadHandler.call(win, ev); beforeUnloadRets.push(ret === undefined ? null : ret); return ret; } }; Object.defineProperty(win, 'onbeforeunload', { set ( handler ) { _onbeforeunloadHandler = handler; } }) }); }); 事件,但在实际情况下,这就是您的应用程序要执行的操作):

beforeunload



Similar searches
    处理作曲家废弃包装的最佳实践是什么? 就时间复杂度而言,采用最佳方法由字符矩阵组成字符串的方法有几种? 无法从GitHub下载Node.js 在设置nth-child(odd)并设置'.sayari:nth-​​child(odd){clear:both;}'之后,为什么div元素不会浮动到右上角? 在CSS通配符选择器中使用“-”(正式)是否会导致匹配问题?