Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

190
Visualizações
Aserción de texto en Cypress con consulta anidada

Soy nuevo en Cypress y trato de escribir una afirmación para algunas entradas de texto para un nombre de usuario. Un texto válido para un nombre de usuario debe cumplir dos condiciones, que son,

  1. El texto debe contener SOLAMENTE letras en inglés.
  2. La longitud del texto debe ser mayor que 1 y menor que 20.

Mi código es el siguiente.

 getUserFirstName(textInput) { cy.get('[testid="user-self-update-form"]') .get('input[name="firstName"]') .clear() .type(textInput) .blur() .invoke('val') .should(($el) => { expect($el).to .match(/[a-zA-Z]+$/) .to .have .greaterThan(1) .to .be .lessThan(20) }).then(() => { cy.log("Invalid text input"); }) }

Mi requisito : cuando se inserta un texto de nombre de usuario, la prueba anterior debe verificar si cumple con las condiciones impuestas; de lo contrario, registrar un mensaje en la consola. Ahora estoy tratando de hacer la prueba anterior para 4 entradas por separado, que son 'abcd123', '123', 'textwithmorethantwentyletters' y 'belowtwenty'. Al ejecutar esta prueba para el primer texto de entrada de 'abcd123'. ¿Cómo puedo corregir este código? Agradezco mucho su ayuda.

Recibo el siguiente error y la prueba falla:

ingrese la descripción de la imagen aquí

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Para obtener un registro elegante de las condiciones, use Cypress.log

 getUserFirstName(textInput) { cy.get('[testid="user-self-update-form"]') .find('input[name="firstName"]') .clear().type(textInput).blur() .invoke('val') .then(val => { // Conditions const lettersOnly = val.match(/[a-zA-Z]+$/) const correctLength = val.length > 1 && val.length < 20 Cypress.log({ name: 'firstNameCheck', displayName: `Testing "${textInput}"`, message: ` - lettersOnly: ${lettersOnly ? 'pass' : 'fail'}` }) Cypress.log({ name: 'firstNameCheck', displayName: `Testing "${textInput}"`, message: ` - correctLength : ${correctLength ? 'pass' : 'fail'}` }) // now fail if you want, or omit this to perform next textInput expect( lettersOnly && correctLength ).to.eq(true) }) } const textInputs = ['abcd123', '123', 'textwithmorethantwentyletters', 'belowtwenty'] textInputs.forEach(textInput => getUserFirstName(textInput))

ingrese la descripción de la imagen aquí

También puede suprimir el registro de find , type , invoke con la opción {log:false} .

about 4 years ago · Juan Pablo Isaza Relatório

0

Puedes intentar encadenar las condiciones con Cypress .and()

 getUserFirstName(textInput) { cy.get('[testid="user-self-update-form"]') .find('input[name="firstName"]') .clear() .type(textInput).blur() .invoke('val') .should('match', /[a-zA-Z]+$/) .and('have.length.gt', 1) .and('have.length.lt', 20) }

La entrada abc123 no cumple con el primer criterio, ¿por qué pensó que pasaría la prueba?

Si solo desea iniciar sesión pero no fallar la prueba, intente

 getUserFirstName(textInput) { cy.get('[testid="user-self-update-form"]') .find('input[name="firstName"]') .clear() .type(textInput).blur() .invoke('val') .then(val => { const lettersOnly = val.match(/[a-zA-Z]+$/) const gt1 = val.length > 1 const lt20 = val.length < 20 if (!lettersOnly || !gt1 || !lt20) { cy.log('Failed conditions') // to fail the test now, throw an error throw 'Failed conditions' }) }) }

En el segundo ejemplo, no .should() , .and( .and() o expect() porque si alguno de ellos falla, Cypress fallará la prueba en ese punto (y no verificará las otras condiciones).

Tenga en cuenta también, .find(('input[name="firstName"]') en lugar de .get('input[name="firstName"]') porque su intención es encontrar la entrada del nombre dentro del formulario.

.get() también puede funcionar si solo hay una 'input[name="firstName"]' en la página, pero tenga en cuenta que ignora la línea anterior y consulta DOM desde el elemento raíz <body> .

about 4 years ago · Juan Pablo Isaza Relatório

0

Su respuesta es mayormente correcta, pero solo necesita algunos cambios.

  1. Está aplicando dos aserciones: para verificar que el texto del nombre de usuario coincida con el valor de expresión regular y que la longitud del texto esté entre 1 y 20. En su caso, dos aserciones diferentes funcionarán mejor.
 expect($el).to.match(/[a-zA-Z]+$/) expect($el.length).to.have.greaterThan(1).to.be.lessThan(20)

También puede usar dentro de la cual básicamente verifica mayor y menor que.

 expect($el.length).to.be.within(1,20)
  1. En lugar de usar cy.log("Invalid text input"); puede pasar directamente mensajes de registro personalizados en declaraciones de expectativa.
 expect($el.length).to.be.within(1,20, "Some Log message")

Entonces, al implementar estos dos cambios, su código debería verse así:

 cy.get('[testid="user-self-update-form"]') .get('input[name="firstName"]') .clear() .type(textInput) .blur() .invoke('val') .should((val) => { expect(val.trim()).to.match(/[a-zA-Z]+$/, `Checking username ${val} for regex match` ) expect(val.trim().length).to.be.within(1,20, `Checking username ${val} for length match` ) })
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda