赛普拉斯并不总是执行click元素

时间:2018-07-09 22:38:15

标签: javascript testing automated-tests cypress

我正在自动执行Google计算器。 赛普拉斯有时也无法执行单击按钮。 测试单击按钮(0到9)并执行一些简单的数学运算。 而且有30%的机会无法单击元素,因此测试将失败。

出现问题时,我还录制了视频。

Video here

我的项目位于此处: https://github.com/afiliptsov/test-project

To run the test run : "npm run test:e2e:functional"

我尝试使用其他定位器。最初我只是使用ID ex(#cwbt15),但在我进行了更具体的定位(#cwbt15> .cwbtpl> .cwbts )之后,仍然遇到相同的问题。

有人知道它为什么会发生以及如何避免这种行为吗?

项目结构为:

  • cypress / PageObject.js -声明所有元素的位置。
  • cypress / support / commands.js -在其中创建函数并点击的位置 价值验证不断更新。
  • cypress / integration / functional / delete.spec.js -测试 视频

6 个答案:

答案 0 :(得分:4)

此处为 2021 年,柏树版本为 "6.x.x""7.x.x"

我的解决方案:

cy.get("YOUR_SELECTOR").trigger("click");

说明:

就我而言,我需要更深入地观察正在发生的事情。我首先像这样固定 click 操作:

enter image description here

然后观察控制台,您应该会看到如下内容: enter image description here

现在点击行 Mouse Events,它应该显示一个表格: enter image description here

因此,基本上,当 Cypress 执行 click 函数时,它会触发所有这些事件,但不知何故,我的组件的行为方式与触发 click event 时分离的方式相同。

所以我只是通过以下方式简化了点击:

cy.get("YOUR_SELECTOR").trigger("click");

它奏效了?

希望这能解决您的问题,或者至少可以帮助您调试和了解问题所在。

答案 1 :(得分:3)

在上述方法都不适合我并且经过数小时的搜索后,我才从同事那里学习到了一些东西。只是让我大吃一惊。只需添加另一个.click()...

之前:

cy.contains('some string').click(); 

在左侧的Cypress菜单中,单击该动作,您将看到指示它单击了正确零件的指示符,但没有任何反应。在浏览器中手动进行操作即可。

修复:

cy.contains('some string').click().click();

突然间,该字符串被点击,测试就进入了下一页

答案 2 :(得分:2)

无论谁发现此问题,这里都描述了解决该问题的官方方法:https://www.cypress.io/blog/2019/01/22/when-can-the-test-click/

TLDR: @jpvantuyl说的话,赛普拉斯在onclick事件出现之前先单击按钮。 lib cypress-pipe将添加一个.pipe方法,如果后面紧跟.should,它将重试一个函数,直到条件为真或超时为止。

示例:

cy
  .get(numbers.result.idLocator)
  .pipe($el => $el.click()) // try this
  .pipe(
    // next line will make assertions on the element returned by this pipe
    () => cy.get(calculatorScreen.resultOutput.idLocator)
  )
  .should("contain", "0"); // until this happens or times out

答案 3 :(得分:1)

对于我来说,此代码有效:

在您的点击方法内部添加:{ force: true }将强制点击。

还添加:cy.wait(150) BeforeEach 单击测试失败的地方

这只是解决方法,而不是解决方案。

Link to Cypress Issue

我也看到了这种选择:

cy.get('#query-btn').invoke('width').should('be.gt', 0)

cy.get('#query-btn').invoke('width').should('be. greaterThan', 0)

但是它对我没有效果。也许对某人有用!

答案 4 :(得分:0)

这可能是因为应用程序通过JavaScript将行为附加到按钮上。当该脚本需要很长时间才能执行时,它使赛普拉斯可以单击按钮之前,那里是OnClick事件。

请参阅:https://www.cypress.io/blog/2018/02/05/when-can-the-test-start/

Cypress建议使用以下类似的代码跟踪底层JS的放置时间:

function waitForAppStart() {
  // keeps rechecking "appHasStarted" variable
  return new Cypress.Promise((resolve, reject) => {
    const isReady = () => {
      if (appHasStarted) {
        return resolve()
      }
      setTimeout(isReady, 0)
    }
    isReady()
  })
}
it('greets', () => {
  cy.visit('app.html', {
    onBeforeLoad: spyOnAddEventListener
  }).then(waitForAppStart)
  // all other assertion will run only when
  // the application has started
  cy.get('#name').type('Cypress{enter}')
  cy.contains('#answer', 'Cypress')
})

答案 5 :(得分:-1)

https://github.com/cypress-io/cypress/issues/2928帮助了我。

cy.get('[data-qa="select_workers-list"]'.contains('+ New Worker').trigger('mouseover').click();