如何解决在 Cypress 测试框架中遇到的跳转问题?

阅读时长 6 分钟读完

前言

Cypress 是现代化的前端端对端测试框架,具有易用性和高度可维护性等优点。但在实际使用过程中,我们可能会面临被测试应用中的 DOM 元素拦截导致 Cypress 无法正确执行测试的问题。这篇文章将介绍如何使用 Cypress 提供的命令和插件解决这样的问题。

问题描述

当我们在进行页面跳转时,例如点击一个链接、按下回车键等操作,测试通常会停留在当前页面,无法继续进行。这是由于 Cypress 的命令被浏览器自带的单击事件覆盖,浏览器默认情况下会在新窗口或页面中打开链接,导致 Cypress 等待页面加载但无法通过 DOM 标识检测到加载状态。这样就会导致 Cypress 测试套件在该点上停止执行。

下面我们通过一个简单的示例来说明这个问题:

-- -------------------- ---- -------
------
  -- -----------------------------------------

  --------
    ----- ---- - ----------------------------

    ------------ - --------------- -
      -----------------------
      ----------------- -----------
    --
  ---------
-------

以上代码实现了监听 a 元素的点击事件,并在控制台输出消息,而阻止了默认行为跳转到 https://www.google.com/

现在我们创建一个 Cypress 测试用例,点击该链接,期望可以看到控制台输出 "Link clicked.":

-- -------------------- ---- -------
--------------- ---- ------ -- -- -
  ---------- --- ------ ------ -- -- -
    --------------

    -----------
      --------
      -------- -- -
        ----------------- -----------
      ---
  ---
---

但是我们会发现 Cypress 始终等待页面加载,无法执行 then 的回调函数。

解决方案

Cypress 提供了一系列的命令和插件来解决页面跳转问题,其中包括了 cy.visit() 命令、cypress-wait-until 插件以及 cy.request() 命令等。

使用 cy.visit() 命令

在 Cypress 中使用 cy.visit() 命令可以在测试过程中导航到指定的页面。当我们通过该命令导航到新页面时,Cypress 会在新页面完全加载后才继续执行测试。

我们可以把测试用例改为:

-- -------------------- ---- -------
--------------- ---- ------ -- -- -
  ---------- --- ------ ------ -- -- -
    --------------

    -----------
      -------- ------ ---- --
      -------- -- -
        ----------------- -----------
      ---
  ---
---

在该测试用例中,我们传递了一个选项 force: true,该选项强制 Cypress 点击链接,即使浏览器点击事件被覆盖。

使用 cypress-wait-until 插件

cypress-wait-until 是一个第三方的 Cypress 插件。使用该插件,我们可以等待指定条件满足后再进行下一步操作。对于我们的场景来说,当我们点击链接后需要等待被跳转的页面完成加载后才能继续测试,因此使用该插件可以方便地解决该问题。

我们可以安装 cypress-wait-until

并在 cypress/support/index.js 文件中导入插件:

然后,我们就可以在测试用例中使用 waitUntil() 命令来等待条件满足后继续执行测试:

-- -------------------- ---- -------
--------------- ---- ------ -- -- -
  ---------- --- ------ ------ -- -- -
    --------------

    -----------
      -------- ------ ---- ---

    --------------- -- -
      ------ ----------------- -- --- --- --------------------------
    ---------- -- -
      ----------------- -----------
    ---
  ---
---

在该测试用例中,我们使用 cy.waitUntil() 命令等待浏览器更新 URL,当 URL 不再是 http://localhost:8080/ 时,继续执行下一步操作。

使用 cy.request() 命令

最后,我们可以使用 cy.request() 命令来验证 URL 是否被更新。该命令可以向服务端发送请求,并获取响应数据。我们可以在测试用例执行 click 操作后,使用该命令验证 URL。

-- -------------------- ---- -------
--------------- ---- ------ -- -- -
  ---------- --- ------ ------ -- -- -
    --------------

    -----------
      -------- ------ ---- ---

    ----------------- --------------------------
      -------------- -- -
        -----------------------------------
        ----------------- -----------
      ---
  ---
---

在该测试用例中,我们向服务端发送了一个 GET 请求,验证响应状态码是否为 200。如果响应状态码为 200,我们就可以断言跳转已经完成,然后继续执行测试。

结论

无论是使用 cy.visit() 命令、cypress-wait-until 插件还是cy.request() 命令,我们都可以解决在 Cypress 测试框架中遇到的跳转问题。只要我们正确使用合适的工具和技术,我们就可以更轻松地编写出高质量的端对端测试用例。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6703347ed91dce0dc84a53aa

纠错
反馈