Python Selenium: Руководство по Выбору Элементов по Видимому Тексту (Содержащему)

В автоматизации веб-тестирования с использованием Selenium и Python, одной из распространенных задач является поиск и идентификация веб-элементов на странице по их видимому тексту. Часто требуется найти элемент, текст которого содержит определенную подстроку. Это руководство предоставляет подробную информацию о том, как эффективно выбирать элементы по видимому тексту (содержащему) в Selenium с использованием Python, охватывая различные подходы, включая XPath и регулярные выражения. Мы рассмотрим примеры кода и лучшие практики, чтобы помочь вам создавать надежные и поддерживаемые автоматизированные тесты.

Основы поиска элементов в Selenium с Python

Selenium WebDriver предлагает несколько способов поиска элементов на веб-странице. Понимание этих методов имеет решающее значение для эффективной автоматизации.

Обзор методов поиска элементов в Selenium (ID, Name, Class Name)

Selenium предоставляет различные методы для поиска элементов, такие как:

  • ID: Поиск элемента по уникальному идентификатору.

  • Name: Поиск элемента по атрибуту name.

  • Class Name: Поиск элементов по имени класса CSS.

  • Tag Name: Поиск элементов по имени тега (например, div, a, input).

  • Link Text: Поиск элементов ссылок (<a>) по точному тексту ссылки.

  • Partial Link Text: Поиск элементов ссылок по частичному тексту ссылки.

  • CSS Selector: Поиск элементов с использованием CSS-селекторов.

  • XPath: Поиск элементов с использованием XPath-выражений.

Хотя эти методы полезны, они не всегда подходят для поиска элементов по видимому тексту, особенно когда текст динамический или частичный. Для этих случаев XPath является более гибким и мощным инструментом.

Поиск элементов по тексту: основы и ограничения

Прямой поиск элементов исключительно по тексту, без использования XPath или CSS-селекторов, в Selenium не предусмотрен. Методы Link Text и Partial Link Text работают только для элементов <a>. Для поиска элементов по произвольному тексту необходимо использовать XPath.

Использование XPath для поиска элементов по тексту

XPath (XML Path Language) — это язык запросов для навигации по XML-документу (или, в данном случае, HTML-документу, представленному в виде DOM). Он позволяет находить элементы на основе различных критериев, включая текст.

Практическое руководство по использованию XPath с функциями contains() и text()

Функция text() в XPath возвращает текстовое содержимое элемента. Функция contains() проверяет, содержит ли одна строка другую.

Общая структура XPath для поиска элемента, содержащего определенный текст, выглядит следующим образом:

//*[contains(text(), 'текст')]

Здесь:

  • //*: Означает поиск любого элемента в документе.

  • contains(text(), 'текст'): Условие, которое проверяет, содержит ли текстовое содержимое элемента строку ‘текст’.

Примеры XPath запросов для поиска по точному и частичному тексту

Примеры:

  1. Поиск элемента, содержащего частичный текст:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome() # или другой браузер
    driver.get('https://www.example.com')
    
    element = driver.find_element(By.XPATH, "//*[contains(text(), 'Example Domain')]")
    print(element.text)
    
  2. Поиск элемента с точным текстом:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    driver.get('https://www.example.com')
    
    element = driver.find_element(By.XPATH, "//*[text()='Example Domain']")
    print(element.text)
    
  3. Более точный поиск элемента <a>, содержащего текст:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    driver.get('https://www.example.com')
    
    element = driver.find_element(By.XPATH, "//a[contains(text(), 'More information...')]")
    print(element.get_attribute('href'))
    

Поиск элементов по тексту с учетом и без учета регистра

В некоторых случаях необходимо учитывать или игнорировать регистр при поиске элементов по тексту.

Реклама

Использование XPath для поиска с учетом регистра

По умолчанию, XPath contains(text(), 'текст') чувствителен к регистру. Если требуется точный поиск, убедитесь, что регистр в XPath-запросе соответствует регистру текста на странице.

Использование XPath для поиска без учета регистра с функциями translate()

Чтобы выполнить поиск без учета регистра, можно использовать функцию translate() в XPath. Эта функция позволяет преобразовать все символы в верхний или нижний регистр перед сравнением.

Пример:

//*[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'example domain')]

В этом примере translate() преобразует все символы верхнего регистра в нижний регистр как в тексте элемента, так и в поисковом запросе, что позволяет выполнить поиск без учета регистра.

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

driver = webdriver.Chrome()
driver.get('https://www.example.com')

element = driver.find_element(By.XPATH, "//*[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'example domain')]")
print(element.text)

Расширенные техники и решения проблем

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

XPath 2.0 (который не поддерживается большинством браузеров напрямую в Selenium) поддерживает регулярные выражения. Однако, можно комбинировать Selenium с другими библиотеками Python для достижения аналогичного результата.

  1. Получите текст всех подходящих элементов.

  2. Используйте Python для фильтрации элементов, соответствующих регулярному выражению.

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

driver = webdriver.Chrome()
driver.get('https://www.example.com')

elements = driver.find_elements(By.XPATH, "//p")

pattern = re.compile(r'\w+ Domain') #Пример регулярного выражения

for element in elements:
    if pattern.search(element.text):
        print(element.text)

Решение распространенных проблем: динамический текст, скрытые элементы, и другие кейсы

  • Динамический текст: Если текст элемента постоянно меняется, используйте более стабильные атрибуты (ID, class name) в сочетании с частичным текстовым поиском.

  • Скрытые элементы: Selenium не взаимодействует со скрытыми элементами. Убедитесь, что элемент видим, прежде чем пытаться с ним взаимодействовать. Можно использовать JavaScript для проверки видимости или изменить состояние элемента.

  • Таймауты: При поиске элементов с динамическим содержимым используйте явные ожидания (WebDriverWait) для повышения стабильности тестов.

Пример использования WebDriverWait:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get('https://www.example.com')

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "//*[contains(text(), 'Example')]" ))
    )
    print(element.text)
except:
    print("Element not found")

Заключение

Поиск элементов по видимому тексту является важной частью автоматизации веб-тестирования с использованием Selenium и Python. XPath предоставляет мощные инструменты для решения этой задачи, позволяя выполнять поиск по точному и частичному тексту, с учетом или без учета регистра. Регулярные выражения и правильная обработка динамического контента, скрытых элементов, и тайм-аутов позволяют создавать надежные и эффективные тесты. Использование явных ожиданий (WebDriverWait) улучшает стабильность тестов, особенно при работе с динамически загружаемым контентом. Понимание этих концепций позволит вам эффективно решать задачи поиска элементов по тексту в ваших проектах автоматизации.


Добавить комментарий