JavaRush /Курси /Python SELF UA /Створення функцій для пошуку та взаємодії з елементами на...

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

Python SELF UA
Рівень 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, як ми обговорювали раніше.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ