Код-ревью Middle Локаторы обновлено
Ревью: локаторы в тесте корзины
Вопрос
Найдите проблемы с локаторами в тесте на Playwright.
import { test, expect } from '@playwright/test';
test('удаление товара из корзины', async ({ page }) => {
await page.goto('/cart');
await page.locator('/html/body/div[1]/main/div[3]/div/button').click();
await page.locator('.css-9f8e7d').fill('2');
await page.locator('button').first().click();
await page.locator('#input-4821').fill('PROMO10');
await page.locator("//span[text()='Итого: 1 990 ₽']").waitFor();
expect(await page.locator('.cart-item').count()).toBe(1);
});
Коротко
Почти каждый локатор здесь завязан на вёрстку. Устойчивый вариант: getByRole, getByLabel, getByTestId, действия в контексте нужной строки корзины, проверки через web-first assertions, которые сами дожидаются состояния.
Что должен найти ревьюер
- Ошибкастрока 5Абсолютный XPath из DevTools: сломается от любой новой обёртки
- Ошибкастрока 6Хеш-класс CSS-in-JS меняется при сборке; искать поле по подписи или testid
- Ошибкастрока 7
.first()скрывает неоднозначность: кликнет первую попавшуюся кнопку на странице - Ошибкастрока 8Сгенерированный id с числом, нестабилен между сборками
- Стильстрока 9Точное совпадение text() с суммой и неразрывными пробелами хрупко; лучше проверка expect(locator).toHaveText по смысловому локатору
- Ошибкастрока 10count() без ожидания: снимок в момент вызова, нужен
await expect(locator).toHaveCount(1)
Разбор
Почти каждый локатор здесь завязан на вёрстку. Устойчивый вариант: getByRole, getByLabel, getByTestId, действия в контексте нужной строки корзины, проверки через web-first assertions, которые сами дожидаются состояния.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.