Tengo la siguiente situación inicial:
Nuestras pruebas se refieren a una tienda que está disponible en varios idiomas a través del menú desplegable de países. Dependiendo del país, la tienda tiene diferentes características y, por lo tanto, también diferentes pruebas.
Tengo dos problemas aquí. La primera es la estructura de carpetas.
Para no tener un repositorio separado para cada país, nos gustaría separar las especificaciones de prueba para las tiendas por carpetas. Pero dado que los PageObjects son idénticos, me gustaría definirlos solo una vez, para que las especificaciones de prueba puedan acceder a ellos. Sin embargo, no funciona como lo imagino.
Aquí está mi idea de la estructura de carpetas en Cypress:
cypress-automation cypress fixtures integration shops shop_de sample-tests.spec.js shop_en sample-tests.spec.js shop_es sample-tests.spec.js plugins index.js support pageObjects samplePageObject.js index.js commands.js node_modules cypress.json package-lock.json package.jsonSin embargo, no funciona porque Cypress pierde los PageObjects. Se produce el siguiente error:
Error: webpack compilation error ./cypress/integration/shops/shop_en/sample-tests.spec.js Module not found: Error: Unable to resolve '../support/pageObjects/samplePageObject.js' in 'C:\users\users\desktop\cypress-automation\cypress\integration\shops\shop_en'. El segundo problema se refiere a index.js , allí tengo que agregar un cambio de país en el método beforeEach , porque las URL de las tiendas son idénticas y la tienda solo se puede cambiar a través del menú desplegable. Lamentablemente, no sé cómo integrar index.js en la carpeta de la tienda, de modo que sample-tests.spec.js acceda a un index.js específico en lugar de uno global. Alternativamente, tendría que ajustar el método beforeEach en cada sample-tests.spec.js pero con tantas especificaciones de prueba, lo encuentro poco práctico.
¿Es eso posible, tal como lo imagino?
EDITAR: @Fody
Lo hice exactamente como dijiste. Sin embargo, ahora me sale un error:
PageObjects_homePage__WEBPACK_IMPORTED_MODULE_1_.HomePage is not a constructorAquí hay un ejemplo de mi código de cómo lo incluí:
import { HomePage } from "@PageObjects/homePage";el constructor se ve así
const homePage = new HomePage();Clase de página de inicio:
class HomePage { testMethod() { testcode() } } export default HomePage;Para la primera parte, configure un alias de paquete web para facilitar la importación desde cualquier lugar en las carpetas de integración, cualquier nivel de anidamiento.
Agregue el paquete Cypress Webpack Preprocessor , siguiendo sus instrucciones
npm install --save-dev @cypress/webpack-preprocessornpm install --save-dev @babel/core @babel/preset-env babel-loader webpack - si aún no está instaladoo con hilo
yarn add -D @cypress/webpack-preprocessoryarn add -D @babel/core @babel/preset-env babel-loader webpack - si aún no está instaladociprés/plugins.index.js
/// <reference types="cypress" /> const path = require('path'); const webpack = require('@cypress/webpack-preprocessor'); console.log('__dirname', __dirname) // __dirname is cypress/plugins module.exports = (on) => { const options = { webpackOptions: { resolve: { alias: { '@PageObjects': path.resolve(__dirname, '../../cypress/support/pageObjects') }, }, }, watchOptions: {}, }; on('file:preprocessor', webpack(options)); };cypress/integration/shops/shop_de/sample-tests.spec.js
// resolves any level of nesting import {MyPageObject} from '@PageObjects/samplePageObject.js' ...cypress/integration/shops/shop_de/bavaria/sample-tests.spec.jbs
// same import after move to sub-folder import {MyPageObject} from '@PageObjects/samplePageObject.js' ...