Как правильно подойти к вопросу: стабильность Fixed панелей в Playwright тестах?

Ссылка скопирована
1 ответ

Сейчас ситуация такая: есть проблема с функционалом fixed-панели с экшенами. Выглядит она в своем летучем виде как на скрине

692d67b1ba8c2187312608.jpeg

С ней есть 2 проблемы:

Сейчас ситуация такая: 1) в —headed режиме запуска тестов её не видно визуально, при этом playwright её экспектит и кликает
Сейчас ситуация такая: 2) Иногда он почему-то считает кнопку не кликабельной. Но после неудачного клика, когда дальше по коду у него должна была появится модалка со следующими полями, он не падает, не ругается, а просто как будто бы виснет. Сначала грешил на конкретную кнопку, но в среднем каждая из этой панели может падать. Просто у них по статистике разная стабильность. Честно говоря, вообще 0 идей. Вьюпорт менять проверял, не решило ни одной проблемы. Использовал вот такую функцию для анализа

export async function isElementClickable( element: Locator | Promise<Locator | null> | null, timeout = 5000 ): Promise<boolean> { try { const resolved = await element; if (!resolved) { console.log('Element is not resolved'); return false; } await resolved.waitFor({ state: "visible", timeout }); if (!(await resolved.isEnabled())) { console.log('Element is not enabled'); return false; } const className = await resolved.getAttribute("class"); if (className) { const lowered = className.toLowerCase(); if ( lowered.includes("disabled") ) { console.log('Element is disabled'); return false; } } const box = await resolved.boundingBox(); if (!box) { console.log('Element is not visible'); return false; } await resolved.hover({ timeout }); console.log("Element is clickable"); return true; } catch { console.log("Element is not clickable"); return false; } }

По вводным: вываливается именно в Element is not clickable

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Редакция Security Ответ

Fixed-панели в Playwright-тестах часто дают нестабильность из-за перекрытия элементов, анимаций, sticky/fixed header, разной высоты viewport и автоскролла Playwright. Если тест кликает по кнопке, а сверху её перекрывает fixed-панель, Playwright честно считает элемент не кликабельным или кликает не туда.

Первое правило: задайте стабильный viewport для тестов и не полагайтесь на случайный размер окна:

test.use({
  viewport: { width: 1366, height: 768 }
});

test.use({ viewport: { width: 1366, height: 768 } });

Перед кликом проверяйте, что элемент видим и не перекрыт. Иногда помогает scrollIntoViewIfNeeded(), но если fixed header перекрывает верх страницы, лучше скроллить с отступом или кликать по элементу после явного ожидания layout.

const button = page.getByRole('button', { name: 'Сохранить' });
await button.scrollIntoViewIfNeeded();
await expect(button).toBeVisible();
await button.click();

const button = page.getByRole('button', { name: 'Сохранить' }); await button.scrollIntoViewIfNeeded(); await expect(button).toBeVisible(); await button.click();

Если проблема в анимации, отключите анимации в тестовом окружении через CSS:

*, *::before, *::after {
  transition: none !important;
  animation: none !important;
}

*, *::before, *::after { transition: none !important; animation: none !important; }

Можно добавить этот CSS в тестах через page.addStyleTag. Но если fixed-панель является частью логики интерфейса, не скрывайте её полностью: тест должен учитывать реальный UX.

Также используйте semantic locators вместо координат и CSS-классов. Координатные клики ломаются первыми при изменении sticky/fixed элементов.

Итог: фиксируйте viewport, отключайте лишние анимации, используйте role/text locators, проверяйте видимость и перекрытие. Если fixed header стабильно мешает, добавьте в приложение scroll-margin-top для якорных/целевых элементов или адаптируйте скролл в тесте.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно