From 607b46ba6c740bb832feab3e29c07f5024ee8c2d Mon Sep 17 00:00:00 2001 From: Adrian Ciuciui Date: Tue, 25 Mar 2025 22:39:37 +0200 Subject: [PATCH 1/7] refactored the constructor --- pom/cart.page.ts | 6 +----- pom/checkoutOne.page.ts | 6 +----- pom/checkoutTwo.page.ts | 6 +----- pom/confirmation.page.ts | 6 +----- pom/product.page.ts | 6 +----- pom/products.page.ts | 6 +----- 6 files changed, 6 insertions(+), 30 deletions(-) diff --git a/pom/cart.page.ts b/pom/cart.page.ts index beff9ce..7b7a230 100644 --- a/pom/cart.page.ts +++ b/pom/cart.page.ts @@ -2,11 +2,7 @@ import { expect, Page } from "@playwright/test"; export default class CartPage { - page: Page; - - constructor(page: Page) { - this.page = page; - } + constructor(private page: Page) {} buttonCheckout = () => this.page.locator("#checkout"); diff --git a/pom/checkoutOne.page.ts b/pom/checkoutOne.page.ts index b53b8fe..744da1e 100644 --- a/pom/checkoutOne.page.ts +++ b/pom/checkoutOne.page.ts @@ -2,11 +2,7 @@ import { expect, Page } from "@playwright/test"; export default class CheckoutOnePage { - page: Page; - - constructor(page: Page) { - this.page = page; - } + constructor(private page: Page) {} inputFirstName = () => this.page.locator("#first-name"); inputLastName = () => this.page.locator("#last-name"); diff --git a/pom/checkoutTwo.page.ts b/pom/checkoutTwo.page.ts index 0271625..97a1e66 100644 --- a/pom/checkoutTwo.page.ts +++ b/pom/checkoutTwo.page.ts @@ -2,11 +2,7 @@ import { expect, Page } from "@playwright/test"; export default class CheckoutTwoPage { - page: Page; - - constructor(page: Page) { - this.page = page; - } + constructor(private page: Page) {} buttonFinish = () => this.page.locator("#finish"); diff --git a/pom/confirmation.page.ts b/pom/confirmation.page.ts index e4990af..a4c076a 100644 --- a/pom/confirmation.page.ts +++ b/pom/confirmation.page.ts @@ -2,11 +2,7 @@ import { expect, Page } from "@playwright/test"; export default class ConfirmationPage{ - page: Page; - - constructor (page: Page){ - this.page = page; - } + constructor (private page: Page){} buttonBackHome = () => this.page.locator("#back-to-products"); confirmationLogo = () => this.page.getByAltText("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDkuMC1jMDAwIDc5LmRhNGE3ZTVlZiwgMjAyMi8xMS8yMi0xMzo1MDowNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQ4Q0IxMkVBRUZDMTFFREIwRThFMzc3OTlDRTMyNUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQ4Q0IxMkZBRUZDMTFFREIwRThFMzc3OTlDRTMyNUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDhDQjEyQ0FFRkMxMUVEQjBFOEUzNzc5OUNFMzI1QiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDhDQjEyREFFRkMxMUVEQjBFOEUzNzc5OUNFMzI1QiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PojLpNEAABFkSURBVHja7F19TFXnHcbDx0XuBRGQD5fJpVXbCSp0/aAuG9c6+kc1Cm03ty6L2C7r/mgGdsnSZsvEpo39pxGaLpnJGiRb5zobwVld1q4KNm39WAUVbFe1gknlAoLAvXyj7D7YYyjej/O+53fOec+550n0GrmXe857nvf38by/9/fOm56ejrFhgxeSPQQ2bALZsAlkwyaQDZtANmywIS4abnLk5kRq75Tf3THRX9gz5XP33PTnDt+YSO2eGnL7Az/De7yBfwf7bHZcSgdes+KSb73GJ3dkSq7OvIT0VqeUMJCbkNaaFHi10nh9Nub1HBm5sOXs6FUPxsUV6xi4Oz6jdZ1reX2Jc+me2e+dZ7U0HmTpDBDl8mRfYduYt+TSxLXCUOSgwtKEjNasANEKErOb8+LTW7+TmN1k1rGru35i13v+zytCvSc7PqXjxYzScndg4liGQJgx7ePekrNjVz2XJq8V+m+Mpxp9TasTv9W00pHTXJCY02QWQv2mq6HlYmDCRXqfS3IMvJK1YS1IZFoCgTQnR69sem/48woRCBMOmLWrHIubHnEuqxeVTPXXT+7aP3SmiuWedmWXF5mKQDCxh33nKxt8Z6tEJ00kMm1eULQjI87VIcI1vTPYuv0vA6eqWT/37MI120xBIFibvYOnt58Z+8pjpXgNbm5jckHt/UlLGo26hn/5z1f+qe+jGt7rF5ZAsDanRq+U7R38dHvXpLZBsAhW6akF390xN8PRGqdGrpS93PvvBt7PIxYSkkCYFX8d+G+1Wd2UGYh0bcrvrvTub1E7xkIRCDPizYFPdlnd4hhNJJDn9z2HjqodZ2EskFVjHLWAvvTiotJyymAbocHz3oYWikm6Zn7eAUMJhJvZF8gAWNLHaLRGSJep1G6lWo8SPJ/h2WrYUgasTm1/c120u6tI5Hklc/1aKvJA66EiD66txLlsj+4EMsrqYD0nOza54y5HRivWsjIDbmFR4E/m12tceEjBHhTiBf/0ROpIINjEelpP4M/lyf7V/pvjqVqq3rhekIfKfb1DOOYysXUPoqmCN0U3GZfSsWr+4qaChOzm/MScJq1Eu47J/sLOib7Cc6NdnraJrhKqe6td/ESRO/7WehMFeXiEwlDErs1+vEgeT90IdGz40pbd1z+q0TI1h7BVnLTkwIPz3Y1GqbyYJO3jXZ4P/Be28CYFv1z48Lb1KQU1FNejVuuZi51ZG9auCExIXdN41nUWHtJ4nMv3iFZWIZPpn0NtlUpjj58F0vcfp95XTfX9FFpPOGJrSiDEO6/2/qeBOj2HGS1Nuqf+waQljbNng8iAq3t3sK3q/eH/bdGLPJThQqhr04xAWsQ7IM4mV0HthsAsMGsRF8bl4FBb1Ymxzk2zx6bUubz+uYySChHHvix5Ze3WtOKgHkQTAlHfgBWIE2yMjvi/qHhr8NPtEAxfyykvovrdlFoPQoSXsh5bG+rn5ASiJs+jrnv3bF340DarlY3OHi+8UgX9lPGmEhEzTlTyYFY+s7B4m1liHF5QZotaaD2RJi6ZBaIkD2UwGS3QUusJhziRyDNTsL2otJxKQIsWQOuhIg+AemelllE1gZCqU5AHkf7mgNWxaqyjZQxV099UR/X7oPWwTGDVBHqj70PVC6KUymu0kQeTl0ooROjA+hxUEQh+96ORL8vU+NqZ7SG2yzI824UH4Ik7uQmEslM1fleO8kXZmWA27Ox9v4GKPN9LuqsxlFAYCRIv+1GzbJPHGFDX9TyX/v2tvJ/nIpAav2uTR326rrfWQ0ogsJ/XdNrkUU8eSq2H4lkwEQhlqLzst8mjDkZqPSQEgt6DGmabPPoDpSBGaj0kBEIdM6/rot6aEm3p+quBjMtIrUc1gXATvK6Lku3RSB4RtB7VBILmwHvBtsLMD1G0HlUEah6+WMGjOSDu2WyvqHPjj30f1omi9agiELpjcEX5hBviojFdD9dmjieB0epZSJGsD48JRaBmB8385KFK1/XIfiVq64OLtovB+ECt9eiR/UrU1kfe8mqDDSJrPVwE4rE+KIC3XRdfui6y1sNMIJhSHuuDxpE2HdjJo8cGQK0QtB7ooK+tUpTAWW7ne+nrlBZdsR5Kyj2Q78husoK1o9Z61JLn/LjXs8KhvBVxXLAZwboVGYHzI67le6hn5ut9x+qCXQuqIEGk8pRVNU8uKDSt1RNN60Ec9qL34NG9396yUGnaf4cLe3uwhTn2WZOYR9oNQzbr4YiM/jzIWJD2mjVdF0nrwZj/rvvdo/j3oaF2xYr1HQQ6N37Vw/rl61NW1Bpl1s1IItG0nrnF+Y2+c5VcBEK8weqPqTMvnqUTPIxjwxe3mIE86JMkktYTLIiHdT8/1uVhJtCR4QvMD2FDcj6p9Tkx0rmJ53O7+z+uwXFOoms9aLIlktYTytqfDGTizARidV/Yv56bQCtWnRnn6yWEWQMfLjcrsLUedUF8uD5GQQnE4742phTUUg+0mgGeIVHAHItGIhG1nkhBvFI3dptAbQp93mzkO+g7Z6DYW83nvYGHBLM88vVJhEYD1yGa1qM0iG8PGBXFBDo33lXCchFoPKSFkIejFdX+DphlnLwnAoFwHSJpPSwbQpVw4jaBWMXDda5l9VoMeHFS7gGK3wPzXN9/0lASiaj1sBztBPU/kiWX5PhHBPcFeJzL9uTEp5BYtv2+M1VGaURmq+sJFQd1TPQVRiQQDqhlvSGtbgYz7IVFpeVqYyEjNSLRtB4Z+B3yKdSKpYcI0oh0K4D2MsU/OLJRywcAbQMaB9Xv01MjotZ6cKAJZV3PKkdOM8v7z0VIrmYIxHosNo631vpB4CAPpKtUplgPjUgLrQfjQHmNBYlsk//Lyb7VYQmEIOkSY5bgjk/XZZ8X0lVSEmmoEZmlrief8dRoGJdwgbTUyWjaUUZBrT5HIlGp8x6SjE8rjUhErSdcHMQaX/aGmXSSn3Ew707I0H2X6dNpxVVLib5XC42IUuvBfWq1h0tGVmwyWyA9GdrISJHStLlwzksY1JtAyMyQiVCl95QaEbXWg/vUej/d3fHpZ1je3zPpC22BeqZ8TGb3roR0Q/a5w/S+nLl+rUgakVm1HvmQPcUEuunPDUmg7huhfxj0y+OTO2IMAgZXFI1IVK1HCwL5p8YXhk3jWbAo1mkYgUTRiBATvHbtCFl6Ta31RCYQG1F7bvjCWCBGF+aUHIbvdzdSI5K1Hqp70ULriWgEGAkULtFitkBOQRomGKERmX0PlxaQWFVokfZi6akRmUnrUZLVMo1NGI5IMSaHXhrRG4R7uPTQeigJFNYCmZ1AemhEao90mJuu66H16ObCrHATWmpEVqjrsQmkkETUGhF2LVA29rZit1pmAolSrB4M1BoR1RIFYNVutRJrhZrIBAIoNSIqGKH1RJIjmFxvGI5IMRYEpUZEQR7RtB7/NJ0RkFiFQdbFVyNJRKUR8aLUubxeRKFw9AYbgbLCrJ0xu7DeG8OmIBBAqRGxAt/7dNrDVSKOSw9hVabknBfPVN8TrjZENFBrRCzpushaD6sXyQpTgSFR1oaImt5TakRKyCO61nN5sn81y/szJVcnGYG+HL9WGGMyUGtEoWAWrQeLxyzvzwtTAy/lOti0Ce+UeVzYbFBrRMFgFq3n0iSbEQjniqXMWNbakPFUUXvwRIKWGpFoWk8ooBiOdd+aO0wZswR2sWZi7ePse+lFSu/LklfVUpPHLHU9rNu4kE2GtUD4i3WrThtjKxjRsDXtoSoqjUhUrSfksxtje3aZscmdYdN4/MW6VfnsKHsnV9FAoRGJrPWEAmsbw5WJ4buwSHKAyRZID7nNGgfNDgzVaERmrOvBM2OtqHRH2IUsyUESa4p7cqSzLMbkkDUi1ns3a10PT+y6QokFwixibS13fJSvHa+IJMIZ6kpJZOa6ng/8XzDtgUMbw0jvub0av5Kxbwxa4ole2qHYTDNoRFVpJVvNWNfDcwaKEk7cJhBr2w+gyX+hIsYiUKIR4ecPJOU2mvH+eNyXEk5Is30dayxgFTcmI5xGZPY9XAeGzjEd4YU4L1L88w0CzWgaSWzaCEzieY7+0iIjmEZkNq1nLqA+szYRU9rG8BsEejBpCbN5VnqmgpkwWyOa2cOVUWJqV31oqJ35AMG1zqX1zATicWM4U8EqwbQMWSNCFoJXM98LgmfWzQFK3dcdBALKXCuZ1omwuMpyQJmZ0vuXsh4z/R6ud33nma0PSxfeOwi0PiWfuUUtDiizmhWyAmB9jo9eZg4xWA5PloKZbyUCUjRYIbOjafjiFtalC9YzUIJu6/kJx/HdthUSz/rw7KrdyHiAYFACIYBiXWSEFRLlhBwbfIcnI3i+n1EoDbmx8KcL7mO2Qoj2raYLRUvmBTzF8cxDEuiB+bmNPEXob14/blshg4EuajzWh6ckVwqnhfAwEk2Y9g20VNuP0RigHQ1PFzWeZw3Mm56eDvuGX119+zLPBdXmPFHkTrBeNwrRXdczX+29zGN9di/enMfznRGbKzyTWsy1FWbnNXHOLY0GYKx5XJca66OIQChfYNWFADSt3DdgzGmB0Yh9nK4La31qtiMpau/CowsBaBV32BYYNQcO0t0/dIZrnNWu9SkiEHQh3r1Uu69/vEuv0wKjESjVYDlIdzbKklfWql3rU9xganNqUTXvDgY9TguM1qCZt2s+AufNBDVOigmEtP7XaT/g6m2s9WmB0UoeNV3zKwPPkmJLElOLOzWuDEG1TSIxyAPXpbTeJxIi6kDB0sXnvQ0tvBdvxV7JZiKPGs1HtQWSXRnPZjzbEhlPHjwzTF7Ka+Lq0grroabXjk0i/ckDPJVy3w5qy8/d5hfik5o2KTKJ7BRfWape6d3fooY82Ja0PqWghvramGOgufhD9+GjrDse5+LZhWu2PcZRShsNgEjIq/PIwNFSv120TpPNAaoJpDaolvF48uqaH6UW7rDKKTZqgXHF8gSvwjw7aN6VXV6k1biqJhCVf7YztG+6rFcJDrfTYzxJCERJIuDnqQ9UP7mgcEc0kofqeCm9JiMZgahJFG3W6LMxr+fP1z/ZRXEqop5jR0ogahIBj7ru3YN9SlYlEmIdbEagOlpK74lHTiAtSCS7NY9zab1ViATiHPadr2zwna1ibbsrktXWhEBakQgDtGZ+XuP65BW1ZiWSFsQx0uVrRiB5sHDaMdWBtXNd24bk/Npck9RdI8Y5OXpl03vDn1dQEgdAxegLi35oSMNPTQkk4x8Dp6vfGvxUk/JWlGRuTFlZm+/IbhLNKmECNQ1fqDg+0rlJrdgaClhZ35pWbFjVpy4EAg752qr+Nnh6O/XsmzsT17mW1xtJpmtTw+6Tox1lWpIGwMIo1iONPl5BNwJpFReFiwnQpqQgMacZTTG1cnUgTPtYl6dtoqsEDdjRQ1uPexNF4tCVQDLq+k/UNPrOVur5nZixaGXskhwDefFpZ3DMVWbgASBucAb+LyPO2RHMBY3cnJyxmL1TPjdO+sNhbTgzDcdeeW/43Fpa1FAuC6Wooiz5GEIgAHvoX+8/VqeHNbICYHVQhkpVSWh6Askz/O2Blmq9rZHZIJrVEYZAs2Ojnb3vN1DI+FYCkgLsyRPN6ghHIBnNgZR3byBTi3a3Bnf1i9TibWZoai4UgaKdSAj0UXaqReVgVBEo2ogEi4MGB+jJZLaCOqEJJOPUSGfZQV97pZbCnB3jWJhAs4Ptvw+croZoZ1arBDe1yVVQuyHgpqxQvmsqAs0GdKQj/gsVZiATSINzSHCUhJmtjaUINJdM7WNez7nxrhIR3Jysehc4spsLAoSxGmksR6BghOqY7CtsG+su6Z4acmutL+HYdJx8XZCY1eyOT2/FEaLRsrvEkgSaCyjeHRN9hcMzr/2FWMvqnvTNuL3uqVuvoRZBQY4ZqxIgRFbg387YhIFMydWJdbRcR3prZuyt9bSYKMX/BRgAgexE4NrXzn4AAAAASUVORK5CYII=") diff --git a/pom/product.page.ts b/pom/product.page.ts index fe11667..60a260c 100644 --- a/pom/product.page.ts +++ b/pom/product.page.ts @@ -2,11 +2,7 @@ import { expect, Page } from "@playwright/test"; export default class ProductPage { - page: Page; - - constructor(page: Page) { - this.page = page; - } + constructor(private page: Page) {} buttonaddToCart = () => this.page.getByText("Add to cart"); buttonBackToProducts = () => this.page.locator('[data-test="back-to-products"]'); diff --git a/pom/products.page.ts b/pom/products.page.ts index c0fdd29..487fe24 100644 --- a/pom/products.page.ts +++ b/pom/products.page.ts @@ -2,11 +2,7 @@ import { expect, Page } from "@playwright/test"; export default class ProductsPage { - page: Page; - - constructor(page: Page) { - this.page = page; - } + constructor(private page: Page) {} buttonCart = () => this.page.locator(".shopping_cart_link"); addToCartNth = () => this.page.getByText("Add to cart"); From 83b0eaa490d56797e7a5bff6c0ad2e8f9cf8e996 Mon Sep 17 00:00:00 2001 From: Adrian Ciuciui Date: Tue, 25 Mar 2025 22:46:25 +0200 Subject: [PATCH 2/7] changed all of the locators to getters --- pom/cart.page.ts | 2 +- pom/checkoutOne.page.ts | 14 +++++++------- pom/checkoutTwo.page.ts | 2 +- pom/confirmation.page.ts | 13 ++++++++----- pom/product.page.ts | 5 +++-- pom/products.page.ts | 10 +++++----- 6 files changed, 25 insertions(+), 21 deletions(-) diff --git a/pom/cart.page.ts b/pom/cart.page.ts index 7b7a230..ab15b5b 100644 --- a/pom/cart.page.ts +++ b/pom/cart.page.ts @@ -4,6 +4,6 @@ export default class CartPage { constructor(private page: Page) {} - buttonCheckout = () => this.page.locator("#checkout"); + get buttonCheckout() {return this.page.locator("#checkout")}; } \ No newline at end of file diff --git a/pom/checkoutOne.page.ts b/pom/checkoutOne.page.ts index 744da1e..f934764 100644 --- a/pom/checkoutOne.page.ts +++ b/pom/checkoutOne.page.ts @@ -4,15 +4,15 @@ export default class CheckoutOnePage { constructor(private page: Page) {} - inputFirstName = () => this.page.locator("#first-name"); - inputLastName = () => this.page.locator("#last-name"); - inputPostalCode = () => this.page.locator("#postal-code"); - buttonContinue = () => this.page.locator("#continue"); + get inputFirstName() {return this.page.locator("#first-name")}; + get inputLastName() {return this.page.locator("#last-name")}; + get inputPostalCode() {return this.page.locator("#postal-code")}; + get buttonContinue() {return this.page.locator("#continue")}; public async inputMandatoryValues(firstName: string, lastName: string, zipCode: string) { - await this.inputFirstName().fill(firstName); - await this.inputLastName().fill(lastName); - await this.inputPostalCode().fill(zipCode); + await this.inputFirstName.fill(firstName); + await this.inputLastName.fill(lastName); + await this.inputPostalCode.fill(zipCode); } } \ No newline at end of file diff --git a/pom/checkoutTwo.page.ts b/pom/checkoutTwo.page.ts index 97a1e66..f252988 100644 --- a/pom/checkoutTwo.page.ts +++ b/pom/checkoutTwo.page.ts @@ -4,6 +4,6 @@ export default class CheckoutTwoPage { constructor(private page: Page) {} - buttonFinish = () => this.page.locator("#finish"); + get buttonFinish() {return this.page.locator("#finish")}; } \ No newline at end of file diff --git a/pom/confirmation.page.ts b/pom/confirmation.page.ts index a4c076a..a33b704 100644 --- a/pom/confirmation.page.ts +++ b/pom/confirmation.page.ts @@ -2,14 +2,17 @@ import { expect, Page } from "@playwright/test"; export default class ConfirmationPage{ + private static readonly URL = "https://www.saucedemo.com/checkout-complete.html"; + constructor (private page: Page){} - buttonBackHome = () => this.page.locator("#back-to-products"); - confirmationLogo = () => this.page.getByAltText("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDkuMC1jMDAwIDc5LmRhNGE3ZTVlZiwgMjAyMi8xMS8yMi0xMzo1MDowNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQ4Q0IxMkVBRUZDMTFFREIwRThFMzc3OTlDRTMyNUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQ4Q0IxMkZBRUZDMTFFREIwRThFMzc3OTlDRTMyNUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDhDQjEyQ0FFRkMxMUVEQjBFOEUzNzc5OUNFMzI1QiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDhDQjEyREFFRkMxMUVEQjBFOEUzNzc5OUNFMzI1QiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PojLpNEAABFkSURBVHja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") - confirmationTitle = () => this.page.locator(".complete-header"); - confirmationDescription = () => this.page.locator(".complete-text"); + get buttonBackHome() {return this.page.locator("#back-to-products")}; + get confirmationLogo() {return this.page.getByAltText("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDkuMC1jMDAwIDc5LmRhNGE3ZTVlZiwgMjAyMi8xMS8yMi0xMzo1MDowNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQ4Q0IxMkVBRUZDMTFFREIwRThFMzc3OTlDRTMyNUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQ4Q0IxMkZBRUZDMTFFREIwRThFMzc3OTlDRTMyNUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDhDQjEyQ0FFRkMxMUVEQjBFOEUzNzc5OUNFMzI1QiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDhDQjEyREFFRkMxMUVEQjBFOEUzNzc5OUNFMzI1QiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PojLpNEAABFkSURBVHja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")} + get confirmationTitle() {return this.page.locator(".complete-header")}; + get confirmationDescription() {return this.page.locator(".complete-text")}; public async goToConfirmation(){ - await this.page.goto("https://www.saucedemo.com/checkout-complete.html"); + await this.page.goto(ConfirmationPage.URL); + await this.page.waitForLoadState("domcontentloaded"); } } \ No newline at end of file diff --git a/pom/product.page.ts b/pom/product.page.ts index 60a260c..b9bfe84 100644 --- a/pom/product.page.ts +++ b/pom/product.page.ts @@ -4,6 +4,7 @@ export default class ProductPage { constructor(private page: Page) {} - buttonaddToCart = () => this.page.getByText("Add to cart"); - buttonBackToProducts = () => this.page.locator('[data-test="back-to-products"]'); + get buttonaddToCart() {return this.page.getByText("Add to cart")}; + get buttonBackToProducts() {return this.page.locator('[data-test="back-to-products"]')}; + } \ No newline at end of file diff --git a/pom/products.page.ts b/pom/products.page.ts index 487fe24..cb03797 100644 --- a/pom/products.page.ts +++ b/pom/products.page.ts @@ -4,18 +4,18 @@ export default class ProductsPage { constructor(private page: Page) {} - buttonCart = () => this.page.locator(".shopping_cart_link"); - addToCartNth = () => this.page.getByText("Add to cart"); - buttonProductNth = () => this.page.locator(".inventory_item_img.inventory_item_img"); + get buttonCart() {return this.page.locator(".shopping_cart_link")}; + get addToCartNth() {return this.page.getByText("Add to cart")}; + get buttonProductNth() {return this.page.locator(".inventory_item_img.inventory_item_img")}; public async checkNumberOfProductsNotInTheCart(productsNotInCart: number) { - const occurrences: number = await this.addToCartNth().count(); + const occurrences: number = await this.addToCartNth.count(); await expect(occurrences).toBe(productsNotInCart); } public async checkNumberOfProductsAfterAddingProductToCart(productIndex: number, productsLeft: number) { - await this.addToCartNth().nth(productIndex).click(); + await this.addToCartNth.nth(productIndex).click(); await this.checkNumberOfProductsNotInTheCart(productsLeft); } } \ No newline at end of file From 41589a40d9dc70ef992139ad4eb11bb2749d3c8f Mon Sep 17 00:00:00 2001 From: Adrian Ciuciui Date: Fri, 28 Mar 2025 23:46:35 +0200 Subject: [PATCH 3/7] Turned the located elements into getters Fixed a typo in a locator name --- pom/product.page.ts | 2 +- tests/Tests/endToEnd.spec.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pom/product.page.ts b/pom/product.page.ts index b9bfe84..1a51f6c 100644 --- a/pom/product.page.ts +++ b/pom/product.page.ts @@ -4,7 +4,7 @@ export default class ProductPage { constructor(private page: Page) {} - get buttonaddToCart() {return this.page.getByText("Add to cart")}; + get buttonAddToCart() {return this.page.getByText("Add to cart")}; get buttonBackToProducts() {return this.page.locator('[data-test="back-to-products"]')}; } \ No newline at end of file diff --git a/tests/Tests/endToEnd.spec.ts b/tests/Tests/endToEnd.spec.ts index 9656fd3..59ce4d3 100644 --- a/tests/Tests/endToEnd.spec.ts +++ b/tests/Tests/endToEnd.spec.ts @@ -29,19 +29,19 @@ test(" Place product in cart from product page | @e2e ", async ( async function performCheckoutAndValidateNumberOfProducts({ cartPage, checkoutOnePage, checkoutTwoPage, confirmationPage, productsPage }) { - await productsPage.buttonCart().click(); - await cartPage.buttonCheckout().click(); + await productsPage.buttonCart.click(); + await cartPage.buttonCheckout.click(); await checkoutOnePage.inputMandatoryValues("First", "Last", "123123"); - await checkoutOnePage.buttonContinue().click(); - await checkoutTwoPage.buttonFinish().click(); - await confirmationPage.buttonBackHome().click(); + await checkoutOnePage.buttonContinue.click(); + await checkoutTwoPage.buttonFinish.click(); + await confirmationPage.buttonBackHome.click(); await productsPage.checkNumberOfProductsNotInTheCart(6); } async function addProductFromDetailsPageAndReturnToProductsPage({ productPage, productsPage }, productToBeAddedIndex: number, productsLeft: number) { - await productsPage.buttonProductNth().nth(productToBeAddedIndex).click(); - await productPage.buttonaddToCart().click(); - await productPage.buttonBackToProducts().click(); + await productsPage.buttonProductNth.nth(productToBeAddedIndex).click(); + await productPage.buttonAddToCart.click(); + await productPage.buttonBackToProducts.click(); await productsPage.checkNumberOfProductsNotInTheCart(productsLeft); } \ No newline at end of file From 6874064a49ac5eb60d095c6f53f32234f98217b1 Mon Sep 17 00:00:00 2001 From: Adrian Ciuciui Date: Sat, 29 Mar 2025 00:44:54 +0200 Subject: [PATCH 4/7] Implemented base.page.ts Refactored all of the pages from the POM --- pom/base.page.ts | 16 ++++++++++++++++ pom/cart.page.ts | 7 +++++-- pom/checkoutOne.page.ts | 7 +++++-- pom/checkoutTwo.page.ts | 7 +++++-- pom/confirmation.page.ts | 7 +++++-- pom/index.ts | 2 ++ pom/login.page.ts | 7 +++++-- pom/product.page.ts | 11 +++++++++-- pom/products.page.ts | 7 +++++-- 9 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 pom/base.page.ts diff --git a/pom/base.page.ts b/pom/base.page.ts new file mode 100644 index 0000000..9215648 --- /dev/null +++ b/pom/base.page.ts @@ -0,0 +1,16 @@ +import {Page} from "@playwright/test" + +export default class BasePage { + + constructor(protected readonly page: Page){} + + + + get buttonCart() {return this.page.locator('shopping_cart_container')}; + get notificationCart() {return this.page.locator(".shopping_cart_badge")} + get buttonBurgerMenu() {return this.page.getByTestId("react-burger-menu-btn")}; + + + + +} \ No newline at end of file diff --git a/pom/cart.page.ts b/pom/cart.page.ts index ab15b5b..a66b26e 100644 --- a/pom/cart.page.ts +++ b/pom/cart.page.ts @@ -1,8 +1,11 @@ import { expect, Page } from "@playwright/test"; +import BasePage from "./base.page"; -export default class CartPage { +export default class CartPage extends BasePage{ - constructor(private page: Page) {} + constructor(page: Page) { + super(page); + } get buttonCheckout() {return this.page.locator("#checkout")}; diff --git a/pom/checkoutOne.page.ts b/pom/checkoutOne.page.ts index f934764..f2063ad 100644 --- a/pom/checkoutOne.page.ts +++ b/pom/checkoutOne.page.ts @@ -1,8 +1,11 @@ import { expect, Page } from "@playwright/test"; +import BasePage from "./base.page"; -export default class CheckoutOnePage { +export default class CheckoutOnePage extends BasePage{ - constructor(private page: Page) {} + constructor(page: Page) { + super(page); + } get inputFirstName() {return this.page.locator("#first-name")}; get inputLastName() {return this.page.locator("#last-name")}; diff --git a/pom/checkoutTwo.page.ts b/pom/checkoutTwo.page.ts index f252988..b6801f1 100644 --- a/pom/checkoutTwo.page.ts +++ b/pom/checkoutTwo.page.ts @@ -1,8 +1,11 @@ import { expect, Page } from "@playwright/test"; +import BasePage from "./base.page"; -export default class CheckoutTwoPage { +export default class CheckoutTwoPage extends BasePage{ - constructor(private page: Page) {} + constructor(page: Page) { + super(page); + } get buttonFinish() {return this.page.locator("#finish")}; diff --git a/pom/confirmation.page.ts b/pom/confirmation.page.ts index a33b704..31a5196 100644 --- a/pom/confirmation.page.ts +++ b/pom/confirmation.page.ts @@ -1,10 +1,13 @@ import { expect, Page } from "@playwright/test"; +import BasePage from "./base.page"; -export default class ConfirmationPage{ +export default class ConfirmationPage extends BasePage { private static readonly URL = "https://www.saucedemo.com/checkout-complete.html"; - constructor (private page: Page){} + constructor (page: Page){ + super(page); + } get buttonBackHome() {return this.page.locator("#back-to-products")}; get confirmationLogo() {return this.page.getByAltText("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDkuMC1jMDAwIDc5LmRhNGE3ZTVlZiwgMjAyMi8xMS8yMi0xMzo1MDowNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjEgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzQ4Q0IxMkVBRUZDMTFFREIwRThFMzc3OTlDRTMyNUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzQ4Q0IxMkZBRUZDMTFFREIwRThFMzc3OTlDRTMyNUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDNDhDQjEyQ0FFRkMxMUVEQjBFOEUzNzc5OUNFMzI1QiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDNDhDQjEyREFFRkMxMUVEQjBFOEUzNzc5OUNFMzI1QiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PojLpNEAABFkSURBVHja7F19TFXnHcbDx0XuBRGQD5fJpVXbCSp0/aAuG9c6+kc1Cm03ty6L2C7r/mgGdsnSZsvEpo39pxGaLpnJGiRb5zobwVld1q4KNm39WAUVbFe1gknlAoLAvXyj7D7YYyjej/O+53fOec+550n0GrmXe857nvf38by/9/fOm56ejrFhgxeSPQQ2bALZsAlkwyaQDZtANmywIS4abnLk5kRq75Tf3THRX9gz5XP33PTnDt+YSO2eGnL7Az/De7yBfwf7bHZcSgdes+KSb73GJ3dkSq7OvIT0VqeUMJCbkNaaFHi10nh9Nub1HBm5sOXs6FUPxsUV6xi4Oz6jdZ1reX2Jc+me2e+dZ7U0HmTpDBDl8mRfYduYt+TSxLXCUOSgwtKEjNasANEKErOb8+LTW7+TmN1k1rGru35i13v+zytCvSc7PqXjxYzScndg4liGQJgx7ePekrNjVz2XJq8V+m+Mpxp9TasTv9W00pHTXJCY02QWQv2mq6HlYmDCRXqfS3IMvJK1YS1IZFoCgTQnR69sem/48woRCBMOmLWrHIubHnEuqxeVTPXXT+7aP3SmiuWedmWXF5mKQDCxh33nKxt8Z6tEJ00kMm1eULQjI87VIcI1vTPYuv0vA6eqWT/37MI120xBIFibvYOnt58Z+8pjpXgNbm5jckHt/UlLGo26hn/5z1f+qe+jGt7rF5ZAsDanRq+U7R38dHvXpLZBsAhW6akF390xN8PRGqdGrpS93PvvBt7PIxYSkkCYFX8d+G+1Wd2UGYh0bcrvrvTub1E7xkIRCDPizYFPdlnd4hhNJJDn9z2HjqodZ2EskFVjHLWAvvTiotJyymAbocHz3oYWikm6Zn7eAUMJhJvZF8gAWNLHaLRGSJep1G6lWo8SPJ/h2WrYUgasTm1/c120u6tI5Hklc/1aKvJA66EiD66txLlsj+4EMsrqYD0nOza54y5HRivWsjIDbmFR4E/m12tceEjBHhTiBf/0ROpIINjEelpP4M/lyf7V/pvjqVqq3rhekIfKfb1DOOYysXUPoqmCN0U3GZfSsWr+4qaChOzm/MScJq1Eu47J/sLOib7Cc6NdnraJrhKqe6td/ESRO/7WehMFeXiEwlDErs1+vEgeT90IdGz40pbd1z+q0TI1h7BVnLTkwIPz3Y1GqbyYJO3jXZ4P/Be28CYFv1z48Lb1KQU1FNejVuuZi51ZG9auCExIXdN41nUWHtJ4nMv3iFZWIZPpn0NtlUpjj58F0vcfp95XTfX9FFpPOGJrSiDEO6/2/qeBOj2HGS1Nuqf+waQljbNng8iAq3t3sK3q/eH/bdGLPJThQqhr04xAWsQ7IM4mV0HthsAsMGsRF8bl4FBb1Ymxzk2zx6bUubz+uYySChHHvix5Ze3WtOKgHkQTAlHfgBWIE2yMjvi/qHhr8NPtEAxfyykvovrdlFoPQoSXsh5bG+rn5ASiJs+jrnv3bF340DarlY3OHi+8UgX9lPGmEhEzTlTyYFY+s7B4m1liHF5QZotaaD2RJi6ZBaIkD2UwGS3QUusJhziRyDNTsL2otJxKQIsWQOuhIg+AemelllE1gZCqU5AHkf7mgNWxaqyjZQxV099UR/X7oPWwTGDVBHqj70PVC6KUymu0kQeTl0ooROjA+hxUEQh+96ORL8vU+NqZ7SG2yzI824UH4Ik7uQmEslM1fleO8kXZmWA27Ox9v4GKPN9LuqsxlFAYCRIv+1GzbJPHGFDX9TyX/v2tvJ/nIpAav2uTR326rrfWQ0ogsJ/XdNrkUU8eSq2H4lkwEQhlqLzst8mjDkZqPSQEgt6DGmabPPoDpSBGaj0kBEIdM6/rot6aEm3p+quBjMtIrUc1gXATvK6Lku3RSB4RtB7VBILmwHvBtsLMD1G0HlUEah6+WMGjOSDu2WyvqHPjj30f1omi9agiELpjcEX5hBviojFdD9dmjieB0epZSJGsD48JRaBmB8385KFK1/XIfiVq64OLtovB+ECt9eiR/UrU1kfe8mqDDSJrPVwE4rE+KIC3XRdfui6y1sNMIJhSHuuDxpE2HdjJo8cGQK0QtB7ooK+tUpTAWW7ne+nrlBZdsR5Kyj2Q78husoK1o9Z61JLn/LjXs8KhvBVxXLAZwboVGYHzI67le6hn5ut9x+qCXQuqIEGk8pRVNU8uKDSt1RNN60Ec9qL34NG9396yUGnaf4cLe3uwhTn2WZOYR9oNQzbr4YiM/jzIWJD2mjVdF0nrwZj/rvvdo/j3oaF2xYr1HQQ6N37Vw/rl61NW1Bpl1s1IItG0nrnF+Y2+c5VcBEK8weqPqTMvnqUTPIxjwxe3mIE86JMkktYTLIiHdT8/1uVhJtCR4QvMD2FDcj6p9Tkx0rmJ53O7+z+uwXFOoms9aLIlktYTytqfDGTizARidV/Yv56bQCtWnRnn6yWEWQMfLjcrsLUedUF8uD5GQQnE4742phTUUg+0mgGeIVHAHItGIhG1nkhBvFI3dptAbQp93mzkO+g7Z6DYW83nvYGHBLM88vVJhEYD1yGa1qM0iG8PGBXFBDo33lXCchFoPKSFkIejFdX+DphlnLwnAoFwHSJpPSwbQpVw4jaBWMXDda5l9VoMeHFS7gGK3wPzXN9/0lASiaj1sBztBPU/kiWX5PhHBPcFeJzL9uTEp5BYtv2+M1VGaURmq+sJFQd1TPQVRiQQDqhlvSGtbgYz7IVFpeVqYyEjNSLRtB4Z+B3yKdSKpYcI0oh0K4D2MsU/OLJRywcAbQMaB9Xv01MjotZ6cKAJZV3PKkdOM8v7z0VIrmYIxHosNo631vpB4CAPpKtUplgPjUgLrQfjQHmNBYlsk//Lyb7VYQmEIOkSY5bgjk/XZZ8X0lVSEmmoEZmlrief8dRoGJdwgbTUyWjaUUZBrT5HIlGp8x6SjE8rjUhErSdcHMQaX/aGmXSSn3Ew707I0H2X6dNpxVVLib5XC42IUuvBfWq1h0tGVmwyWyA9GdrISJHStLlwzksY1JtAyMyQiVCl95QaEbXWg/vUej/d3fHpZ1je3zPpC22BeqZ8TGb3roR0Q/a5w/S+nLl+rUgakVm1HvmQPcUEuunPDUmg7huhfxj0y+OTO2IMAgZXFI1IVK1HCwL5p8YXhk3jWbAo1mkYgUTRiBATvHbtCFl6Ta31RCYQG1F7bvjCWCBGF+aUHIbvdzdSI5K1Hqp70ULriWgEGAkULtFitkBOQRomGKERmX0PlxaQWFVokfZi6akRmUnrUZLVMo1NGI5IMSaHXhrRG4R7uPTQeigJFNYCmZ1AemhEao90mJuu66H16ObCrHATWmpEVqjrsQmkkETUGhF2LVA29rZit1pmAolSrB4M1BoR1RIFYNVutRJrhZrIBAIoNSIqGKH1RJIjmFxvGI5IMRYEpUZEQR7RtB7/NJ0RkFiFQdbFVyNJRKUR8aLUubxeRKFw9AYbgbLCrJ0xu7DeG8OmIBBAqRGxAt/7dNrDVSKOSw9hVabknBfPVN8TrjZENFBrRCzpushaD6sXyQpTgSFR1oaImt5TakRKyCO61nN5sn81y/szJVcnGYG+HL9WGGMyUGtEoWAWrQeLxyzvzwtTAy/lOti0Ce+UeVzYbFBrRMFgFq3n0iSbEQjniqXMWNbakPFUUXvwRIKWGpFoWk8ooBiOdd+aO0wZswR2sWZi7ePse+lFSu/LklfVUpPHLHU9rNu4kE2GtUD4i3WrThtjKxjRsDXtoSoqjUhUrSfksxtje3aZscmdYdN4/MW6VfnsKHsnV9FAoRGJrPWEAmsbw5WJ4buwSHKAyRZID7nNGgfNDgzVaERmrOvBM2OtqHRH2IUsyUESa4p7cqSzLMbkkDUi1ns3a10PT+y6QokFwixibS13fJSvHa+IJMIZ6kpJZOa6ng/8XzDtgUMbw0jvub0av5Kxbwxa4ole2qHYTDNoRFVpJVvNWNfDcwaKEk7cJhBr2w+gyX+hIsYiUKIR4ecPJOU2mvH+eNyXEk5Is30dayxgFTcmI5xGZPY9XAeGzjEd4YU4L1L88w0CzWgaSWzaCEzieY7+0iIjmEZkNq1nLqA+szYRU9rG8BsEejBpCbN5VnqmgpkwWyOa2cOVUWJqV31oqJ35AMG1zqX1zATicWM4U8EqwbQMWSNCFoJXM98LgmfWzQFK3dcdBALKXCuZ1omwuMpyQJmZ0vuXsh4z/R6ud33nma0PSxfeOwi0PiWfuUUtDiizmhWyAmB9jo9eZg4xWA5PloKZbyUCUjRYIbOjafjiFtalC9YzUIJu6/kJx/HdthUSz/rw7KrdyHiAYFACIYBiXWSEFRLlhBwbfIcnI3i+n1EoDbmx8KcL7mO2Qoj2raYLRUvmBTzF8cxDEuiB+bmNPEXob14/blshg4EuajzWh6ckVwqnhfAwEk2Y9g20VNuP0RigHQ1PFzWeZw3Mm56eDvuGX119+zLPBdXmPFHkTrBeNwrRXdczX+29zGN9di/enMfznRGbKzyTWsy1FWbnNXHOLY0GYKx5XJca66OIQChfYNWFADSt3DdgzGmB0Yh9nK4La31qtiMpau/CowsBaBV32BYYNQcO0t0/dIZrnNWu9SkiEHQh3r1Uu69/vEuv0wKjESjVYDlIdzbKklfWql3rU9xganNqUTXvDgY9TguM1qCZt2s+AufNBDVOigmEtP7XaT/g6m2s9WmB0UoeNV3zKwPPkmJLElOLOzWuDEG1TSIxyAPXpbTeJxIi6kDB0sXnvQ0tvBdvxV7JZiKPGs1HtQWSXRnPZjzbEhlPHjwzTF7Ka+Lq0grroabXjk0i/ckDPJVy3w5qy8/d5hfik5o2KTKJ7BRfWape6d3fooY82Ja0PqWghvramGOgufhD9+GjrDse5+LZhWu2PcZRShsNgEjIq/PIwNFSv120TpPNAaoJpDaolvF48uqaH6UW7rDKKTZqgXHF8gSvwjw7aN6VXV6k1biqJhCVf7YztG+6rFcJDrfTYzxJCERJIuDnqQ9UP7mgcEc0kofqeCm9JiMZgahJFG3W6LMxr+fP1z/ZRXEqop5jR0ogahIBj7ru3YN9SlYlEmIdbEagOlpK74lHTiAtSCS7NY9zab1ViATiHPadr2zwna1ibbsrktXWhEBakQgDtGZ+XuP65BW1ZiWSFsQx0uVrRiB5sHDaMdWBtXNd24bk/Npck9RdI8Y5OXpl03vDn1dQEgdAxegLi35oSMNPTQkk4x8Dp6vfGvxUk/JWlGRuTFlZm+/IbhLNKmECNQ1fqDg+0rlJrdgaClhZ35pWbFjVpy4EAg752qr+Nnh6O/XsmzsT17mW1xtJpmtTw+6Tox1lWpIGwMIo1iONPl5BNwJpFReFiwnQpqQgMacZTTG1cnUgTPtYl6dtoqsEDdjRQ1uPexNF4tCVQDLq+k/UNPrOVur5nZixaGXskhwDefFpZ3DMVWbgASBucAb+LyPO2RHMBY3cnJyxmL1TPjdO+sNhbTgzDcdeeW/43Fpa1FAuC6Wooiz5GEIgAHvoX+8/VqeHNbICYHVQhkpVSWh6Askz/O2Blmq9rZHZIJrVEYZAs2Ojnb3vN1DI+FYCkgLsyRPN6ghHIBnNgZR3byBTi3a3Bnf1i9TibWZoai4UgaKdSAj0UXaqReVgVBEo2ogEi4MGB+jJZLaCOqEJJOPUSGfZQV97pZbCnB3jWJhAs4Ptvw+croZoZ1arBDe1yVVQuyHgpqxQvmsqAs0GdKQj/gsVZiATSINzSHCUhJmtjaUINJdM7WNez7nxrhIR3Jysehc4spsLAoSxGmksR6BghOqY7CtsG+su6Z4acmutL+HYdJx8XZCY1eyOT2/FEaLRsrvEkgSaCyjeHRN9hcMzr/2FWMvqnvTNuL3uqVuvoRZBQY4ZqxIgRFbg387YhIFMydWJdbRcR3prZuyt9bSYKMX/BRgAgexE4NrXzn4AAAAASUVORK5CYII=")} diff --git a/pom/index.ts b/pom/index.ts index 05a791a..62803b5 100644 --- a/pom/index.ts +++ b/pom/index.ts @@ -1,3 +1,4 @@ +import BasePage from "./base.page.ts"; import CartPage from "./cart.page.ts"; import CheckoutOnePage from "./checkoutOne.page.ts"; import CheckoutTwoPage from "./checkoutTwo.page.ts"; @@ -7,6 +8,7 @@ import ProductPage from "./product.page.ts"; import ProductsPage from "./products.page.ts"; export { + BasePage, CartPage, CheckoutOnePage, CheckoutTwoPage, diff --git a/pom/login.page.ts b/pom/login.page.ts index 89fc37a..0bc2302 100644 --- a/pom/login.page.ts +++ b/pom/login.page.ts @@ -1,11 +1,14 @@ import { expect, Page } from "@playwright/test"; +import BasePage from "./base.page"; -export default class LoginPage{ +export default class LoginPage extends BasePage { private static readonly BASE_URL = "https://www.saucedemo.com"; private static readonly PASSWORD = "secret_sauce"; - constructor (private page: Page){} + constructor (page: Page){ + super(page); + } get inputLogin() {return this.page.locator('[data-test="username"]')}; get inputPassword() {return this.page.locator('#password')}; diff --git a/pom/product.page.ts b/pom/product.page.ts index 1a51f6c..860d2e8 100644 --- a/pom/product.page.ts +++ b/pom/product.page.ts @@ -1,10 +1,17 @@ import { expect, Page } from "@playwright/test"; +import BasePage from "./base.page"; -export default class ProductPage { +export default class ProductPage extends BasePage{ - constructor(private page: Page) {} + constructor(page: Page) { + super(page); + } get buttonAddToCart() {return this.page.getByText("Add to cart")}; get buttonBackToProducts() {return this.page.locator('[data-test="back-to-products"]')}; + get buttonRemove() {return this.page.getByText("Remove")}; + get textProductTitle() {return this.page.locator('[data-test="inventory_item_name"]')}; + get textProductDescription() {return this.page.locator('[data-test="inventory_item_desc"]')}; + get textProductPrice() {return this.page.locator('[data-test="inventory-item-price"]')}; } \ No newline at end of file diff --git a/pom/products.page.ts b/pom/products.page.ts index cb03797..9b68eef 100644 --- a/pom/products.page.ts +++ b/pom/products.page.ts @@ -1,8 +1,11 @@ import { expect, Page } from "@playwright/test"; +import BasePage from "./base.page"; -export default class ProductsPage { +export default class ProductsPage extends BasePage{ - constructor(private page: Page) {} + constructor(page: Page) { + super(page); + } get buttonCart() {return this.page.locator(".shopping_cart_link")}; get addToCartNth() {return this.page.getByText("Add to cart")}; From abf04599716c78952f5e29abe862c04dfcab331b Mon Sep 17 00:00:00 2001 From: Adrian Ciuciui Date: Tue, 1 Apr 2025 01:59:21 +0300 Subject: [PATCH 5/7] Expanded the BasePage --- pom/base.page.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pom/base.page.ts b/pom/base.page.ts index 9215648..b87531e 100644 --- a/pom/base.page.ts +++ b/pom/base.page.ts @@ -2,13 +2,23 @@ import {Page} from "@playwright/test" export default class BasePage { + // This is the base page class that contains common elements and methods for all pages + // It is set to protected so that it can be accessed by child classes constructor(protected readonly page: Page){} - get buttonCart() {return this.page.locator('shopping_cart_container')}; get notificationCart() {return this.page.locator(".shopping_cart_badge")} get buttonBurgerMenu() {return this.page.getByTestId("react-burger-menu-btn")}; + get buttonMenuAllItems() {return this.page.getByTestId("inventory_sidebar_link")}; + get buttonMenuAbout() {return this.page.getByTestId("about_sidebar_link")}; + get buttonMenuLogout() {return this.page.getByTestId("logout_sidebar_link")}; + get buttonMenuResetAppState() {return this.page.getByTestId("reset_sidebar_link")}; + get buttonMenuClose() {return this.page.getByTestId("react-burger-cross-btn")}; + get buttonMenuTwitter() {return this.page.getByTestId("twitter")}; + get buttonMenuFacebook() {return this.page.getByTestId("facebook")}; + get buttonMenuLinkedIn() {return this.page.getByTestId("linkedin")}; + From 081dc795622049a3eeace8ac6453588b68ee4985 Mon Sep 17 00:00:00 2001 From: Adrian Ciuciui Date: Tue, 1 Apr 2025 02:00:07 +0300 Subject: [PATCH 6/7] Added component test for error messages --- pom/login.page.ts | 58 ++++++++++++++++++++++++++++------- tests/Tests/loginPage.spec.ts | 15 +++++++++ 2 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 tests/Tests/loginPage.spec.ts diff --git a/pom/login.page.ts b/pom/login.page.ts index 0bc2302..5e01fe7 100644 --- a/pom/login.page.ts +++ b/pom/login.page.ts @@ -3,6 +3,7 @@ import BasePage from "./base.page"; export default class LoginPage extends BasePage { + // Constants private static readonly BASE_URL = "https://www.saucedemo.com"; private static readonly PASSWORD = "secret_sauce"; @@ -10,47 +11,82 @@ export default class LoginPage extends BasePage { super(page); } + // Locators get inputLogin() {return this.page.locator('[data-test="username"]')}; get inputPassword() {return this.page.locator('#password')}; get buttonLogin() {return this.page.locator("#login-button")}; + get errorIconLogin() {return this.page.locator('[data-icon="times-circle"]').nth(0)}; + get errorIconPasword() {return this.page.locator('[data-icon="times-circle"]').nth(1)}; + get errorMessageText() {return this.page.locator('[data-test="error"]')}; + get errorMessageCloseButton() {return this.page.locator('[data-test="error"] > button')}; - public async goToLogin(){ + // Methods + + public async goToSauceDemoLoginPage(){ await this.page.goto(LoginPage.BASE_URL); } - private async inputThePassword(){ - await this.inputPassword.fill(LoginPage.PASSWORD); + private async performLoginWithValidCredentials(username: string){ + await this.inputLogin.fill(username); + await this.inputThePassword(); + await this.buttonLogin.click(); + await expect(this.page).toHaveURL(`${LoginPage.BASE_URL}/inventory.html`); } - private async performLogin(username: string){ + private async performLoginWithInvalidCredentials(username: string){ await this.inputLogin.fill(username); await this.inputThePassword(); await this.buttonLogin.click(); - await expect(this.page).toHaveURL(`${LoginPage.BASE_URL}/inventory.html`); + await expect(this.page).toHaveURL(LoginPage.BASE_URL); + } + + private async inputThePassword(){ + await this.inputPassword.fill(LoginPage.PASSWORD); + } + + public async checkErrorSpecificElementsAreDisplayed(){ + await expect(this.errorMessageText).toBeVisible(); + await expect(this.errorMessageCloseButton).toBeVisible(); + await expect(this.errorIconLogin).toBeVisible(); + await expect(this.errorIconPasword).toBeVisible(); + } + + public async checkErrorSpecificElementsAreNOTDisplayed(){ + await expect(this.errorMessageText).toHaveCount(0); + await expect(this.errorMessageCloseButton).toHaveCount(0); + await expect(this.errorIconLogin).toHaveCount(0); + await expect(this.errorIconPasword).toHaveCount(0); } + + // Login with different users public async performLoginWithStandardUser(){ - await this.performLogin("standard_user"); + await this.performLoginWithValidCredentials("standard_user"); } public async performLoginWithLockedOutUser(){ - await this.performLogin("locked_out_user"); + await this.performLoginWithValidCredentials("locked_out_user"); } public async performLoginWithProblemUser(){ - await this.performLogin("problem_user"); + await this.performLoginWithValidCredentials("problem_user"); } public async performLoginWithPerformanceGlitchUser(){ - await this.performLogin("performance_glitch_user"); + await this.performLoginWithValidCredentials("performance_glitch_user"); } public async performLoginWithErrorUser(){ - await this.performLogin("error_user"); + await this.performLoginWithValidCredentials("error_user"); } public async performLoginWithVisualUser(){ - await this.performLogin("visual_user"); + await this.performLoginWithValidCredentials("visual_user"); } + + public async performLoginWithErrorTriggeringUser(){ + await this.performLoginWithInvalidCredentials("invalid_user"); + } + } \ No newline at end of file diff --git a/tests/Tests/loginPage.spec.ts b/tests/Tests/loginPage.spec.ts new file mode 100644 index 0000000..66d7209 --- /dev/null +++ b/tests/Tests/loginPage.spec.ts @@ -0,0 +1,15 @@ +import {test, expect} from "../../fixtures/basePage"; + + + + +test("Login error message disply and functionality | @component", async ( + {loginPage}) => { + await loginPage.goToSauceDemoLoginPage(); + await loginPage.checkErrorSpecificElementsAreNOTDisplayed(); + await loginPage.performLoginWithErrorTriggeringUser(); + await loginPage.checkErrorSpecificElementsAreDisplayed(); + await loginPage.errorMessageCloseButton.click(); + await loginPage.checkErrorSpecificElementsAreNOTDisplayed(); +}) + From fa1dd110fa19c3cc315aa0a59c437504db9251b1 Mon Sep 17 00:00:00 2001 From: Adrian Ciuciui Date: Tue, 1 Apr 2025 02:00:34 +0300 Subject: [PATCH 7/7] Minor refactorings --- pom/products.page.ts | 10 +++++----- tests/Tests/endToEnd.spec.ts | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pom/products.page.ts b/pom/products.page.ts index 9b68eef..debbda9 100644 --- a/pom/products.page.ts +++ b/pom/products.page.ts @@ -12,13 +12,13 @@ export default class ProductsPage extends BasePage{ get buttonProductNth() {return this.page.locator(".inventory_item_img.inventory_item_img")}; - public async checkNumberOfProductsNotInTheCart(productsNotInCart: number) { - const occurrences: number = await this.addToCartNth.count(); - await expect(occurrences).toBe(productsNotInCart); - } - public async checkNumberOfProductsAfterAddingProductToCart(productIndex: number, productsLeft: number) { await this.addToCartNth.nth(productIndex).click(); await this.checkNumberOfProductsNotInTheCart(productsLeft); } + + public async checkNumberOfProductsNotInTheCart(productsNotInCart: number) { + const occurrences: number = await this.addToCartNth.count(); + await expect(occurrences).toBe(productsNotInCart); + } } \ No newline at end of file diff --git a/tests/Tests/endToEnd.spec.ts b/tests/Tests/endToEnd.spec.ts index 59ce4d3..38e6953 100644 --- a/tests/Tests/endToEnd.spec.ts +++ b/tests/Tests/endToEnd.spec.ts @@ -1,10 +1,10 @@ import { test, expect } from "../../fixtures/basePage"; -test(" Place product in cart and checkout | @e2e ", async ( +test("Place product in cart and checkout | @e2e", async ( { cartPage, checkoutOnePage, checkoutTwoPage, confirmationPage, loginPage, productsPage }) => { - await loginPage.goToLogin(); + await loginPage.goToSauceDemoLoginPage(); await loginPage.performLoginWithStandardUser(); await productsPage.checkNumberOfProductsNotInTheCart(6); @@ -14,10 +14,10 @@ test(" Place product in cart and checkout | @e2e ", async ( await performCheckoutAndValidateNumberOfProducts({ cartPage, checkoutOnePage, checkoutTwoPage, confirmationPage, productsPage }); }) -test(" Place product in cart from product page | @e2e ", async ( +test("Place product in cart from product page | @e2e", async ( { cartPage, checkoutOnePage, checkoutTwoPage, confirmationPage, loginPage, productPage, productsPage }) => { - await loginPage.goToLogin(); + await loginPage.goToSauceDemoLoginPage(); await loginPage.performLoginWithStandardUser(); await productsPage.checkNumberOfProductsNotInTheCart(6);