перейти к содержанию

Как найти элементы по XPath в Selenium (подробное руководство)

Как эксперт в области веб-скрапинга и прокси с более чем 5-летним опытом, я считаю, что XPath — один из наиболее полезных и универсальных методов поиска веб-элементов. Освоение селекторов XPath поможет вам точно извлекать данные даже из самых сложных веб-страниц.

В этом подробном руководстве, состоящем из более чем 3200 слов, я поделюсь всем, что узнал о поиске элементов и взаимодействии с ними с помощью XPath в Selenium.

Что такое XPath?

Прежде чем мы углубимся в использование, важно понять, что на самом деле представляет собой XPath.

XPath означает язык XML Path. Это язык запросов для выбора узлов из XML-документа. По сути, XPath предоставляет синтаксис для описания частей структуры XML.

Поскольку HTML структурирован как XML, с вложенными элементами, такими как открывающие и закрывающие теги, XPath также можно использовать для определения частей HTML-документа.

По данным w3schools, некоторые ключевые факты о XPath:

  • XPath использует выражения пути для выбора узлов или наборов узлов в XML-документе.
  • Эти выражения пути очень похожи на выражения пути, которые вы видите при работе с традиционной компьютерной файловой системой.
  • XPath содержит более 100 встроенных функций для управления строками, числами, логическими значениями, наборами узлов и т. д.
  • XPath является основным элементом XSLT (преобразования расширяемого языка таблиц стилей).

Подводя итог, можно сказать, что XPath — это мощный язык запросов и извлечения данных, предназначенный для навигации по XML-документам.

Как XPath связан с Selenium?

Selenium — это платформа автоматизации для управления веб-браузерами. Когда вы загружаете веб-страницу в Selenium, содержимое HTML анализируется в структуру DOM (объектная модель документа).

DOM визуально представляет страницу как дерево вложенных HTML-элементов.

XPath можно использовать для перемещения по DOM для поиска и взаимодействия с определенными элементами на странице.

Например, рассмотрим этот упрощенный HTML:

<html>
<body>

  <div>
    <p>Hello World!</p>
  </div>

  <div>
    <img src="logo.png"/>
  </div>

</body>
</html>

DOM может выглядеть примерно так:

       html
       /  \
     body   
     / \     
    div  div
      |    |
     p    img

Затем вы можете использовать выражения XPath для запроса элементов внутри этой структуры:

/html/body/div[1]/p
//div/img

Это делает XPath невероятно полезным для автоматизации действий в определенных частях страницы с помощью Selenium.

Основы синтаксиса XPath

Теперь, когда вы понимаете роль XPath, давайте углубимся в синтаксис.

XPath использует выражения пути для выбора элементов и атрибутов в документе XML. Выражения очень похожи на пути в файловой системе вашего компьютера:

/Users/jsmith/Documents/letter.docx

Косая черта / позволяет перемещаться вниз по вложенным папкам.

Некоторые базовые шаблоны XPath:

  • nodename – Выбирает все узлы с именем nodename
  • / – Выбирает из корневого узла
  • // – Выбирает узлы на любой глубине
  • . – Выбирает текущий узел
  • .. – Выбирает родительский узел
  • @ – Выбирает атрибуты

Например:

/html/body/div - Selects all div tags under body
//div - Selects all div tags anywhere 
div[@class=‘header‘] - Selects div tags with matching class attribute

В этом руководстве мы рассмотрим еще много специализированных синтаксисов. Но эти базовые шаблоны позволяют вам приступить к созданию целевых селекторов XPath.

По моему опыту, освоение всего 5-10 основных выражений XPath позволит вам находить элементы на большинстве веб-сайтов.

Поиск веб-элементов с помощью find_element и find_elements

Selenium предоставляет два основных метода поиска элементов с помощью XPath:

  • find_element() – Возвращает один веб-элемент, соответствующий XPath
  • find_elements() – Возвращает список всех соответствующих WebElements.

Вот простой пример использования:

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

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

# Find single element
element = driver.find_element(By.XPATH, ‘//img‘) 

# Find multiple elements 
elements = driver.find_elements(By.XPATH, ‘//div‘)

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

Советы по поиску элементов

Основываясь на своем многолетнем опыте, вот несколько ключевых советов при создании селекторов XPath:

  • Проверьте исходный код HTML – Просмотр необработанного содержимого HTML позволяет идентифицировать уникальные атрибуты и шаблоны для целевых элементов. Все современные браузеры имеют инструменты разработчика для просмотра исходного кода.

  • Скопируйте XPath в браузере – Большинство инструментов разработки браузеров также включают функцию копирования полного XPath элемента. Затем вы можете настроить и упростить эти селекторы базовой линии.

  • Сосредоточьтесь на идентификаторе – Атрибут id элемента страницы обеспечивает наиболее прямой и уникальный селектор, например //input[@id=‘search‘].

  • Классы помогают – Атрибуты класса позволяют выполнять более гибкие запросы, например //div[@class=‘results‘] пусть и не совсем уникальный.

  • Избегайте индексов – Использование позиционных индексов, таких как [1], [2], приводит к ненадежным локаторам.

  • Короче лучше – Краткий XPath с минимальным количеством вложенных шагов помогает избежать медленных запросов или неверных совпадений.

Освоение этих рекомендаций поможет вам создать надежные селекторы XPath, которые элегантно выбирают нужные элементы страницы.

Распространенные шаблоны и рецепты XPath

Поскольку теперь вы понимаете основы, давайте рассмотрим некоторые распространенные примеры шаблонов XPath:

Выбрать по значению атрибута

//input[@type=‘submit‘]
//a[@href=‘contact.html‘]

Частичное сопоставление атрибутов

//input[contains(@name, ‘search‘)]
//div[starts-with(@class, ‘result‘)]

Выберите текстовое совпадение

//p[text()=‘Hello World‘] 
//h2[contains(text(), ‘Welcome‘)]

Выбрать детей

/div/p
//tbody/tr/td

Индексированный выбор

(//input[@type=‘button‘])[2]

Связанный выбор

//div[@id=‘nav‘]/ul/li/a 

Следование за братьями и сестрами

//h1[text()=‘Articles‘]/following-sibling::p

Я рекомендую ознакомиться с каждым из этих распространенных методов. Они образуют набор инструментов XPath, который пригодится вам при построении надежных запросов.

Пример парсинга

Давайте рассмотрим пример сценария очистки веб-страниц с использованием Selenium и XPath в Python.

Мы извлечем данные о продукте с сайта электронной торговли:

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

# Initialize driver 
driver = webdriver.Chrome(‘/path/to/chromedriver‘)

# Load page
driver.get(‘https://www.example.com‘)

# Click shop link
shop_link = driver.find_element(By.LINK_TEXT, ‘Shop‘)
shop_link.click()

# Wait for new page to load
time.sleep(5)  

# Extract product details
product = driver.find_element(By.XPATH, ‘//div[@class="product"][1]‘)
name = product.find_element(By.XPATH, ‘.//h2‘).text
description = product.find_element(By.XPATH, ‘.//p‘).text 
price = product.find_element(By.XPATH, ‘.//span[@class="price"]‘).text

print(name, description, price)

# Close browser
driver.quit()

Это демонстрирует, как XPath можно использовать для точного определения элементов для очистки данных вложенных страниц.

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

Вот некоторые распространенные проблемы, которые могут возникнуть при использовании локаторов XPath в Selenium, а также стратегии их устранения:

Таймауты

Если страницам требуется время для загрузки, используйте неявное и явное ожидание:

from selenium.webdriver.common.by import WebDriverWait 

driver.implicitly_wait(10) 

WebDriverWait(driver, 20).until(expected_conditions)

Устаревшие элементы

Если DOM изменится, переместите элементы, чтобы избежать исключений устаревших элементов:

elements = driver.find_elements(By.XPATH, ‘//div‘)
# DOM updates, elements now stale
elements = driver.find_elements(By.XPATH, ‘//div‘) 

Совместимость браузера

Некоторые расширенные функции XPath могут работать не во всех браузерах. Протестируйте поведение и при необходимости упростите.

Медленная производительность

Очень сложные выражения XPath могут замедлить выполнение теста. Упростите структуру, где это возможно.

Прозрачность

Совпадающие элементы не обязательно могут быть видимы. Прежде чем взаимодействовать, убедитесь, что они отображаются.

Опыт помогает предвидеть эти проблемы – со временем с ними становится намного легче справиться.

Альтернативы XPath

Хотя XPath является мощным инструментом, он не всегда является лучшим решением. Вот некоторые распространенные альтернативы:

Селекторы CSS

Селекторы CSS предоставляют простой и знакомый способ поиска элементов:

driver.find_element(By.CSS_SELECTOR, ‘input[type="submit"]‘)
driver.find_element(By.CSS_SELECTOR, ‘.search-box‘) 

Атрибуты идентификатора и имени

Если идентификаторы или имена действительно уникальны, используйте:

driver.find_element(By.ID, ‘search‘)
driver.find_element(By.NAME, ‘query‘) 

Текст ссылки

Сопоставление полного текста ссылки позволяет избежать сложных запросов:

driver.find_element(By.LINK_TEXT, ‘Logout‘)

Оцените каждый вариант с учетом ваших конкретных потребностей. Я часто обнаруживаю, что сочетание XPath, CSS, ID и локаторов текста ссылок обеспечивает максимальную надежность.

Сравнение стратегий локатора

Вот сравнение XPath с некоторыми распространенными альтернативными стратегиями расположения элементов:

Способ доставкиПримерПлюсыМинусы
XPath//дел/пОчень гибкие запросыСложный синтаксис
CSS Selectordiv.results pЗнакомый синтаксисНацеливается только на класс/идентификатор/атрибуты
ID#форма регистрацииОчень быстро и уникальноТребуются идентификаторы
Имяимя=запросУникальное ПроизведениеПолагайтесь на соглашения об именах
Текст ссылкиВыйтиПросто для ссылокТолько для текста ссылки

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

Расширенное использование с lxml и parsel

Хотя Selenium имеет очень удобные встроенные методы поиска, специальные библиотеки синтаксического анализа, такие как lxml и parsel, предлагают дополнительные возможности для сложных задач парсинга.

Эти библиотеки обеспечивают надежную поддержку XPath наряду со многими другими функциями, такими как:

  • Быстрые парсеры HTML и XML
  • Поддержка XPath 1.0 и 2.0+.
  • Широкий спектр функций и операторов XPath.
  • Удобные привязки для парсинга HTML
  • Интеграция с популярными фреймворками, такими как Scrapy.

Некоторые примеры использования:

from lxml import html

tree = html.parse(‘page.html‘)
p_elements = tree.xpath(‘//p‘)

from parsel import Selector
sel = Selector(text=html_text)
links = sel.xpath(‘//a/@href‘).getall() 

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

Выводы и ключевые уроки

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

Вот несколько ключевых уроков, которые я усвоил за более чем 5 лет использования XPath для взаимодействия со сложными сайтами:

  • Начните с изучения нескольких основных шаблонов XPath, таких как сопоставление атрибутов, выбор текста, выбор дочерних элементов и т. д. Большая часть использования основана на этих основах.

  • Для достижения баланса между краткими, но уникальными запросами требуется практика. Это такое же искусство, как и наука.

  • Познакомьтесь с инструментами разработчика браузера для проверки исходного кода и копирования исходных строк XPath.

  • При необходимости дополните XPath селекторами CSS и атрибутами id/name. Комбинирование подходов приводит к максимальной надежности.

  • Рассмотрите расширенные библиотеки синтаксического анализа XPath, такие как lxml и parsel, для расширенных возможностей парсинга за пределами Selenium.

  • Научитесь предвидеть и решать распространенные проблемы, такие как устаревшие элементы и тайм-ауты, с течением времени, на основе опыта.

Я надеюсь, что это руководство предоставило исчерпывающую информацию о том, как раскрыть возможности выбора элементов XPath с помощью Selenium. Дайте мне знать, если у вас есть еще какие-либо конкретные вопросы!

Теги:

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *