Hola amigos, soy nuevo en la automatización de ui/cypress. Estoy tratando de crear un comando personalizado que lea datos de ui y los devuelva al comando de llamada donde puedo compararlos con datos de prueba y validar el resultado, por ejemplo.
para el comando personalizado en support\commands.js
continuación está mi código que toma el nombre de la companyname
como parámetro y lee la contact info
de ui
Cypress.Commands.add('readContactInfo', (companyName) => { cy.get('.simple-table__cell:nth-child(1)').contains(companyName).parent().within(function() { cy.get('div').eq(2).then(function(res) { cy.log(res.text()) }) }) })
y cuando lo llamo desde el archivo test.spec.js
como a continuación
cy.readContactInfo('Magazzini Alimentari Riuniti')
la salida es como
log Giovanni Rovelli
pero quería que readContactInfo
devolviera el text value
al comando cypress como lo hace la función normal ...
lo que intenté
Cypress.Commands.add('readContactInfo', (companyName) => { cy.get('.simple-table__cell:nth-child(1)').contains(companyName).parent().within(function() { cy.get('div').eq(2).then(function(res) { return cy.wrap(res.text()) }) }) })
y cuando lo llamo desde el archivo test.spec.js
como a continuación
cy.readContactInfo('Magazzini Alimentari Riuniti').then(text)=>{ cy.log(text); }
la salida es como
8 get .simple-table__cell:nth-child(1) 9 -contain Magazzini Alimentari Riuniti 10 -parent 11 -within 12 get div 13 -eq 2 14 wrap Giovanni Rovelli l5 log <li.simple-table__row>
Tendrás que devolver toda la cadena de mando del sujeto que quieras devolver.
Cypress.Commands.add('readContactInfo', (companyName) => { return cy.get('.simple-table__cell:nth-child(1)') .contains(companyName) .parent() // find command limited to previous subject .find('div') .eq(2) // will invoke .text() and return it .invoke('text') })
Ahora, siempre que use el comando personalizado, se devolverá el texto.
cy.readContactInfo('Magazzini Alimentari Riuniti') .should('eq', 'text you want to verify here')
Está en el camino correcto, pero tenga en cuenta que no necesita devolver nada, el cy.wrap()
es suficiente (Cypress establece su res.text()
como el asunto actual).
El problema es que .within()
siempre restablece el tema, y dado que envuelve el tema que desea, tiene la última palabra, por así decirlo.
Reemplácelo con .find()
Cypress.Commands.add("readContactInfo", (companyName) => { cy.get(".simple-table__cell:nth-child(1)") .contains(companyName) .parent() .find("div") .eq(2) .then(function (res) { return cy.wrap(res.text()); }); });
También puede acortar el res.text()
Cypress.Commands.add("readContactInfo", (companyName) => { cy.get(".simple-table__cell:nth-child(1)") .contains(companyName) .parent() .find("div") .eq(2) .invoke('text') });
Ref .dentro()
rendimientos
.within() produce el mismo asunto que se le dio en el comando anterior.