Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

146
Vistas
cómo almacenar el valor de varios elementos en un elemento raíz en la lista de matriz con ciprés

Para el siguiente resultado como estructura

 <div class="results"> <div class="result"> <div class="name">x</div> <div class="price">99</div> </div> <div class="result"> <div class="name">y</div> <div class="price">88</div> </div> </div>

Quiero almacenar en una lista de matriz como esta

 var resultList = [{"name":"x","amount":"99"}, {"name":"y","amount":"88"}]

Y en cypress, tengo el siguiente código en cypress pero se imprime nulo y no estoy seguro de cómo resolverlo.

 let listOfResults = []; let singleResult = {}; cy.get('[class="results"]').each((resultItem) => { singleResult = {}; //Retrive name cy.wrap(resultItem) .find('div[class$="name"]') .invoke("text") .then((val) => { cy.log("singleResult value for Title:" + val); singleResult["title"] = val; cy.log("singleResult::" + JSON.stringify(singleResult));//prints correctly }); //Retrive price cy.wrap(resultItem) .find('div[class$="amount"]') .invoke("text") .then((val) => { cy.log("singleResult value for Title:" + val); singleResult["amount"] = val; cy.log("singleResult::" + JSON.stringify(singleResult)); //prints correctly }); }); listOfResults.push(JSON.stringify(singleResult)); //singleResult became blank cy.log("list:" + JSON.stringify(listOfResults));
about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Debe ajustar el código que sigue a su extractor en .then() porque los comandos de Cypress son asíncronos.

 let listOfResults = []; let singleResult = {}; cy.get('[class="results"]') .each((resultItem) => { ... }) .then(() => { listOfResults.push(JSON.stringify(singleResult)); cy.log("list:" + JSON.stringify(listOfResults)); })

Cuando llama a cy.log() , siempre toma su valor antes de que se ejecute la prueba, a menos que esté dentro de .then() . Entonces cy.log("list:" + JSON.stringify(listOfResults)) ve la listOfResults vacía.

Tres cosas más:

Iterar clase = "resultado"

cy.get('[class="results"]') debe ser cy.get('[class="result"]') porque class="results" es el div general, pero desea iterar class="result" divs (suponiendo que su HTML reducido sea preciso)

Empuje dentro de .each()

listOfResults.push(JSON.stringify(singleResult)) debe estar dentro de .each() porque está presionando el resultado único de cada iteración. Pero también necesita un .then() para hacer eso, para asegurarse de presionar después de que se complete singleResult (el mismo problema que el anterior, comandos asíncronos).

no tensar

No necesita especificar cadenas para los registros, solo agregue una coma. De esa manera, mantiene la estructura del objeto para un uso de prueba descendente más fácil/mejor.

 const listOfResults = []; // let singleResult = {}; // don't need this here cy.get('[class="results"]').each((resultItem) => { const singleResult = {}; // declare it fresh each iteration //Retrive name cy.wrap(resultItem) .find('div[class$="name"]') // also 'div.name' .invoke("text") .then((val) => { cy.log("singleResult value for Title:" + val); singleResult["title"] = val; cy.log("singleResult::", singleResult); }); //Retrive price cy.wrap(resultItem) .find('div[class$="amount"]') // also 'div.amount' .invoke("text") .then((val) => { cy.log("singleResult value for Title:" + val); singleResult["amount"] = val; cy.log("singleResult::", singleResult); }); // Now push to list cy.then(() => { listOfResults.push(singleResult) }) }) .then(() => { cy.log("list:", listOfResults); })

O usa un alias

 const listOfResults = []; cy.get('[class="result"]').each((resultItem) => { ... }) .then(() => { cy.wrap(listOfResults').as('listOfResults') // save for later in the test }) // later on cy.get('@listOfResults') .then(listOfResults => { cy.log("list:", listOfResults) // logs the value of parameter // not the outer listOfResults })

ingrese la descripción de la imagen aquí

about 4 years ago · Juan Pablo Isaza Denunciar

0

También puede usar un archivo de escritura para esto. Básicamente, crea un JSON vacío en su archivo de accesorios y luego crea la estructura del JSON que desea. {flag: 'a+'} agregará los datos al final del archivo en lugar de reemplazar el contenido.

 cy.writeFile('cypress/fixtures/example.json', '') //Remove everything from the previous iteration cy.writeFile('cypress/fixtures/example.json', '[') //Start Array cy.get('[class="results"]').each((resultItem) => { //Retrive name cy.wrap(resultItem) .find('div[class$="name"]') .invoke('text') .then((val) => { cy.log('singleResult value for Title:' + val) cy.writeFile('cypress/fixtures/example.json', '{"name":', {flag: 'a+'}) cy.writeFile('cypress/fixtures/example.json', `${val}`, {flag: 'a+'}) cy.writeFile('cypress/fixtures/example.json', ',', {flag: 'a+'}) }) //Retrive price cy.wrap(resultItem) .find('div[class$="amount"]') .invoke('text') .then((price) => { cy.log('singleResult value for Title:' + price) cy.writeFile('cypress/fixtures/example.json', '"amount":', {flag: 'a+'}) cy.writeFile('cypress/fixtures/example.json', `${price}`, {flag: 'a+'}) cy.writeFile('cypress/fixtures/example.json', '},', {flag: 'a+'}) }) }) cy.writeFile('cypress/fixtures/example.json', '\b', {flag: 'a+'}) //Remove last comma cy.writeFile('cypress/fixtures/example.json', ']', {flag: 'a+'}) //End Array
about 4 years ago · Juan Pablo Isaza Denunciar

0

Solo para aclarar cómo escribir valores JSON en un archivo, ya que no pude transmitirlos correctamente en los comentarios.

 cy.writeFile('cypress/fixtures/example.json', `{ "name": "${val}" }`, {flag: 'a+'}) ... cy.writeFile('cypress/fixtures/example.json', `{ "amount": "${price}" }`, {flag: 'a+'})

Sin las comillas, el json del archivo no es válido y no se puede leer.

Hay otro problema, la coma final en la matriz causa un problema. Publicaré más si puedo averiguar cómo evitar ese problema.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda