9.5 KiB
UI Test Cases — ET-014
Playwright UI тест-кейсы для визуальной приёмки фикса z-index. Все тесты выполняются на test-среде https://openclaw.mva154.duckdns.org/enduro/.
Общие соображения:
- Карта инициализируется ~2–4 секунды (MapLibre + загрузка стилей/тайлов).
Везде где идёт первый
navigate— пауза 4000 мс перед действиями. - Селекторы взяты из
src/web/index.html.
TC-UI-01 — Mobile: фильтры открываются ПОВЕРХ панели слоёв
- type: ui
- viewport: mobile
- viewport-size: 390 × 844
- theme: dark (по умолчанию)
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 4000
- screenshot: 01-map-loaded
- click: #terrain-toggle
- wait: 400
- screenshot: 02-terrain-popup-open
- check-visual: видна панель
#terrain-popupс чекбоксами; visible(#public-tracks-cb) === true - click: #public-tracks-cb
- wait: 300
- check-visual: visible(
#public-tracks-filters-btn) === true (кнопка «Фильтры…» появилась) - click: #public-tracks-filters-btn
- wait: 600
- screenshot: 03-filters-sheet-opened
- check-visual:
#sheet-gps-filtersимеет классopen; заголовок «Фильтры публичных треков», секции «ТИП АКТИВНОСТИ», «ИСТОЧНИК», «ЦВЕТ ЛИНИЙ» и кнопка✕полностью видны в viewport - check-visual:
document.elementFromPoint(195, 600)принадлежит#sheet-gps-filtersили его потомкам (НЕ#terrain-popup) - check-visual: bounding box
#sheet-gps-filtersне пересекается с видимой частью#terrain-popup, либо если пересекается — sheet поверх (через elementFromPoint в центрах пересечения)
Ожидаемый результат: панель фильтров полностью видна, ничем не перекрыта.
TC-UI-02 — Desktop: фильтры открываются ПОВЕРХ панели слоёв
- type: ui
- viewport: desktop
- viewport-size: 1440 × 900
- theme: dark
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 4000
- click: #terrain-toggle
- wait: 400
- click: #public-tracks-cb
- wait: 300
- click: #public-tracks-filters-btn
- wait: 600
- screenshot: desktop-filters-opened
- check-visual:
#sheet-gps-filtersвиден слева (получить bbox черезgetBoundingClientRect, ожидание: left ≤ 80, right ≥ 380) - check-visual:
document.elementFromPoint(bbox.left + bbox.width/2, bbox.top + bbox.height/2)принадлежит#sheet-gps-filtersили его потомкам
Ожидаемый результат: на desktop sheet открыт как боковая панель, terrain-popup не перекрывает.
TC-UI-03 — Закрытие фильтров кнопкой ✕
- type: ui
- viewport: mobile
- viewport-size: 390 × 844
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 4000
- click: #terrain-toggle
- wait: 300
- click: #public-tracks-cb
- wait: 300
- click: #public-tracks-filters-btn
- wait: 500
- click: #sheet-gps-filters .sheet-close
- wait: 600
- screenshot: after-close
- check-visual:
#sheet-gps-filtersНЕ имеет классаopen - check-visual:
#sheet-backdropНЕ имеет классаvisible - check-visual:
document.elementFromPoint(195, 600)принадлежит#mapили его canvas-потомку (карта снова интерактивна)
Ожидаемый результат: возврат к карте, никаких артефактов.
TC-UI-04 — Повторное открытие/закрытие фильтров
- type: ui
- viewport: mobile
- viewport-size: 390 × 844
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 4000
- click: #terrain-toggle
- wait: 300
- click: #public-tracks-cb
- wait: 300
- click: #public-tracks-filters-btn
- wait: 500
- click: #sheet-gps-filters .sheet-close
- wait: 500
- click: #terrain-toggle
- wait: 300
- click: #public-tracks-filters-btn
- wait: 500
- screenshot: second-open
- check-visual:
#sheet-gps-filtersимеет классopen, виден полностью, элемент в центре sheet'а через elementFromPoint принадлежит sheet'у - click: #sheet-gps-filters .sheet-close
- wait: 500
- click: #terrain-toggle
- wait: 300
- click: #public-tracks-filters-btn
- wait: 500
- check-visual: третий цикл — sheet снова открыт корректно
Ожидаемый результат: 3 цикла open/close без деградации.
TC-UI-05 — Регрессия остальных bottom-sheets
- type: ui
- viewport: mobile
- viewport-size: 390 × 844
Шаги:
-
wait: 4000
-
click: #tb-route
-
wait: 400
-
check-visual:
#sheet-routeимеет классopen, заголовок «Маршрут» виден -
screenshot: sheet-route
-
click: #sheet-route .sheet-close
-
wait: 400
-
click: #tb-recon
-
wait: 400
-
check-visual:
#sheet-reconимеет классopen -
screenshot: sheet-recon
-
click: #sheet-recon .sheet-close
-
wait: 400
-
click: #tb-scenic
-
wait: 400
-
check-visual:
#sheet-scenicимеет классopen -
screenshot: sheet-scenic
-
click: #sheet-scenic .sheet-close
-
wait: 400
-
click: #tb-link
-
wait: 400
-
check-visual:
#sheet-linkимеет классopen -
screenshot: sheet-link
-
click: #sheet-link .sheet-close
-
wait: 400
-
click: #tb-gpx
-
wait: 400
-
check-visual:
#sheet-gpxимеет классopen -
screenshot: sheet-gpx
-
click: #sheet-gpx .sheet-close
-
wait: 400
Ожидаемый результат: все sheet'ы открываются и закрываются без артефактов и не «застревают».
TC-UI-06 — Светлая тема: фильтры поверх
- type: ui
- viewport: mobile
- viewport-size: 390 × 844
- theme: light
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 4000
- click: #btn-theme
- wait: 500
- check-visual:
document.bodyНЕ содержит классаtheme-dark(или содержитtheme-light) - screenshot: 01-light-theme
- click: #terrain-toggle
- wait: 300
- click: #public-tracks-cb
- wait: 300
- click: #public-tracks-filters-btn
- wait: 500
- screenshot: 02-light-filters-open
- check-visual:
#sheet-gps-filtersимеет классopen, текст читаем (контраст), sheet полностью виден - check-visual: elementFromPoint в центре sheet'а возвращает элемент внутри
#sheet-gps-filters
Ожидаемый результат: поведение полностью аналогично тёмной теме, без визуальных дефектов на светлом фоне.
TC-UI-07 — Регрессия: terrain-popup сам по себе работает
- type: ui
- viewport: mobile
- viewport-size: 390 × 844
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 4000
- click: #terrain-toggle
- wait: 300
- screenshot: terrain-popup
- check-visual:
#terrain-popupstyle.display !== 'none';#terrain-toggleимеет классactive - click: #terrain-hillshade-cb
- wait: 300
- check-visual: popup всё ещё открыт; чекбокс перешёл в состояние checked
- click: #base-btn-satellite
- wait: 600
- check-visual: popup всё ещё открыт; кнопка
#base-btn-satelliteимеет классactive - click: #map // клик по карте вне popup
- wait: 400
- check-visual:
#terrain-popupstyle.display === 'none';#terrain-toggleБЕЗ классаactive
Ожидаемый результат: без регрессий — popup ведёт себя как раньше.
TC-UI-08 — Регрессия: marker-dialog поверх
- type: ui
- viewport: mobile
- viewport-size: 390 × 844
Шаги:
- navigate: https://openclaw.mva154.duckdns.org/enduro/
- wait: 4000
- click: #tb-marker
- wait: 400
- click: #map // тап по карте чтобы открыть dialog выбора типа метки
- wait: 500
- screenshot: marker-dialog
- check-visual:
#marker-dialogвиден (computed style: opacity > 0) - check-visual: elementFromPoint в центре dialog'а возвращает элемент внутри
#marker-dialog
Ожидаемый результат: marker-dialog корректно поверх всего.
Helpers / Assertions
Для check-visual использовать:
await page.locator(selector).isVisible()для базовой видимости.await page.evaluate(() => document.elementFromPoint(x, y)?.closest('#sheet-gps-filters')?.id)для проверки stacking.await page.locator('#sheet-gps-filters').evaluate(el => el.classList.contains('open'))для DOM-классов.await expect(page).toHaveScreenshot(...)если используется baseline-сравнение.
Скриншоты сохранять в tests/e2e/__screenshots__/ET-014/<TC-UI-XX>/<step>.png.