如果一个元素在页面上不可操作(在这种情况下,由另一个元素覆盖)并且您尝试单击它,赛普拉斯将显示如下错误: CypressError: Timed out retrying: cy.click() failed because this element:span.../spanis bei
CypressError: Timed out retrying: cy.click() failed because this element: <span>...</span> is being covered by another element:
大!但有没有办法断言这是这种情况,又称无法点击该元素?
这不起作用:
> should.not.exist – 元素确实存在
> should.be.disabled – 该元素未被禁用
> should.not.be.visible – 元素可见(刚被另一个透明元素覆盖)
>使用cy.on(‘uncaught:exception’,…),因为这不是一个例外
it "throws when a non-descendent element is covering subject", (done) -> $btn = $("<button>button covered</button>") .attr("id", "button-covered-in-span") .prependTo(cy.$$("body")) span = $("<span>span on button</span>") .css(position: "absolute", left: $btn.offset().left, top: $btn.offset().top, padding: 5, display: "inline-block", backgroundColor: "yellow") .prependTo(cy.$$("body")) cy.on "fail", (err) => ... expect(err.message).to.include "cy.click() failed because this element" expect(err.message).to.include "is being covered by another element" ... done() cy.get("#button-covered-in-span").click()
最简单的是模仿这个测试,即使文档建议仅使用cy.on(‘fail’)进行调试.
这与使用expect().to.throw()的单元测试类似,以检查异常是否按预期发生,因此我觉得这里的模式是合理的.
为了彻底,我会包含一个click({force:true})的调用.
it('should fail the click() because element is covered', (done) => { // Check that click succeeds when forced cy.get('button').click({ force: true }) // Use once() binding for just this fail cy.once('fail', (err) => { // Capturing the fail event swallows it and lets the test succeed // Now look for the expected messages expect(err.message).to.include('cy.click() failed because this element'); expect(err.message).to.include('is being covered by another element'); done(); }); cy.get("#button-covered-in-span").click().then(x => { // Only here if click succeeds (so test fails) done(new Error('Expected button NOT to be clickable, but click() succeeded')); }) })
作为自定义命令
我不确定如何制作你要求的chai扩展,但逻辑可以包含在自定义命令中
/cypress/support/index.js
Cypress.Commands.add("isNotActionable", function(selector, done) { cy.get(selector).click({ force: true }) cy.once('fail', (err) => { expect(err.message).to.include('cy.click() failed because this element'); expect(err.message).to.include('is being covered by another element'); done(); }); cy.get("#button-covered-in-span").click().then(x => { done(new Error('Expected element NOT to be clickable, but click() succeeded')); }) })
/cypress/integration/myTest.spec.js
it('should fail the click() because element is covered', (done) => { cy.isNotActionable('button', done) });
注意
当测试的前提(即按钮被覆盖)是假的时候,我期待done()超时.
这不会发生(原因未知),但是通过链接.then()关闭第二次单击允许使用错误消息调用done().只有在点击成功时才会调用then()回调,否则cy.once(‘fail’)回调会处理点击失败(根据赛普拉斯自己的测试).