JavaRush /Курсы /Python SELF /Создание функций для поиска и взаимодействия с элементами...

Создание функций для поиска и взаимодействия с элементами на веб-странице

Python SELF
37 уровень , 2 лекция
Открыта

1. Основы поиска элементов на странице

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

Когда вы начнете использовать Selenium в реальных проектах, одной из первых задач будет поиск элементов на странице. Это можно сравнить с поиском кнопки лифта в гостинице: вам нужно знать, где она расположена, чтобы нажать и поехать на нужный этаж.

Selenium предоставляет несколько методов для поиска элементов. В зависимости от ваших предпочтений, вы можете использовать find_element_by_id, find_element_by_name, find_element_by_xpath, find_element_by_css_selector, и так далее. Давайте вспомним, что вы уже знаете - и напишем простой пример:

Python

from selenium import webdriver

# Создаем экземпляр браузера (здесь используем Chrome)
driver = webdriver.Chrome()

# Открываем страницу
driver.get('http://example.com')

# Поиск элемента по ID
element_by_id = driver.find_element_by_id('main')

# Поиск элемента по имени
element_by_name = driver.find_element_by_name('username')

# Поиск элемента по XPath
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')

# Поиск элемента по CSS-селектору
element_by_css = driver.find_element_by_css_selector('div.content')

Различия между find_element и find_elements

Когда у вас есть несколько элементов, которые вы хотите захватить (например, все кнопки с классом btn), вам понадобится метод find_elements. Разница между find_element и find_elements заключается в том, что первый возвращает один элемент, а второй возвращает список элементов.

Python

# Поиск одного элемента
single_element = driver.find_element_by_class_name('btn')

# Поиск нескольких элементов
multiple_elements = driver.find_elements_by_class_name('btn')

# Обход найденных элементов
for element in multiple_elements:
    print(element.text)

Как видите, find_elements отлично подходит для работы с коллекциями элементов, которых может быть несколько на странице. У каждого метода find_element_xxx есть свой find_elements_xxx, который возвращает список элементов.

2. Интерактивное взаимодействие с элементами

Взаимодействие с кнопками, ссылками и полями ввода

Теперь, когда вы вспомнили как находить элементы, самое время вспомнить как с ними взаимодействовать! Это похоже на игру с набором LEGO: нужно правильно соединить элементы, чтобы получилось то, что задумано.

Взаимодействие с элементами можно осуществить с помощью методов, которые предоставляет Selenium. Давайте еще раз посмотрим, как это делается:

Python

# Нажатие на кнопку
button = driver.find_element_by_id('submit')
button.click()

# Ввод текста в поле ввода
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium tutorial')

# Получение текста элемента
header = driver.find_element_by_tag_name('h1')
print(header.text)

Обработка событий и действия с динамическими элементами

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

Python

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

# Ожидание появления кнопки в течение 10 секунд
button = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'submit'))
)

button.click()

Примечание. Чтобы не писать каждый раз expected_conditions мы переименовали его при импорте в EC.

Использование ожидания позволяет вашему скрипту быть более надежным и не ломаться из-за временных задержек или медленного загрузки страницы. А на практике такое бывает очень часто - почти всегда :)

3. Что может пойти не так?

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

Во-первых, NoSuchElementException — это сообщение об ошибке, которое вы будете видеть довольно часто, особенно если элемент, который вы ищете, не существует на странице. Оно вызывается, если вы пытаетесь найти элемент, которого нет. Для предотвращения таких ситуаций вы можете использовать метод try-except для обработки исключений.

Python

from selenium.common.exceptions import NoSuchElementException

try:
    element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
    print("Упс, кажется, элемент не найден!")

Также возможны проблемы с динамическими элементами и временем загрузки. В этом случае ожидайте загрузку элементов с помощью WebDriverWait, как мы обсудили ранее.

Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Vlad Tagunkov Уровень 55
12 января 2025
вторая задача великолепна. с начала использую

find_element(By.***)
получаю ошибку что надо использовать

`find_elements_by_css_selector`
использую что просит валидатор. на следующей итерации получаю что этот метод устарел и надо использовать

find_element(By.***)
и после исправления задача засчиталась.