Поиск кнопок по тексту в Selenium WebDriver (Python)

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы быстро отыскать элементы с заданным текстом в Selenium WebDriver на Python, воспользуйтесь XPath и функцией contains():

Python
Скопировать код
element = driver.find_element_by_xpath("//*[contains(text(),'ваш_текст')]")

Этот код позволит вам отыскать элемент, содержащий "ваштекст". Просто замените "ваштекст" на искомую строку.

Кинга Идем в IT: пошаговый план для смены профессии

Уточнение запроса XPath с помощью HTML-тегов

Вы можете оптимизировать запрос XPath, ограничив поиск определенными HTML-тегами. Это позволит вам избежать полного перебора DOM-структуры:

Python
Скопировать код
# Нет необходимости перелистывать всю книгу, если нужна одна страница.
button = driver.find_element_by_xpath("//button[contains(., 'название_вашей_кнопки')]")

Такой выбор элементов <button> напоминает поиск в текстовом документе с помощью 'Ctrl+F', в отличие от чтения каждой строки по порядку.

Избегайте неоднозначного текста

Использование запросов с универсальными текстовыми фрагментами может привести к следующему:

Python
Скопировать код
# Так можно найти ВСЕ кофейни в городе, а не только вашу излюбленную.
elements = driver.find_elements_by_xpath("//*[contains(., 'общераспространенный_текст')]")

Слишком общий текстовый запрос может вернуть множество нерелевантных элементов.

Учтите неожиданные вариации текста с функциями XPath

Следующие приёмы помогут вам работать с текстами, в которых могут присутствовать пробелы или разница в регистрах:

Python
Скопировать код
# Не обращаем внимания на 'неровности' текста
div_element = driver.find_element_by_xpath("//div[normalize-space()='ваш_текст']")

# Не уверены, как правильно пишется 'том', 'Том' или 'ТОМ'?
div_element = driver.find_element_by_xpath("//*[contains(translate(., 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'), 'ваш_текст')]")

Эти функции XPath позволят вам игнорировать особенности текста и нацелить запрос на нужный элемент.

Визуализация

Поиск элемента по тексту в Selenium можно представить как выделение текста маркером на странице книги:

Markdown
Скопировать код
Ваша задача подобна тому, чтобы отыскать конкретные предложения в книге (📖):
[..."Selenium WebDriver",..."Python",..."определенный текст",...]
Python
Скопировать код
# Сигнал в космос: 'Находим "определенный текст"!
element = driver.find_element_by_xpath("//*[contains(text(), 'определенный текст')]")
Markdown
Скопировать код
До: [📖...📖]
После: [📖...🌟'определенный текст'🌟...📖]

Воспринимайте XPath как луч света, подсвечивающий искомый фрагмент текста:

Markdown
Скопировать код
🔍 Запрос: "//*[contains(text(), 'ОПРЕДЕЛЕННЫЙ ТЕКСТ')]"
📖 Результат: Это словно луна в ночи – 'ОПРЕДЕЛЕННЫЙ ТЕКСТ' выделенный из тьмы.

Selenium WebDriver служит мощным прожектором, позволяя вам увидеть нужный элемент среди веб-шума.

Используйте модель объекта страницы для организации локаторов

Модель объекта страницы (Page Object Model, POM) идеально подходит для структурирования крупных проектов и управления динамическим содержимым. Эта модель гибко позволяет организовать локаторы WebElement:

Python
Скопировать код
class MyPageObject:
    # Содержание дома организовано — так же и WebElements
    MY_BUTTON = (By.XPATH, "//button[contains(., 'МояКнопка')]")

    def __init__(self, driver):
        self.driver = driver

    # Все под контролем: ваша кнопка на своем месте.
    def get_my_button(self):
        return self.driver.find_element(*self.MY_BUTTON)

POM облегчает поиск ошибок и обновление локаторов через @FindBy и другие стратегии.

Благодаря фильтрам класса и атрибутов можно сузить область поиска

Если одинаковый текст встречается в разных элементах, дополнительные точки опоры в XPath могут направить поиск, как фильтр:

Python
Скопировать код
# Если ваша цель — 'синие кожаные куртки' среди разнообразия 'курток':
element = driver.find_element_by_xpath("//button[contains(@class, 'btn-primary') and contains(text(),'Отправить')]")

Будьте осторожны в отношении производительности

Время реакции важно! Правильный выбор локатора элемента может экономить секунды, особенно на больших страницах:

Python
Скопировать код
# Зачем идти пешком, если есть скоростной лифт?
elements = driver.find_elements_by_xpath("//button[contains(., 'МояКнопка')]")

Такой подход обеспечит быстрый поиск элементов button, в отличие от более медлительных стратегий, таких как //*.

Берегитесь злополучных вложенных элементов

Вложенные элементы могут усложнить выбор целевого элемента. Внимание к иерархии элементов важно:

Python
Скопировать код
# Важно ли вам полное блюдо, или необходим только соус? 
parent = driver.find_element_by_xpath("//*[contains(text(), 'ВашТекст') and not(.//*[contains(text(), 'ВашТекст')])]")

Используйте поиск по шаблону для динамического содержимого

Когда текст часто меняется, XPath-функции, такие как starts-with() или ends-with(), увеличивают вероятность успешного поиска:

Python
Скопировать код
# Не важно, на 'Привет' начинается или на 'До свидания' заканчивается:
variable_element = driver.find_element_by_xpath("//*[starts-with(text(), 'Добро пожаловать')]")

Полезные материалы

  1. Selenium with Python — Официальная документация – Полное руководство по использованию Selenium с Python.
  2. Синтаксис XPath – W3Schools — Подробности использования запросов XPath для Selenium.
  3. Home · SeleniumHQ/selenium Wiki · GitHub — Рекомендации по применению явных ожиданий в Selenium.
  4. Встроенные типы — Документация Python 3.12.2 — Насколько хорошо вы знаете методы строк в Python и оператор in?
  5. Селекторы CSS – CSS: каскадные таблицы стилей | MDN — Освойте CSS селекторы для Selenium, следуя официальному источнику.
  6. Команды ожидания Selenium WebDriver | Selenium Учебники | ToolsQA — О механизмах ожидания в Selenium WebDriver и ключе к терпению.
  7. Основные понятия: как работают CSS селекторы | CSS-Tricks – CSS-Tricks — Введение в понимание CSS селекторов для начинающих.