首页 > 解决方案 > 如何接受带有赛普拉斯的 iframe 触发的窗口确认

问题描述

当我需要接受从 iframe 触发的窗口确认弹出窗口时,我遇到了赛普拉斯的一些问题。赛普拉斯它对 iframe 不是很友好,但我设法让它工作,直到我发现需要。

所以这是我尝试过的(基于this):

cy.get("[title='Some title']").then(($iframe) => {
      const $body = $iframe.contents().find("body");
      const $win = $iframe[0].contentWindow;

      cy.stub($win, "confirm").as("windowConfirm");

      cy.wrap($body)
        .contains("Delete") 
        .click() // this fires the confirm popup
        .should(function () {
          expect(this.windowConfirm).to.be.calledWith(
            `Continue deletion?`
          );
        });
    });

它实际上断言弹出窗口内的文本,但从不接受它。我尝试了我发现的不同方法(即使用a.on("window:confirm", () => true)但我没有得到任何结果。

谢谢!

标签: iframewindowcypressconfirm

解决方案


只需将您的真实功能添加到存根

cy.stub($win, 'confirm', () => true)
  .as('windowConfirm')

打印CONFIRMED到控制台。


it('confirms in iframe', () => {

  cy.visit('../app/iframe-confirm-popup.html')

  cy.get('iframe').then(($iframe) => {
    const $body = $iframe.contents().find('body')
    const $win = $iframe[0].contentWindow

    cy.stub($win, 'confirm', () => true)
      .as('windowConfirm')
    cy.stub($win.console, 'log').as('consoleLog')

    cy.wrap($body)
      .find('input').click().should(function () {
        expect(this.windowConfirm).to.be.calledWith('Are you sure you want to submit your application?')
        expect(this.consoleLog).to.be.calledWith('CONFIRMED')  // passes
      })
  })
})

推荐阅读