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));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.
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 })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 ArraySolo 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.