Обзор лучших практик и методов: CSS-селекторы, содержащие текст, в Selenium для профессионалов

В автоматизации тестирования с использованием Selenium WebDriver и Python часто возникает задача поиска элементов веб-страницы, содержащих определенный текст. CSS-селекторы – мощный инструмент для этой цели, хотя и с некоторыми ограничениями. XPath также является альтернативой, которую мы рассмотрим.

Основы работы с CSS-селекторами в Selenium

Обзор CSS-селекторов и их преимуществ в Selenium

CSS-селекторы позволяют точно и эффективно выбирать элементы на веб-странице на основе их свойств: классов, ID, атрибутов и структуры DOM. Они часто быстрее XPath и более читаемы, особенно для простых задач. В Selenium CSS-селекторы используются через метод find_element(By.CSS_SELECTOR, 'your_selector').

Синтаксис базовых CSS-селекторов и их применение (классы, ID, атрибуты)

  • .class_name: Выбор элементов с указанным классом.

  • #id_name: Выбор элемента с указанным ID.

  • element[attribute=value]: Выбор элементов с указанным атрибутом и значением.

  • element: Выбор элемента по тегу.

  • element1 element2: Выбор element2 внутри element1.

Пример:

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

driver = webdriver.Chrome() # or any other browser
driver.get("https://www.example.com")

element = driver.find_element(By.CSS_SELECTOR, "h1")
print(element.text)

driver.quit()

Поиск элементов по тексту: методы и подходы

Использование псевдокласса :contains() (и альтернативы, если необходимо)

К сожалению, CSS не имеет встроенного псевдокласса :contains(), который бы позволял напрямую выбирать элементы, содержащие определенный текст. Однако, можно обойти это ограничение с помощью JavaScript, выполняемого в контексте браузера, или использовать XPath.

Пример с JavaScript:

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

def find_element_by_text(text):
    script = f"""
    let elements = [];
    let allElements = document.querySelectorAll('*');
    for (let i = 0, n = allElements.length; i < n; i++) {
        if (allElements[i].textContent.includes('{text}')) {
            elements.push(allElements[i]);
        }
    }
    return elements;
    """

    script = script.replace('{text}', text)
    return driver.execute_script(f'return ({script})')

elements = find_element_by_text("Example Domain")

for element in elements:
    print(element.text)

driver.quit()

Работа с атрибутами и текстом элемента для поиска по частичному совпадению

Для поиска по частичному совпадению текста, часто используют XPath, комбинируя его с CSS-селекторами для повышения производительности, когда это возможно.

Практические примеры и сценарии использования

Поиск элементов с точным соответствием текста

Хотя прямого эквивалента :contains() в CSS нет, можно использовать JavaScript для эмуляции этой функциональности. Однако, рекомендуется использовать XPath для поиска элементов с точным соответствием текста из-за его более простой реализации и читаемости.

Реклама

Пример с XPath:

element = driver.find_element(By.XPATH, "//*[text()='Точный текст']")

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

XPath позволяет осуществлять поиск без учета регистра. Используйте функцию lower-case():

Пример XPath (без учета регистра):

element = driver.find_element(By.XPATH, "//*[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'пример')] ")

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

Сравнение CSS-селекторов и XPath для поиска по тексту и заключение

Преимущества и недостатки CSS-селекторов и XPath

  • CSS-селекторы:

    • Преимущества: Обычно быстрее XPath, особенно для простых селекторов. Легче читаются, если не требуется поиск по тексту.

    • Недостатки: Нет встроенной поддержки поиска по тексту.

  • XPath:

    • Преимущества: Мощный язык для навигации по DOM, поддерживает поиск по тексту, атрибутам и их комбинациям. Позволяет игнорировать регистр.

    • Недостатки: Может быть медленнее CSS-селекторов, особенно для сложных запросов. Сложный синтаксис.

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

  • Если требуется простой поиск по классам, ID или атрибутам, используйте CSS-селекторы.

  • Если необходим поиск по тексту (точное или частичное совпадение, с учетом или без учета регистра), используйте XPath.

  • Комбинируйте CSS-селекторы и XPath для оптимизации производительности и читаемости: используйте CSS-селекторы для максимально возможной фильтрации, а затем XPath для поиска по тексту среди уже отобранных элементов.

  • JavaScript является обходным путем, когда необходимо использовать логику :contains().

Заключение

В Selenium WebDriver, выбор между CSS-селекторами и XPath для поиска элементов, содержащих текст, зависит от конкретной задачи. XPath предоставляет более гибкие возможности для работы с текстом, в то время как CSS-селекторы обычно быстрее для простых задач. JavaScript может служить альтернативой, но рекомендуется использовать его с осторожностью. Правильное сочетание этих инструментов позволит создавать эффективные и надежные тесты автоматизации.


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