Cypress 自定义事件和cy.get

Cypress 自定义事件和cy.get,cypress,Cypress,我需要一些关于如何处理以下情况的帮助。有一种模式,关闭时发送AJAX请求,如果响应成功,则重新绘制Datatables表。触发draw.dt事件后,我需要测试表的内容 我得到一个表的引用,然后为draw.dt事件设置一个处理程序。当事件激发时,cypress报告cy.get不能在测试之外运行。我假设在处理此事件时,测试实际上已经完成 处理这种情况的正确方法是什么 cy.get('#commChannelModal > .modal-dialog > .modal-content

我需要一些关于如何处理以下情况的帮助。有一种模式,关闭时发送AJAX请求,如果响应成功,则重新绘制Datatables表。触发draw.dt事件后,我需要测试表的内容

我得到一个表的引用,然后为draw.dt事件设置一个处理程序。当事件激发时,cypress报告cy.get不能在测试之外运行。我假设在处理此事件时,测试实际上已经完成

处理这种情况的正确方法是什么

  cy.get('#commChannelModal > .modal-dialog > .modal-content > .modal-footer > .btn-primary')
            .contains(this.edit_controller_interface_data.modals.edit_comm_channel.buttons.save.text)
            .click({force: true}).then(function (){

                cy.wait('@fetchComms').then(function () {

                    cy.get('#commChannelsTable').then(($table) => {
                        $table.on('draw.dt', function () {
                            // Verify in the index if the edited values are saved
                            cy.get('#commChannelsTable').get('tbody > tr:nth-child(3) > td:nth-child(1)')
                            .contains(this.edit_controller_interface_data.modals.edit_comm_channel.fields.connectionType.value)

                            cy.get('#commChannelsTable').get('tbody > tr:nth-child(3) > td:nth-child(2)')
                            .contains(this.edit_controller_interface_data.modals.edit_comm_channel.fields.ipAddress.value)

                            cy.get('#commChannelsTable').get('tbody > tr:nth-child(3) > td:nth-child(3)')
                            .contains(this.edit_controller_interface_data.modals.edit_comm_channel.fields.ipPort.value)
                        })
                    })
                })
            })

您的评估是正确的,在您的活动启动时cypress已经完成。这是因为附加事件侦听器本身并不会向cypress发出信号,它应该等待它触发(不像在节点中,附加侦听器会向进程发出信号以不退出脚本)

但是,在大多数情况下,您不需要等待事件。只需将DOM命令排入队列——cypress将等待(默认情况下为4s),直到DOM符合您的期望。如果需要等待更多时间,请传递自定义
超时时间

description('test',()=>{
它('test',()=>{
cy.window().then(win=>{
win.redraw=()=>{
设置超时(()=>{
win.document.body.innerHTML=`
1.
`;
}, 5000 );
};
win.document.body.innerHTML=`
0
重画
`;
});
cy.get('.item')。应('contain','0');
cy.get('.redraw')。单击();
get('.item',{timeout:6000})。应该('contain','1');
});
});
如果还有其他我不理解的事情发生,或者你只是坚持等待事件触发,你可以
cy.wrap
一个承诺,并在事件触发时解决它:

description('test',()=>{
它('test',()=>{
cy.window().then(win=>{
win.redraw=()=>{
设置超时(()=>{
win.document.body.innerHTML=`
1.
`;
win.document.dispatchEvent(
新的win.CustomEvent('custom-event'))
);
}, 5000 );
};
win.document.body.innerHTML=`
0
重画
`;
});
cy.get('.item')。应('contain','0');
cy.get('.redraw')。单击();
cy.wrap(新承诺(解决=>{
cy.document().然后(doc=>{
文件addEventListener('custom-event',resolve);
});
})).然后(()=>{
cy.get('.item')。应('contain','1');
});
});
});

我正在发送一个自定义事件,仅用于演示目的。您可以使用
draw.dt
事件。

测试在下线失败?cy.get('#commChannelsTable').get('tbody>tr:nth child(3)>td:nth child(1)').contains(this.edit\u controller\u interface\u data.modals.edit\u comm\u channel.fields.connectionType.value)查看这是否有帮助@RythmicDevil:谢谢。您不必构建wait()是正确的。我们只需要检查表中的行数。如果是3,则保存成功,然后我们可以检查数据。如果没有,则保存不成功。