Код-ревью 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, которые сами дожидаются состояния.

Что должен найти ревьюер

  1. Ошибкастрока 5
    Абсолютный XPath из DevTools: сломается от любой новой обёртки
  2. Ошибкастрока 6
    Хеш-класс CSS-in-JS меняется при сборке; искать поле по подписи или testid
  3. Ошибкастрока 7
    .first() скрывает неоднозначность: кликнет первую попавшуюся кнопку на странице
  4. Ошибкастрока 8
    Сгенерированный id с числом, нестабилен между сборками
  5. Стильстрока 9
    Точное совпадение text() с суммой и неразрывными пробелами хрупко; лучше проверка expect(locator).toHaveText по смысловому локатору
  6. Ошибкастрока 10
    count() без ожидания: снимок в момент вызова, нужен await expect(locator).toHaveCount(1)

Разбор

Почти каждый локатор здесь завязан на вёрстку. Устойчивый вариант: getByRole, getByLabel, getByTestId, действия в контексте нужной строки корзины, проверки через web-first assertions, которые сами дожидаются состояния.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме