如何选择cypress中select元素中的第n个项目

JD.*_*JD. 20 cypress

说我有HTML:

<select name="subject" data-testid="contact-us-subject-field">
  <option value="What is this regarding?">What is this regarding?</option>
  <option value="Partnerships">Partnerships</option>
  <option value="Careers">Careers</option>
  <option value="Press">Press</option>
  <option value="Other">Other</option>
</select>
Run Code Online (Sandbox Code Playgroud)

选择具有已知值的选项(例如"职业")就像以下一样简单:

cy.get('[data-testid="contact-us-subject-field"]').select('Careers');
Run Code Online (Sandbox Code Playgroud)

如何在此字段中选择第n个选项,无论其值如何?

Arn*_*d P 32

通过使用eq

cy.get('tbody>tr').eq(0)    // Yield first 'tr' in 'tbody'
cy.get('ul>li').eq(4)       // Yield fifth 'li' in 'ul'
Run Code Online (Sandbox Code Playgroud)

  • 这不会选择任何内容。它确实演示了作为解决方案一部分所需的 .eq() 语法,但忽略了需要操作选择的重要上下文。请参阅下面罗伯特或米格尔的解决方案。 (3认同)
  • `eq`是缩写吗?这是什么意思? (2认同)
  • 正如我链接的文档页面所提到的,该术语来自 jQuery。所以您可能对[这篇文章](/sf/ask/1054144521/)感兴趣 (2认同)

t_d*_*m93 23

index您现在可以在命令中选择一个选项.select(index)

cy.get('select').select(0)        // selects by index (yields first option) ie "What is this regarding?"
cy.get('select').select([0, 1])   // select an array of indexes
Run Code Online (Sandbox Code Playgroud)

随着 cypress v8.5.0的发布,这应该很容易。请参阅文档了解更多信息。


Rob*_*ell 7

选择第n个特定的上下文中option,这可能是适当的:

cy.get('select[name=subject] > option')
  .eq(3)
  .then(element => cy.get('select[name=subject]').select(element.val()))
Run Code Online (Sandbox Code Playgroud)

  • 正是我正在寻找的,请注意,很快可能会有一个更简单的解决方案 https://github.com/cypress-io/cypress/issues/757。对@Robert的小建议是使用 cy.wrap() +parents() 来不重复选择器:`.eq(2).then(($el) =&gt; cy.wrap($el).parent('select' ).select($el.val()))`。 (2认同)

小智 7

我遇到了同样的问题,并通过创建自定义 cypress 命令解决了它。没有我想要的那么漂亮,但它完成了工作。

Cypress.Commands.add("selectNth", (select, pos) => {
  cy.get(`${select} option +option`)
    .eq(pos)
    .then( e => {
       cy.get(select)
         .select(e.val())
    })
})
Run Code Online (Sandbox Code Playgroud)

然后我在测试中使用

    cy.viewport(375, 667)
      .selectNth("customSelector", 3)
Run Code Online (Sandbox Code Playgroud)

option +option部分是我能找到的在选择中获取完整选项列表的唯一方法,它目前是我正在尝试处理的代码,尽管它工作正常。


Joe*_*let 7

因为工作答案正在使用 then 无论如何, eq 或更奇特的东西对于数组索引来说是多余的......

// to click on the 1st button
cy.get('button').then($elements => {cy.wrap($elements[0]).click();});
// to click on the 4th tr
cy.get('tr').then($elements => {cy.wrap($elements[3]).click();}); 
// to click on the last div:
cy.get('div').then($elements => {cy.wrap($elements[$elements.length - 1]).click();});
Run Code Online (Sandbox Code Playgroud)


Tom*_*ich 5

基于Miguel Rueda的解决方案,但使用prevSubject选项:

Cypress.Commands.add(
  'selectNth',
  { prevSubject: 'element' },
  (subject, pos) => {
    cy.wrap(subject)
      .children('option')
      .eq(pos)
      .then(e => {
        cy.wrap(subject).select(e.val())
      })
  }
)
Run Code Online (Sandbox Code Playgroud)

用法:

cy.get('[name=assignedTo]').selectNth(2)
Run Code Online (Sandbox Code Playgroud)

说明:

  • 使用children('option').eq(pos)遍历select的子元素到特定元素。
  • select用选定元素的值调用方法。