我正在自动执行Google计算器。 赛普拉斯有时也无法执行单击按钮。 测试单击按钮(0到9)并执行一些简单的数学运算。 而且有30%的机会无法单击元素,因此测试将失败。
出现问题时,我还录制了视频。
我的项目位于此处: https://github.com/afiliptsov/test-project
To run the test run : "npm run test:e2e:functional"
我尝试使用其他定位器。最初我只是使用ID ex(#cwbt15),但在我进行了更具体的定位(#cwbt15> .cwbtpl> .cwbts )之后,仍然遇到相同的问题。
有人知道它为什么会发生以及如何避免这种行为吗?
项目结构为:
答案 0 :(得分:4)
此处为 2021 年,柏树版本为 "6.x.x"
或 "7.x.x"
。
我的解决方案:
cy.get("YOUR_SELECTOR").trigger("click");
说明:
就我而言,我需要更深入地观察正在发生的事情。我首先像这样固定 click
操作:
因此,基本上,当 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 或单击测试失败的地方。
这只是解决方法,而不是解决方案。
我也看到了这种选择:
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();