Cómo seleccionar el elemento enésimo dentro del elemento seleccionado en ciprés

4 minutos de lectura

Avatar de usuario de JD.
JD.

decir que tengo el 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>

Seleccionar una opción con un valor conocido, como ‘Carreras’ es tan fácil como:

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

¿Cómo selecciono la enésima opción en este campo? a pesar de todo de su valor?

Avatar de usuario de Arnaud P
Arnaud P.

Actualizar

Como señaló @dpstree en los comentarios, esto no responde a la pregunta original. Consulte las respuestas más recientes para obtener una solución completa.

Original

Mediante el uso equivalente

cy.get('tbody>tr').eq(0)    // Yield first 'tr' in 'tbody'
cy.get('ul>li').eq(4)       // Yield fifth 'li' in 'ul'

  • Es eq ¿una abreviación? ¿Qué significa?

    – nitzel

    26 de junio de 2019 a las 15:10

  • Como se menciona en la página de documentación que vinculé, el término proviene de jQuery. Así que te puede interesar este post

    – Arnaud P.

    27 de junio de 2019 a las 13:13


  • Esto no selecciona nada. Demuestra la sintaxis .eq() que se necesita como parte de la solución, pero pierde el contexto importante de la necesidad de manipular la selección. Vea la solución de Robert o Miguel a continuación.

    – dpstres

    26 de agosto de 2020 a las 15:15

  • Mi palabra, tienes razón, debo haber leído la pregunta demasiado rápido. Editaré para señalar esto.

    – Arnaud P.

    27 de agosto de 2020 a las 8:13

  • Solo recuerda que si guardas esta selección en una variable, no funcionará. const miSelección = cy.get(‘tbody>tr’) ; miSeleccion.eq(0); mySelection.eq(1) –> no habrá un segundo elemento. Debe volver a llamar a una función de selección.

    – Rantiev

    6 mayo 2021 a las 21:35

En el contexto particular de seleccionando el enésimo optionesto puede ser apropiado:

cy.get('select[name=subject] > option')
  .eq(3)
  .then(element => cy.get('select[name=subject]').select(element.val()))

  • un gran aprobado por esta solución inteligente

    – paso nulo

    13 mayo 2020 a las 18:28


  • Exactamente lo que estaba buscando, tenga en cuenta que pronto podría haber una solución más fácil github.com/cypress-io/cypress/issues/757. Pequeña sugerencia para que @Robert use cy.wrap() +parents() para no duplicar el selector: .eq(2).then(($el) => cy.wrap($el).parent('select').select($el.val())).

    – TimNodo

    2 de junio de 2020 a las 13:08

Basado en la solución de Miguel Rueda, pero usando prevSubject opción:

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

Uso:

cy.get('[name=assignedTo]').selectNth(2)

Explicación:

  • Usando children('option') y .eq(pos) atravesar hijos de seleccionar a un elemento específico.
  • Llamada select método con el valor del elemento seleccionado.

Avatar de usuario de t_dom93
t_dom93

Actualización 2021

Ahora puede seleccionar una opción index dentro de .select(index) dominio:

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

Esto debería ser fácil ahora con el lanzamiento de Cypress v8.5.0. Ver documentación para más.

Tuve el mismo problema y lo resolví creando un comando de ciprés personalizado. No es tan bonito como me gustaría, pero hizo el trabajo.

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

luego usé en la prueba como tal

    cy.viewport(375, 667)
      .selectNth("customSelector", 3)

Él option +option parte fue la única forma que pude encontrar para obtener la lista completa de opciones dentro de una selección y actualmente es el fragmento de código con el que estoy tratando de trabajar, aunque funciona bien.

Avatar de usuario de Joelle Boulet
joelle boulet

dado que las respuestas de trabajo están usando entonces de todos modos, eq o algo más elegante es redundante con la indexación de matrices …

// 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();});

Avatar de usuario de Ajay Rawat
Ajay Rawat

Supongamos que desea seleccionar la segunda opción, puede hacerlo simplemente así

cy.get("select option").eq(2)

solo ten en cuenta que cy.get() funciona como jquery $().

¿Ha sido útil esta solución?