Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

141
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!