Собеседования по Selenium проверяют две вещи: умеете ли вы писать стабильные UI-тесты (ожидания, локаторы, page objects) и можете ли вы спроектировать фреймворк, с которым команда сможет жить (структура, данные, отчётность, запуск в CI). Нестабильные тесты — самая частая тема, потому что каждый, кто работал с Selenium, с ними боролся.
Ниже — 24 вопроса с ответами. В примерах используется синтаксис Java и Python там, где код помогает, а сами идеи применимы на любом языке.
Основы
1. Что такое Selenium и из каких компонентов он состоит?
Selenium — это open source набор инструментов для автоматизации браузеров. Selenium WebDriver управляет браузерами через их драйверы, и именно его чаще всего имеют в виду. Selenium Grid запускает тесты параллельно на множестве машин и браузеров. Selenium IDE — это расширение для записи и воспроизведения. Selenium не работает с десктопными приложениями и не имеет встроенной отчётности по тестам, поэтому его комбинируют с тестовым фреймворком.
2. Как работает WebDriver?
Ваш тест отправляет команды по протоколу W3C WebDriver через HTTP драйверу браузера, например ChromeDriver или GeckoDriver, который управляет браузером и возвращает результаты. В последних версиях Selenium есть Selenium Manager, который находит и скачивает нужный драйвер.
3. Какие локаторы поддерживает Selenium и какие предпочитаете вы?
ID, name, class name, tag name, link text, partial link text, CSS-селектор и XPath. Предпочитайте стабильный ID или специальный тестовый атрибут вроде data-testid, а затем CSS. Используйте XPath, когда нужно подняться по дереву или сопоставить текст. Избегайте длинных путей, основанных на позиции, вроде /html/body/div[3]/div[2] — они ломаются при изменении вёрстки.
4. В чём разница между findElement и findElements?
findElement возвращает первое совпадение и бросает NoSuchElementException, если совпадений нет. findElements возвращает список, который пуст, если ничего не найдено, поэтому он полезен для проверки отсутствия элемента.
5. В чём разница между driver.close() и driver.quit()?
close() закрывает текущее окно. quit() закрывает все окна и завершает сессию. Используйте quit() в teardown, чтобы не оставалось висящих процессов браузера.
Ожидания и нестабильные тесты
6. Какие бывают виды ожиданий?
| Ожидание | Как работает |
|---|---|
| Неявное | Глобальный таймаут для поиска элементов |
| Явное | Ожидает конкретного условия для конкретного элемента |
| Fluent | Явное ожидание с настраиваемым интервалом опроса и игнорируемыми исключениями |
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.id("submit")));
Предпочитайте явные ожидания. Смешивание неявных и явных ожиданий может приводить к непредсказуемым задержкам.
7. Почему не стоит использовать Thread.sleep?
Он всегда ждёт всё указанное время, замедляя набор тестов, и при этом его всё равно может не хватить в медленный день. Ожидание по условию продолжается сразу, как только условие выполнено, а иначе падает с понятным сообщением.
8. Что вызывает нестабильные тесты и как это исправить?
Частые причины и решения:
- Тайминги: используйте явные ожидания конкретного условия, а не sleep.
- Общие или оставшиеся данные: создавайте тестовые данные для каждого теста и убирайте их за собой.
- Зависимость между тестами: делайте каждый тест независимым и запускаемым отдельно.
- Нестабильные локаторы: добавляйте тестовые ID и избегайте путей, основанных на позиции.
- Анимации и оверлеи: дождитесь исчезновения оверлея или отключите анимации в тестовом окружении.
- Проблемы окружения: стабилизируйте тестовое окружение, проверяйте сетевые и сторонние вызовы.
- Влияние параллельного запуска: изолируйте состояние для каждого потока.
Отправьте нестабильный тест в карантин, чтобы он не блокировал всех, а затем почините его как следует. Не стоит просто везде добавлять ретраи — это скрывает реальные баги.
9. Что такое StaleElementReferenceException?
Найденный вами элемент больше не привязан к странице, обычно потому что страница перерисовалась. Исправляется повторным поиском элемента непосредственно перед использованием или ожиданием нового элемента, а не долгим хранением ссылок.
10. Как обрабатывать элементы, по которым нельзя кликнуть (ElementClickInterceptedException)?
Что-то перекрывает элемент, например баннер или загрузочный оверлей. Дождитесь исчезновения оверлея, проскролльте элемент в зону видимости или закройте баннер. Клик через JavaScript должен быть крайней мерой, потому что реальный пользователь не смог бы кликнуть, и тест скрыл бы настоящий баг.
Работа с элементами страницы
11. Как вы работаете с выпадающими списками, алертами, фреймами и окнами?
- Выпадающие списки: класс Select для стандартных элементов select и клики для кастомных выпадающих списков.
- Алерты: driver.switchTo().alert() для принятия, отклонения или чтения.
- Фреймы: switchTo().frame(...) и обратно к defaultContent().
- Окна и вкладки: получаем дескрипторы окон, переключаемся на новое и обратно.
12. Как вы работаете с загрузкой и скачиванием файлов?
Для загрузки передаём путь к файлу в элемент input type="file" через sendKeys. Для скачивания задаём директорию загрузок в опциях браузера, ждём появления файла, затем проверяем его имя и содержимое.
13. Как запустить JavaScript в Selenium?
Через JavascriptExecutor.executeScript, например чтобы проскроллить страницу или прочитать значение, до которого не добраться через API. Используйте это умеренно.
14. Что такое headless-режим?
Браузер работает без видимого окна — это быстрее и подходит для серверов и CI. При отладке проверяйте в обычном режиме и следите за размером вьюпорта, потому что вёрстка может отличаться.
Проектирование фреймворка
15. Что такое Page Object Model?
Каждая страница или компонент — это класс, который хранит свои локаторы и действия над ними. Тесты вызывают методы вроде loginPage.loginAs(user) и не трогают локаторы напрямую. Когда UI меняется, вы правите один класс, а не множество тестов.
class LoginPage:
def __init__(self, driver):
self.driver = driver
def login_as(self, user, password):
self.driver.find_element(By.ID, "user").send_keys(user)
self.driver.find_element(By.ID, "pass").send_keys(password)
self.driver.find_element(By.ID, "submit").click()
16. Что входит в хороший тестовый фреймворк?
Тест-раннер (TestNG, JUnit, pytest), page objects, фабрика драйверов для разных браузеров, конфигурация под каждое окружение, управление тестовыми данными, хелперы для ожиданий, отчётность, логирование, скриншоты при падении и интеграция с CI.
17. Как вы управляете тестовыми данными?
Создавайте данные, нужные тесту, через API или подготовку в базе данных в начале, а не через UI, и удаляйте их после. Храните данные в файлах или билдерах, а не хардкодьте в тестах, и избегайте тестов, которые полагаются на данные, оставленные другим тестом.
18. Как запускать тесты параллельно?
Используйте параллельный режим раннера, давайте каждому потоку свой драйвер (например, через ThreadLocal), держите тесты независимыми и запускайте на Selenium Grid или облачном сервисе браузеров, чтобы масштабироваться по браузерам.
19. Что такое Selenium Grid?
Это система с хабом и нодами (или распределённая конфигурация в Grid 4), которая запускает тесты на разных браузерах и операционных системах параллельно. Это сокращает общее время прогона и позволяет покрыть больше браузеров.
Стратегия и сценарии
20. Что стоит автоматизировать с помощью Selenium, а что нет?
Автоматизируйте стабильные, ценные и повторяемые сценарии: логин, оформление заказа, критичные регрессионные пути. Не автоматизируйте разовые проверки, часто меняющийся UI или то, что лучше тестировать на более низком уровне. Здоровый набор тестов — это много unit- и API-тестов, меньше UI-тестов и небольшой набор end-to-end сценариев.
21. Как тестировать приложение с капчей или двухфакторным входом?
Не пытайтесь обойти их в тесте. Используйте тестовое окружение, где они отключены, тестовый аккаунт с фиксированным кодом или флагом обхода, либо тестовый API для создания сессии.
22. Тест проходит локально, но падает в CI. Что вы проверяете?
Версии браузера и драйвера, размер экрана и различия headless-режима, тайминги на более медленных машинах, данные окружения, доступ к сети, часовые пояса и локаль, а также параллельные прогоны, которые делят данные. При падении сохраняйте скриншоты, исходный код страницы и логи для сравнения.
23. Как выбрать между Selenium, Playwright и Cypress?
Selenium поддерживает много языков и браузеров и имеет огромную экосистему. Playwright и Cypress предлагают встроенные ожидания, более простую настройку и хорошие инструменты отладки — они могут лучше подойти новым проектам. Правильный выбор зависит от языка, требований к браузерам и навыков команды. Приводите свои аргументы, а не предпочтение бренда.
24. Проведите меня через автоматизацию сценария оформления заказа.
«Я бы создал пользователя и товар через API, затем вошёл через UI или переиспользовал сессию. Page object для каждого шага: поиск, товар, корзина и оплата. Я бы использовал тестовый способ оплаты, дождался элемента подтверждения, проверил заказ через UI и API и сделал скриншот при падении. Тест удалял бы свой заказ, запускался параллельно и выполнялся в пайплайне при каждом мерже».
Как готовиться
Напишите небольшой набор тестов для демо-сайта с page objects, явными ожиданиями, скриншотами при падении и запуском в CI. Потренируйтесь объяснять, как вы починили нестабильный тест, с причиной и изменением. Будьте готовы вживую написать локатор и ожидание. Смотрите наш гайд по ассистенту для собеседований по программированию для тренировочных routines и гайд по поведенческому интервью для раунда по soft skills.
Проговаривайте ответы вслух и перечитывайте транскрипт на предмет размытых мест вроде «просто добавь ожидание». Соблюдайте правила работодателя об использовании AI-инструментов на любом живом собеседовании.
Практикуйте ответы для собеседования по Selenium с YesToTheOffer
Пройдите mock-техническое собеседование, объясните свой фреймворк вслух и просмотрите транскрипт afterward. 30 бесплатных минут, без подписки.



