javascript 当系统在测试期间抛出意外警报时,Cypress测试将永久挂起

fivyi3re  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(96)

当Web应用程序意外地通过警报框抛出错误时,Cypress测试永远挂起/卡住,并且测试永远不会完成或失败,直到用户手动关闭浏览器或手动单击警报框的OK按钮。

我有一个下面的示例HTML页面再现的问题,在这里我明确抛出警告框后5秒的页面加载.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Button Alert Example</title>
</head>
<body>

  <button onclick="changeLabel()">Click me for a label</button>
  <p id="label"></p>

  <iframe id="myFrame" style="display:none;"></iframe>

  <script>
    // Show alert after 5 seconds of page load within the frame
    setTimeout(function() {
      var frame = document.getElementById('myFrame');
      frame.style.display = 'block';
      frame.contentWindow.alert("Error While Processing Request");
    }, 5000);

    function changeLabel() {
      document.getElementById('label').innerText = "You clicked the button!";
    }
  </script>

</body>
</html>

以下是重现问题的Cypress测试:

describe('Reproduce Alert Test', () => {
  it('Handle alert in a Frame', () => {
    cy.visit('/alert-test.html');
    cy.wait(6000)

    // Verify page title
    cy.title().should('eq', 'Alert Example');

    // Click the button and verify the label
    cy.get('button').contains('Click me for a label').click();
    cy.get('#label').should('have.text', 'You clicked the button!');
  });
});

**注意:**当网页包含iFrame,没有iFrame时,Cypress会自动接受警报消息。

wb1gzix0

wb1gzix01#

<iframe>窗口上的cy.stub()将处理警报并允许测试继续。
我还添加了一个Assert,用于检查存根是否收到调用。

let stub;
cy.visit('http://127.0.0.1:5500/html/alert.html')

cy.get('iframe#myFrame')
  .its('0.contentWindow')
  .then(win => {
    stub = cy.stub(win, 'alert')
  })
  
cy.then(() => {
  // this needs to be inside a then callback 
  // because stub is set asynchronously
  cy.wrap(stub, {timeout:6_000}).should('have.been.called')
})

cy.title().should('eq', 'Button Alert Example')

cy.get('button').contains('Click me for a label').click();
cy.get('#label').should('have.text', 'You clicked the button!')

下面是测试的日志:

真实的世界的iframe

在现实世界的应用程序中,你可能不会像上面那样幸运地使用简单的iframe代码。
使用cypress-iframe将使测试更可靠。

相关问题