Cypress: как обрабатывать закрытие подтверждения окна, запускаемого из iframe

#javascript #iframe #cypress

#javascript #iframe #cypress

Вопрос:

Мне нужна помощь в том, как закрыть окно подтверждения, которое было запущено из iframe. Я пробую приведенный ниже код, но это все равно не может закрыть окно подтверждения.

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

        cy.stub($win,'confirm').as('windowConfirm')
        cy.wrap($body)
        .find('#ParentMainContent_MainContentMaster_ctl00_PlaceOrderButton').click().should(function () {
            expect(this.windowConfirm).to.be.calledWith('Thank you for your Order!')
        })
    }) 
 

DOM

Кнопка, запускающая это окно, показана выше:

Надеюсь, кто-нибудь может взглянуть и помочь.

Комментарии:

1. Обработка iFrame сложна, я рекомендую использовать cypress-iframe . Но, возможно, попробуйте cy.spy() вместо cy.stub() этого, поскольку spy допускает исходное поведение, но stub блокирует исходное поведение.

2. Привет @eric99, я пробовал cy.spy, но я все еще не могу щелкнуть окно conf. У вас есть рабочий пример того, как это сделать?

3. Самый простой способ обработки iframes — использовать Cypress iframe . Чего может не хватать в вашем коде, так это ожидания загрузки iframe, например Cypress.$(contentWindow).on('load', resolve) , как это делается в этой библиотеке.

Ответ №1:

Использование cypress-iframe дает вам больше проверок завершения загрузки iframe, прежде чем вы начнете проверять его содержимое.

Недостатком является то, что методы этой библиотеки выдают body , но не окно iframe, хотя я думаю, что вы можете использовать body.ownerDocument.window его для его получения.

 cy.enter('iframe[id="ParentMainContent_Frame"]').then(getBody => {

  const body = getBody();
  const win = body.ownerDocument.window;

  cy.spy(win,'confirm').as('windowConfirm');   // spy not stub

  body.find('#ParentMainContent_MainContentMaster_ctl00_PlaceOrderButton')
    .click()
    .should(function () {
      expect(this.windowConfirm).to.be.calledWith('Thank you for your Order!')
    })
  }) 
}) 
 

Комментарии:

1. Привет @eric99, я попробовал это, но я получаю сообщение об ошибке «окно не определено»: