javascript - Cypress - 如何等待两个元素中的第二个出现?

标签 javascript cypress

我想等到两个元素中的第二个出现后再对其执行操作。目前,我有这个:

    cy.get('[data-test="insert-item"]').click();
    cy.get('[data-test="textarea"]').eq(1).type('Hello').type('{enter}');

目前此操作失败。我假设这是因为 Cypress 将收集所有出现的 textarea ,然后尝试在第二个实际呈现在页面上之前选择它(因为创建它的异步请求)。如果我添加 cy.wait(2000);它穿过这两条线之间。

有没有办法在不使用 cy.wait(2000) 的情况下做到这一点? ,以便它专门等待第二个项目出现?

最佳答案

您可以使用 :nth(1)eq() 移动到选择器中,这将导致索引成为 cy.get 的一部分()重试机制

cy.get('[data-test="textarea"]:nth(1)')
  .type('Hello').type('{enter}')

或者您可以在对列表建立索引之前断言所选元素的长度。

cy.get('[data-test="textarea"]')
  .should('have.length', 2)
  .eq(1)
  .type('Hello').type('{enter}')

演示

/// <reference types="@cypress/fiddle" />

const waitForAdd = {
  html: `
    <div id="parent">
      <textarea data-test="textarea">1</textarea>
      <button data-test="insert-item" onclick = "myFunction()"></button>
    </div>
    <script>
      const myFunction = () => {
        setTimeout(() => {
          const parent = document.querySelector('div#parent');
          let ta = document.createElement("textarea");
          ta.setAttribute('data-test', 'textarea');
          parent.appendChild(ta);
        }, 500)
      }
    </script>
  `,
  test: `
    cy.get('[data-test="insert-item"]').click();
    cy.get('[data-test="textarea"]:nth(1)')
      .type('Hello').type('{enter}')
    cy.get('[data-test="textarea"]:nth(1)')
      .invoke('val')
      .should('eq', 'Hello\\n')

    cy.get('[data-test="insert-item"]').click();
    cy.get('[data-test="textarea"]')
      .should('have.length', 3)
      .eq(2)
      .type('Hello again').type('{enter}')
    cy.get('[data-test="textarea"]')
      .eq(2)
      .invoke('val')
      .should('eq', 'Hello again\\n')
`
}
it('tests hello', () => {
  cy.runExample(waitForAdd)
})

关于javascript - Cypress - 如何等待两个元素中的第二个出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64943327/

相关文章:

javascript - 通过 navigator.geolocation 以外的方法获取经度/纬度?

javascript - super(props) 为我的 React 组件做了什么?

javascript - 我可以调整iframe变为可滚动位置的高度吗?

integration-testing - Cypress click() 失败,因为该元素在迭代中与 DOM 分离

reactjs - cypress 中获取 (void 0) 是未定义错误

eslint - 有没有更好的方法来抑制关于 Cypress 开玩笑测试顶部的 "triple-slash directive"的 ESLint 错误?

javascript - 如何让我的脚本与数组一起工作?

javascript - 单击搜索图标后使搜索栏缓慢出现

testing - Cypress 测试因我的应用程序未捕获的异常而失败 - support/index.js 不起作用

node.js - 没有 Cypress 仪表板的 Cypress 并行化