Cypress-等待按钮可点击

Cypress-等待按钮可点击,cypress,Cypress,我知道它大部分时间都能工作,但在我测试的一个网页上,在下面的一行 cy.get('button[title="Query"]').click() Cypress runner已通过get,但挂起单击操作直到超时。如果我将代码修改为 cy.get('button[title="Query"]').as('query') cy.wait(500) cy.get('@query').click() 测试成功 显然,任意等待是一种糟糕的做法。自动等待、重试功能

我知道它大部分时间都能工作,但在我测试的一个网页上,在下面的一行

cy.get('button[title="Query"]').click()
Cypress runner已通过
get
,但挂起
单击
操作直到超时。如果我将代码修改为

cy.get('button[title="Query"]').as('query')
cy.wait(500)
cy.get('@query').click()
测试成功

显然,任意等待是一种糟糕的做法。自动等待、重试功能——正如Cypress所声称的那样,应该可以防止上述情况发生,但在我的例子中失败了


此外,Cypress没有
should('be.clickable')
断言。我如何指示Cypress在单击按钮之前等待按钮可单击,或者如果单击“挂起”,则每隔一段时间重试,直到成功?

问题不在于按钮不可单击,而是它卡在了单击处理程序中

默认情况下,每个
元素都有一个单击处理程序。例如,一个非常简单的页面

<button>Click me</button>
记录这个

ƒ click() { [native code] }
undefined
即使删除了单击处理程序,它也不会挂起或出错

<button id="thebutton">Click me</button>
<script>
  const button = document.getElementById('thebutton')
  button.click = undefined;
</script>
但这并不是错误


您需要找出单击处理程序中发生了什么导致挂起。

问题不是按钮不可单击,而是它卡在了单击处理程序中

默认情况下,每个
元素都有一个单击处理程序。例如,一个非常简单的页面

<button>Click me</button>
记录这个

ƒ click() { [native code] }
undefined
即使删除了单击处理程序,它也不会挂起或出错

<button id="thebutton">Click me</button>
<script>
  const button = document.getElementById('thebutton')
  button.click = undefined;
</script>
但这并不是错误


您需要找出导致挂起的单击处理程序中发生了什么。

该问题可能是由cypress脚本和app code之间的竞争条件
cy.get
之前造成的,在单击时,应用程序页面状态仍处于转换状态,因此按钮可见并已启用,但预期的事件侦听器尚未连接到按钮。如果下面的代码也起作用,则更可能是这样

cy.wait(500).get('button[title="Query"]').click()
比等待任意长度更好的替代方法是为其他DOM元素添加断言,以确保按钮处于单击就绪状态。在我的例子中,按钮位于选项卡中。我在单击按钮之前单击了选项卡。因此,请确保选中选项卡,并首先渲染选项卡中的元素

cy.get('li[aria-label="Service Selected"]')
cy.get('table.xxx thead tr :nth-child(3)').should('include.text', 'foo')
cy.get('button[title="Query"]').click()

该问题可能是由于cypress脚本和app code之间在
cy.get
之前的竞态条件造成的,即在单击时,app页面状态仍处于转换状态,因此按钮可见并已启用,但预期的事件侦听器尚未连接到按钮。如果下面的代码也起作用,则更可能是这样

cy.wait(500).get('button[title="Query"]').click()
比等待任意长度更好的替代方法是为其他DOM元素添加断言,以确保按钮处于单击就绪状态。在我的例子中,按钮位于选项卡中。我在单击按钮之前单击了选项卡。因此,请确保选中选项卡,并首先渲染选项卡中的元素

cy.get('li[aria-label="Service Selected"]')
cy.get('table.xxx thead tr :nth-child(3)').should('include.text', 'foo')
cy.get('button[title="Query"]').click()

你好您是否尝试使用单击命令()中的选项?e、 g.单击({timeout:10000})否,但我将defaultCommandTimeout全局更改为60秒。刚才尝试了超时选项。没有效果。你是否尝试过
应该('be.visible')
?我让它工作并发布了我的答案。嗨。您是否尝试使用单击命令()中的选项?e、 g.单击({timeout:10000})否,但我将defaultCommandTimeout全局更改为60秒。刚才尝试了超时选项。没有效果。您是否尝试过
应该('be.visible')
?我让它工作并发布了我的答案。如果单击处理程序中发生卡滞,它无法解释为什么单击处理程序在500毫秒后调用时不会挂起,如第二段代码所示。好吧,这意味着需要完成一些事情(可能是获取)如果在点击处理程序中发生卡滞,它不能解释为什么点击处理程序在500毫秒后调用时不会挂起,如第二段代码所示。这意味着在点击处理程序工作之前需要完成一些事情(可能是获取)。