https://www.chromestatus.com/feature/5082396709879808 需要用户手势才能进行卸载对话框 仅当框架尝试进行以下操作时,才会显示beforeunload对话框:
显示它已收到用户手势或用户交互(或如果有)
嵌入式框架已收到此类手势)。 (不会有变化
分配到beforeunload事件,只是对是否
显示对话框。) 这是我们遇到的问题。在我们的单页应用中,业务规则规定,如果用户单击浏览器后退按钮,我们将向用户发出警报。 下面的代码在我们的app.js中是做什么的 如果用户在任意页面上导航,则会弹出默认警报框。 但是在赛普拉斯测试中,我们有一个 在卸载对话框之前需要用户手势 有人遇到过这个问题吗?还是有一个变通的线索? 目前,我唯一能想到的就是删除 答案 0 :(得分:0) 据我所知,目前尚无法以可被视为“用户手势”的方式与网站进行交互,因为赛普拉斯目前使用的编程浏览器API,Chrome并不将此视为真正的用户交互(当实施native events时才有可能)。 编辑:重新阅读问题,我实际上不确定您要做什么。如果您确实想防止重定向,即使在测试过程中,以下操作也无济于事。相反,如果您想断言该事件已正确注册,并且正在执行应做的工作,则请参见以下内容。 话虽这么说,您实际上并不需要阻止 因此,您可以猴子修补事件处理程序,缓存返回值,并在重定向后对其进行断言: 用法(请注意,出于演示目的,我在测试中注册了
componentDidMount = () => {
window.addEventListener('beforeunload', event => {
event.returnValue = `Are you sure you want to leave?`;
});
}
beforeEach
,它可以回到每次测试之前应用程序流程的开始。由于我们要离开页面,因此会触发beforeunload
事件,但是我们看不到警报,而是收到了chrome错误:
beforeEach
,但是对于要测试的每件事,我们都需要进行单独的测试。而不只是几个页面测试文件... 1 个答案:
{{ 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