WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 1077589

Browse files
authored
Merge pull request #23 from auto-qa-hub/problem-user-tests
add-test-for-problem-user
2 parents ccd67dc + 01abab5 commit 1077589

File tree

3 files changed

+168
-5
lines changed

3 files changed

+168
-5
lines changed

page_objects_ts/CartPage.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { Locator, Page } from "@playwright/test";
1+
import { Locator, Page, expect } from "@playwright/test";
2+
23
export class CartPage {
34
readonly page: Page;
45
readonly cartItems: Locator;
5-
readonly removeButtons: Locator;
66
readonly checkoutButton: Locator;
77
readonly continueShoppingButton: Locator;
88
readonly itemNames: Locator;
@@ -12,16 +12,44 @@ export class CartPage {
1212
constructor(page: Page) {
1313
this.page = page;
1414
this.cartItems = page.locator(".cart_item");
15-
this.removeButtons = page.locator(".inventory_item_price");
1615
this.checkoutButton = page.locator("#checkout");
1716
this.continueShoppingButton = page.locator("#continue-shopping");
1817
this.itemNames = page.locator(".inventory_item_name");
1918
this.itemPrices = page.locator(".inventory_item_price");
2019
this.itemQuantities = page.locator(".cart_quantity");
2120
}
2221

22+
// ✅ Dynamic selector for "Remove" button based on item name
23+
private removeButtonByName(productName: string): Locator {
24+
const idFriendly = productName.toLowerCase().replaceAll(" ", "-");
25+
return this.page.locator(`#remove-${idFriendly}`);
26+
}
27+
28+
// ✅ Remove item by product name
29+
async removeItemByName(productName: string) {
30+
const button = this.removeButtonByName(productName);
31+
await button.click();
32+
}
33+
34+
// ✅ Assert item is removed by name
35+
async assertItemRemovedByName(productName: string) {
36+
const button = this.removeButtonByName(productName);
37+
await expect(button).toHaveCount(0);
38+
}
39+
40+
// 🧪 Still keep the index-based methods if needed
2341
async removeItem(index: number) {
24-
await this.removeButtons.nth(index).click();
42+
const removeButton = this.cartItems
43+
.nth(index)
44+
.locator('button[id^="remove-"]');
45+
await removeButton.click();
46+
}
47+
48+
async assertItemRemoved(indexes: number[]) {
49+
for (const index of indexes) {
50+
const item = this.cartItems.nth(index);
51+
await expect(item).not.toBeVisible(); // or .toHaveCount(0)
52+
}
2553
}
2654

2755
async verifyItemExists(itemName: string) {

tests/errorUser.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import usersData from "../fixtures/usersData.json";
33
import { POManager } from "../page_objects_ts/POManager";
44

55
test.describe("Tests for error user", () => {
6-
test("Login, adding and remove from cart iteams", async ({ page }) => {
6+
test("Login, adding and remove from cart items", async ({ page }) => {
77
const poManager = new POManager(page);
88
const username = usersData.users[4];
99
const password = usersData.password;

tests/problemUser.spec.ts

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import { test, expect } from "@playwright/test";
2+
import usersData from "../fixtures/usersData.json";
3+
import { POManager } from "../page_objects_ts/POManager";
4+
5+
test.describe("Problem user tests", () => {
6+
test("Problem user sees the same image for all products", async ({
7+
page,
8+
}) => {
9+
const poManager = new POManager(page);
10+
const username = usersData.users[2]; // "problem_user"
11+
const password = usersData.password;
12+
13+
// Step 1: Login
14+
await poManager.mainPage.visitMainPage();
15+
await poManager.mainPage.fillUsername(username);
16+
await poManager.mainPage.fillPassword(password);
17+
18+
await expect(page.locator('input[name="user-name"]')).toHaveValue(username);
19+
await expect(page.locator('input[name="password"]')).toHaveValue(password);
20+
21+
await poManager.mainPage.loginButton();
22+
await page.waitForURL("/inventory.html");
23+
24+
// Step 2: Verify all product images are visible
25+
const productItems = await page.locator(".inventory_item");
26+
const count = await productItems.count();
27+
28+
for (let i = 0; i < count; i++) {
29+
const image = productItems.nth(i).locator("img");
30+
await expect(image).toBeVisible();
31+
}
32+
33+
// Step 3: Assert all images have the same `src` attribute
34+
const allImageSrcs = await page.$$eval(".inventory_item img", (imgs) =>
35+
imgs.map((img) => img.getAttribute("src"))
36+
);
37+
38+
const uniqueSrcs = new Set(allImageSrcs);
39+
expect(uniqueSrcs.size).toBe(1); // Problem user sees repeated images
40+
});
41+
42+
test("Problem user login, adding and remove from cart items", async ({
43+
page,
44+
}) => {
45+
const poManager = new POManager(page);
46+
const username = usersData.users[2]; // "problem_user"
47+
const password = usersData.password;
48+
49+
// Step 1: Login
50+
await poManager.mainPage.visitMainPage();
51+
await poManager.mainPage.fillUsername(username);
52+
await poManager.mainPage.fillPassword(password);
53+
54+
await expect(page.locator('input[name="user-name"]')).toHaveValue(username);
55+
await expect(page.locator('input[name="password"]')).toHaveValue(password);
56+
57+
await poManager.mainPage.loginButton();
58+
await page.waitForURL("/inventory.html");
59+
await poManager.inventoryPage.addToCartFirstItem();
60+
await expect(poManager.inventoryPage.removeButtonFirstItem).toBeVisible();
61+
await poManager.inventoryPage.removeFirstItem();
62+
await expect(
63+
poManager.inventoryPage.addToCartFirstButtonItem
64+
).not.toBeVisible();
65+
66+
await poManager.inventoryPage.addToCart2ndItem();
67+
await expect(poManager.inventoryPage.removeButton2ndItem).toBeVisible();
68+
await poManager.inventoryPage.remove2ndItem();
69+
await expect(
70+
poManager.inventoryPage.addToCartButton2ndItem
71+
).not.toBeVisible();
72+
73+
await poManager.inventoryPage.addToCart3rdItem();
74+
await expect(poManager.inventoryPage.addToCartButton3rdItem).toBeVisible();
75+
await expect(poManager.inventoryPage.removeButton3rdItem).not.toBeVisible();
76+
77+
await poManager.inventoryPage.addToCart4thItem();
78+
await expect(poManager.inventoryPage.addToCartButton4thItem).toBeVisible();
79+
await expect(poManager.inventoryPage.removeButton4thItem).not.toBeVisible();
80+
81+
await poManager.inventoryPage.addToCart5thItem();
82+
await expect(poManager.inventoryPage.removeButton5thItem).toBeVisible();
83+
await poManager.inventoryPage.remove5thItem();
84+
await expect(
85+
poManager.inventoryPage.addToCartButton5thItem
86+
).not.toBeVisible();
87+
88+
await poManager.inventoryPage.addToCart6thItem();
89+
await expect(poManager.inventoryPage.addToCartButton6thItem).toBeVisible();
90+
await expect(poManager.inventoryPage.removeButton6thItem).not.toBeVisible();
91+
92+
await poManager.inventoryPage.ShopContainerIcon();
93+
const itemsToRemove = [
94+
"Sauce Labs Backpack",
95+
"Sauce Labs Bike Light",
96+
"Sauce Labs Onesie",
97+
];
98+
99+
for (const item of itemsToRemove) {
100+
await poManager.cartPage.removeItemByName(item);
101+
await poManager.cartPage.assertItemRemovedByName(item);
102+
}
103+
});
104+
test("Last name field issue that causing failure with purshase", async ({
105+
page,
106+
}) => {
107+
const poManager = new POManager(page);
108+
const username = usersData.users[2];
109+
const password = usersData.password;
110+
111+
// Login to the application
112+
await poManager.mainPage.visitMainPage();
113+
await poManager.mainPage.fillUsername(username);
114+
await poManager.mainPage.fillPassword(password);
115+
await poManager.mainPage.loginButton();
116+
await page.waitForURL("/inventory.html");
117+
118+
await poManager.inventoryPage.addToCartFirstItem();
119+
await poManager.inventoryPage.ShopContainerIcon();
120+
await poManager.cartPage.clickCheckout();
121+
await poManager.checkoutStepOnePage.enterCheckoutDetails(
122+
"Yulia",
123+
"Test",
124+
"34221"
125+
);
126+
await poManager.checkoutStepOnePage.submitCheckout();
127+
await expect(page.locator(".error-message-container")).toHaveText(
128+
"Error: Last Name is required"
129+
);
130+
await page.waitForTimeout(1000);
131+
132+
// Assert the user remains on the same page (URL does not change)
133+
await expect(page).toHaveURL("/checkout-step-one.html");
134+
});
135+
});

0 commit comments

Comments
 (0)