Как вы организовывали кроссбраузерное тестирование на проекте?

Ответ

Кроссбраузерное тестирование было систематизировано и включало ручные и автоматизированные проверки. Стратегия строилась на анализе статистики использования браузеров нашей аудиторией.

1. Матрица покрытия: Браузер (десктоп) Версии Браузер (мобильный) Версии
Google Chrome последняя, последняя-1 Chrome for Android последняя
Mozilla Firefox последняя, ESR Safari iOS последняя, последняя-1
Microsoft Edge последняя (на Chromium) Samsung Internet актуальная
Apple Safari последняя (macOS)

2. Инструменты и процесс:

  • BrowserStack / Sauce Labs: Для ручного тестирования и запуска автоматизированных скриптов на облачных виртуальных машинах с разными ОС и браузерами.
  • Selenium WebDriver: Для кроссбраузерной автоматизации. Тесты параметризовались для запуска на разных capabilities.
  • Локальная проверка: Основные сценарии в последних версиях Chrome, Firefox, Safari.

3. Ключевые области проверки:

  • Вёрстка (CSS): Отступы (padding, margin), flexbox/grid-раскладки, поддержка CSS-свойств (например, gap для grid в старых Safari). Использовались сбросы стилей (normalize.css).
  • JavaScript: Работа анимаций, обработчиков событий, поддержка современных API (например, Intersection Observer).
  • Формы: Стилизация элементов ввода, валидация.

Пример параметризованного теста на Selenium (Python):

import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By

@pytest.mark.parametrize("browser_name", ["chrome", "firefox", "safari"])
def test_login_form_rendering(browser_name):
    """Тест проверяет, что форма логина корректно отображается в разных браузерах."""
    if browser_name == "chrome":
        driver = webdriver.Chrome()
    elif browser_name == "firefox":
        driver = webdriver.Firefox()
    elif browser_name == "safari":
        driver = webdriver.Safari()

    driver.get("https://app.example.com/login")
    username_field = driver.find_element(By.ID, "username")
    password_field = driver.find_element(By.ID, "password")

    # Проверка, что поля видны и кликабельны
    assert username_field.is_displayed()
    assert password_field.is_displayed()
    assert username_field.is_enabled()

    driver.quit()

Фокус был на обеспечении consistent user experience на ключевых для бизнеса платформах.

Ответ 18+ 🔞

А, ну это ж классика, блядь! Кроссбраузерное тестирование... Ёпта, это когда ты всё сделал, вроде красиво, а потом открываешь в каком-нибудь старом Сафари — и там пиздец, всё разъехалось, как у пьяного на льду. Мы эту хуйню систематизировали, конечно. И руками тыкали, и скриптами гоняли. Стратегия простая, как три копейки: смотрим, чем наши пользователи дышат, и под них подстраиваемся.

1. Матрица, мать её, покрытия: Смотри, с каким зверинцем работали:

Браузер (десктоп) Версии Браузер (мобильный) Версии
Google Chrome последняя, последняя-1 Chrome for Android последняя
Mozilla Firefox последняя, ESR Safari iOS последняя, последняя-1
Microsoft Edge последняя (на Chromium) Samsung Internet актуальная
Apple Safari последняя (macOS)

Вот эти «последняя-1» — это чтоб не обосраться, когда выкатят новую версию с каким-нибудь левым багом.

2. Инструменты и весь этот цирк:

  • BrowserStack / Sauce Labs: Ну, святая святых, блядь. Вместо того чтобы копить старые компы с Windows XP, просто арендуешь виртуалку в облаке с нужной ОС и браузером. Руками пошарил, скрипты запустил — красота.
  • Selenium WebDriver: Для автоматизации. Главный фокус — параметризовать тесты, чтобы они сами, сука, понимали, где их запускать. Подсовываешь разные capabilities — и поехали.
  • Локальная проверка: Ну а это само собой. Сначала в своём основном хроме всё смотришь, потом в фаерфоксе, потом в сафари на маке — если есть. Базовый сценарий, ёпта.

3. На что смотрели, как орлы (а иногда и как слепые кроты):

  • Вёрстка (CSS): Вот где собака зарыта, блядь! Отступы, которые в хроме ровные, а в старом Edge ебут мозг. Flexbox/grid — чтобы не развалилось. Особенно этот gap для grid в старых Safari — там без полифила вообще писец. Ну и normalize.css в помощь, без него никуда.
  • JavaScript: Чтобы анимации не тормозили, клики срабатывали, а не зависали. И всякие современные API, вроде Intersection Observer — проверяли, не сломается ли всё в говнобраузерах.
  • Формы: О, это отдельная песня. Чтобы инпуты не светились синей хуйнёй в Сафари, а валидация работала везде.

Вот, смотри, как скрипт для Selenium выглядел (Python):

import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By

@pytest.mark.parametrize("browser_name", ["chrome", "firefox", "safari"])
def test_login_form_rendering(browser_name):
    """Тест проверяет, что форма логина корректно отображается в разных браузерах."""
    if browser_name == "chrome":
        driver = webdriver.Chrome()
    elif browser_name == "firefox":
        driver = webdriver.Firefox()
    elif browser_name == "safari":
        driver = webdriver.Safari()

    driver.get("https://app.example.com/login")
    username_field = driver.find_element(By.ID, "username")
    password_field = driver.find_element(By.ID, "password")

    # Проверка, что поля видны и кликабельны
    assert username_field.is_displayed()
    assert password_field.is_displayed()
    assert username_field.is_enabled()

    driver.quit()

Короче, вся цель — чтобы юзер, с какого бы устройства или браузера ни зашёл (ну, из основных, ясен пень), не поймал говно-экспириенс. Особенно на тех платформах, откуда деньги текут. Всё остальное — по остаточному принципу, ибо ресурсы не резиновые, ёпта.