Soy nuevo en Cypress y trato de crear un marco en POM. He seguido estos pasos para crear el marco.
{ "RxClaims_LoginPage": { "UserName":"#f0", "Password":"#f1", "SignInButton":"#xlg0003" } } /// <reference types="Cypress" /> import ORLoginPage from '../PageObjects/OR_Login' describe('OR_Approach',function(){ it('RxClaimsLogin', function() { const login = new ORLoginPage(); cy.visit('/') cy.wait(2000) login.EnterData_In_UserName() login.Password() login.SignInButton() }) })3. Y he creado otra carpeta en Integración> POM que consta de todos los POM, uno de ellos llamado OR_Login.js parece
class ORLoginPage{ EnterData_In_UserName() { cy.fixture('example').then(function (dataJson) { this.testData = dataJson; }) cy.fixture('locators').then(function (oRdata) { this.objRep = oRdata; }) cy.enterDatainTextBox(this.objRep.RxClaims_LoginPage.UserName,this.testData.UserName) return this } Password(){ return 'cy.enterDatainTextBox(this.objRep.RxClaims_LoginPage.Password,this.testData.Password)' } SignInButton(){ return 'cy.clickOnObject(this.objRep.RxClaims_LoginPage.SignInButton)' } } export default ORLoginPage; Cypress.Commands.add('enterDatainTextBox', (textBoxElePath, textValue) => { cy.get(textBoxElePath).type(textValue) })Entonces, mi pregunta es: quiero acceder a los datos de locators.js para todas las funciones en OR_Login.js . Probé el método beforeEach para archivos de prueba que funciona bien, pero cuando lo uso en cualquier clase como OR_Login.js no funciona. Sugiera alguna forma para que los datos de los dispositivos se puedan leer en los archivos de clase POM.
La forma beforeEach() no funcionará en OR_Login.js porque no es un archivo de prueba y mocha no está ejecutando ese archivo.
En su lugar, simplemente puede importar el archivo JSON como una variable a OR_Login.js y usar esa variable.
// OR_Login.js const locators = require('./path/to/locators.json'); class ORLoginPage { ... Password(){ return cy.enterDatainTextBox(locators.RxClaims_LoginPage.Password,locators.Password) } ... } Si tiene datos dinámicos que cambiarán en función de la clase, también podría crear su clase con un constructor que apuntaría a los datos correctos en el archivo locators.json .
Habiendo dicho todo eso, Cypress le recomienda encarecidamente que no use POM con Cypress. Si elige continuar usando el POM con Cypress, le recomiendo encarecidamente que todas las funciones que ejecute en una prueba estén contenidas dentro de la clase que ejecuta el código (en lugar de mezclar cy. y su clase en la prueba), así como ver cómo puede encadenar mejor su comando entre sí, para que se ejecuten en la misma cadena de comando de Cypress.
El problema de usar POM con Cypress es que funciona contra los ganchos de Mocha como beforeEach() , que son muy útiles para pruebas legibles.
Pero las clases tienen constructores que podrían usarse para llenar su this.testData .
class ORLoginPage{ constructor() { cy.fixture('example').then(function (dataJson) { this.testData = dataJson; }) cy.fixture('locators').then(function (oRdata) { this.objRep = oRdata; }) } EnterData_In_UserName() { cy.enterDatainTextBox(this.objRep.RxClaims_LoginPage.UserName, this.testData.UserName) return this } Password() { ... } SignInButton(){ ... } } export default ORLoginPage; El cy.fixture() es asíncrono porque lee un archivo, por lo que puede ser mejor usar un método init() .
Esto será útil para cualquier comando asíncrono que tenga en el POM.
class ORLoginPage{ init() { return new Promise((resolve, reject) => { cy.fixture('example').then(function (exampleData) { this.testData = exampleData cy.fixture('locators').then(function (locatorData) { this.objRep = locatorData; resolve(true) }) }) } } ... /// <reference types="Cypress" /> import ORLoginPage from '../PageObjects/OR_Login' describe('OR_Approach',function(){ it('RxClaimsLogin', async function() { // add async to the test const login = new ORLoginPage(); await login.init() cy.visit('/') cy.wait(2000) login.EnterData_In_UserName() login.Password() await login.SignInButton() // may be useful to await other async methods }) })