如何等待元素在柏树中消失

jai*_*ikl 10 javascript cypress

我有一个加载指示器,需要在断言之前等待消失。

我已经看到了一些使用以下内容的方法,但是它似乎对我不起作用,而且我也不希望它成为断言。 cy.get('element, {timeout: 10000}).should('not.exist);

任何提示吗?

Ali*_*ien 31

cypress-wait-until不适合我。我只使用了基本的:

cy.get('.ant-drawer-body').should('not.exist');
Run Code Online (Sandbox Code Playgroud)

它会自动等待。

  • +1,这应该是公认的答案。快速、简单、干净并解决问题。如果您想要另一个最大超时,只需使用覆盖默认值的标准方法: `cy.get('.selector', { timeout: 10000 }).should('not.exist')` https://docs.cypress .io/api/commands/should#Timeouts (6认同)

小智 17

恕我直言,最干净的方法是不要在 get 中使用等待或超时,这是一种反模式。

我建议使用Cypress waitUntil命令并使用以下内容:

 cy.waitUntil(function() {
  return cy.get('element').should('not.exist');
Run Code Online (Sandbox Code Playgroud)

或根据您可以使用的应用程序代码not.be.visible

  • 来自 cypress-wait-until#readme `最常见的情况是检查元素是否存在,而不是使用 cy.get('#id').should('exist') 您应该检查 Cypress.$(' #id').长度大于0` (6认同)
  • 这不会返回真实值,因此 waitUntil 永远不会退出 (2认同)

Dio*_*cha 11

如果您特别需要等待,可以wait()在声明之前使用赛普拉斯的功能,并提供超时之前要等待的时间。

但是请注意,这是一种反模式,您可以在文档中找到:

您几乎不需要等待任意时间。赛普拉斯始终有更好的表达方式。

也就是说,如果您的加载指示器绑定到某个网络请求,则可以在声明之前等待它们完成。可以通过以下示例实现此目的

// Wait for the route aliased as 'getAccount' to respond
// without changing or stubbing its response
cy.server()
cy.route('/accounts/*').as('getAccount')
cy.visit('/accounts/123')
cy.wait('@getAccount').then((xhr) => {
  // we can now access the low level xhr
  // that contains the request body,
  // response body, status, etc
})
Run Code Online (Sandbox Code Playgroud)

有关等待请求的更多信息,请参见此处

另外,请确保您确实要使用.should('not.exist')而不是.should('not.be.visible')

  • 那么如何等待动画结束呢? (3认同)
  • @EgorPavlikhin 请参阅 Cypress 文档的 [this](https://docs.cypress.io/guides/core-concepts/interacting-with-elements.html#Animations) 部分。 (2认同)
  • 加载指示器绑定到网络请求,但是有时会发出多个请求,并且当我们使用graphQL时,所有请求看起来都是相同的。而且我只对最后一个感兴趣,因为那是应用程序关心的唯一请求。 (2认同)

Phi*_*zen 8

加载微调器实现通常只是隐藏元素而不是从 DOM 中删除它。因此,should("not.exist")不会为他们工作。

cy.get("element").should("not.be.visible")在这种情况下是正确的方法(正如Diogo 的回答已经暗示的那样)。