Python: Selenium
Теория: Локаторы
Использование find_element(By.ID, By.CSS_SELECTOR, By.XPATH)
Когда браузер открывает страницу, Selenium видит её как дерево HTML-элементов — теги, атрибуты, текст. Чтобы нажать кнопку или ввести текст в поле, нужно указать, какой элемент брать. Делается это через локаторы.
Главная команда для поиска — find_element. Она принимает два аргумента: способ поиска и значение. Например, по id, по CSS-селектору или по XPath.
Если нужно получить не один элемент, а все подходящие — используют find_elements.
Поиск внутри других элементов
Иногда на странице несколько одинаковых блоков — карточки товара, строки таблицы, статьи. Если искать элемент напрямую, Selenium может вернуть не тот, что нужен. Чтобы ограничить область поиска, можно сначала найти родительский элемент, а потом искать внутри него.
Это удобно, когда на странице десятки одинаковых элементов. Мы выбираем нужный блок и работаем только с ним.
Надёжные локаторы: принципы и примеры
Надёжный локатор — это тот, который не ломается при мелких изменениях верстки. Лучше всего использовать уникальные атрибуты: id, name или специальные data-testid, добавленные разработчиками для автотестов.
Если таких атрибутов нет, можно использовать часть структуры, но без избыточной вложенности.
Ещё вариант — искать по тексту, особенно для кнопок.
XPath мощный, но громоздкий. Если страница меняется часто — лучше CSS. Если важно найти элемент по тексту или по отношению к другому — тогда XPath.
Хорошо, когда локатор читается как фраза: “возьми кнопку с data-testid=save”. Плохо, когда он выглядит как карта метро.
Проблемы плохих локаторов
Плохие локаторы — это те, что зависят от структуры или порядка элементов. Например:
Если вёрстку поменяют, тест упадёт. Также плохо, когда используется неуникальный класс:
На странице может быть десятки .btn. Selenium возьмёт первую попавшуюся, и тест поведёт себя непредсказуемо.
Хуже всего — локаторы, завязанные на стили или случайные классы, которые генерирует фреймворк:
Такие селекторы меняются при каждой сборке. Автотесты с ними не живут дольше пары релизов.
Чтобы локаторы были стабильными, нужно договориться с разработчиками о data-* атрибутах и использовать их в тестах. Например:
Такой локатор не зависит от дизайна и останется рабочим даже после изменений интерфейса.


