赛普拉斯 - 4000 毫秒后重试超时:预计会找到元素 - 仅在 Jenkins 中

Posted

技术标签:

【中文标题】赛普拉斯 - 4000 毫秒后重试超时:预计会找到元素 - 仅在 Jenkins 中【英文标题】:Cypress - Timed out retrying after 4000ms: Expected to find element - only in Jenkins 【发布时间】:2021-10-16 23:26:21 【问题描述】:

我有一组赛普拉斯测试失败,仅在我的 Jenkins 环境中。整个 describe 块找不到元素。块中的每个测试都以相同的命令开始:

describe("This section of tests", () => 
  it("Test for something in this section", () => 
    cy.login(); // custom login command, works in all other test blocks
    setupPage(); // page setup function, no problems in all other test blocks
    cy.wait(10000); // desperation wait

    cy.get("#toggle-detail-pane-button").click(); // issue here!
    // all tests in block run more assertions and commands after this
  );

  // more similar tests in block
);

// more describe blocks that also use cy.login and setupPage, with no issue

当我在 cypress 测试 UI 中运行这些测试时,它们都通过了。当我使用npx cypress run 在我的机器上的终端中运行它们时,它们通过了。当我通过 ssh 进入远程 OpenStack 终端时,该终端设置为运行我的项目并运行 cypress,并运行 npx cypress run,它们通过了。

当我在 Jenkins 中运行测试时,它使用少数相同的 OpenStack 实例并行运行 cypress,测试始终失败,并显示以下消息:

AssertionError: Timed out retrying after 4000ms: Expected to find element: `#toggle-detail-pane-button`, but never found it.

      at Context.eval (http://localhost:3000/__cypress/tests?p=cypress/integration/stuff/mytests.spec.js:519:8)

我尝试重新组织我的测试,重写它们等,但没有运气。我无法弄清楚这里出了什么问题。我的 Jenkins 环境使用自定义的sorry-cypress 设置,由于某种原因,仪表板没有注册测试,所以我无法查看任何屏幕截图或视频(这是一个完全独立的蠕虫问题)。

为什么只有这些测试只会在我的 CI/CD 环境中失败?我怎么才能开始调试呢?

编辑:截图

我能够使用屏幕截图和视频重新运行 CI/CD,然后我能够 scp 将文件从实例中删除,但测试失败。在我的机器上运行时,cypress 找到元素没有问题:

在我的机器上使用 cypress selector playground 时,它也能找到它:

但在屏幕截图中,我从运行完全相同的测试的 openstack 实例中提取出来,但找不到它:

(对不起,这是一个专有应用程序)

什么给了?

【问题讨论】:

不是说它对你有帮助,但我喜欢你的 // desparation wait 评论。我过去也用过。我喜欢詹金斯和赛普拉斯。你能用 MCVE 复制它并在这里发布到 JS/html sn-p 中吗?您能否暂时禁用 Jenkins 上的并行测试运行,或者您是否也尝试过? 哎哟! docs.sorry-cypress.dev/ci/jenkins → ⚠ 正在建设中 是的,那里没有文档,所以我基本上是wrote my own。就 MCVE 而言,考虑到它涉及复杂且专有的 React 代码库,包括 cypress、jenkins 和云计算机资源,我真的不知道该怎么做。我可以尝试不并行地在 jenkins 上运行测试,但最终我需要一个并行工作的解决方案。我会尽快尝试并报告。 我想我也可以花时间让sorry-cypress 正常工作,以便将图像和视频正确上传到sorry-cypress 仪表板。如果我能做到这一点,我也许能够看到导致失败的那些测试到底发生了什么。 脱帽致敬!很好的文章!您是否知道您可以简化您的阶段步骤,这些步骤在那里都是一样的,只需一行调用Shared Library? 【参考方案1】:

这意味着您的 cy.visit() 命令存在问题。在测试之前没有加载页面,这就是原因

【讨论】:

正在加载页面。上面的截图清楚地表明(尽管绿色的 NDA 掩盖可能使这一点不清楚)......但这绝对不是答案。升级到 cypress ^8 似乎已经解决了问题【参考方案2】:

我遇到了类似的问题。我通过选择器或类而不是其 id 获取元素来解决它。

我来自:

cy.get('#mat-options-text').click()

cy.get('mat-options').click()

【讨论】:

以上是关于赛普拉斯 - 4000 毫秒后重试超时:预计会找到元素 - 仅在 Jenkins 中的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯在多项测试中冻结

如何验证赛普拉斯中的悬停文本(工具提示)?

赛普拉斯可以运行在赛普拉斯文件夹之外导入的测试文件吗?

校园网inode连接网络之后直接认证无响应,5分钟后重试

赛普拉斯 - 检查按钮是不是存在,如果存在则单击它

URLSession dataTaskPublisher 在特定错误延迟后重试