Selenium


04.07.2024

Selenium logo green

Selenium WebDriver — інструмент для автоматизації дій у веббраузері. У більшості випадків використовується для тестування Web-додатків, але цим не обмежується. Зокрема, він може бути використаний для вирішення рутинних завдань адміністрування сайту, автоматизації заповнення форм, або регулярного отримання даних із різних джерел.

Мови програмування: Python, Java, C#, JavaScript, Ruby

Коли нам треба тестувати вебдодаток або сайт, отримати дані з чужого сайту, який не має API, а на них ще працює і якийсь JS фреймворк, тобто, ми маємо справу з динамічним контентом, просто взяти та використати curl не вийде. Тоді нас спасає Selenium.

Цей інструмент розроблено для різних мов програмування, я покажу приклад його роботи на Python.

Офіційні джерела

Встановлення


pip install -U selenium

Подробиці: https://pypi.org/project/selenium/

Приклад


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

driver = webdriver.Chrome()

# Go to start URL
driver.get("https://prom.ua/")
# Print title
title = driver.title
print (title)

# Fill Search element
search_element = driver.find_element(By.NAME, "search_term")
search_element.send_keys('батарейка')

# Press Search button
search_button = driver.find_element("xpath", '//button[@data-qaid="search_btn"]')
search_button.click()

# Wait some seconds
driver.implicitly_wait(3.0)

# Get product links
product_links = driver.find_elements("xpath", '//a[@data-qaid="product_link"]')

for product_link in product_links:
    product_title = product_link.get_attribute('title')
    # Looking for the first product whose name contains the line "R6"
    if product_title.find("R6") > -1:
        product_href = product_link.get_attribute('href')
        print (product_title)
        print (product_href)

        # Open page to full prewiev
        driver.get(product_href)
        driver.implicitly_wait(0.5)

        # Press "By button"
        buy_button = driver.find_element("xpath", '//button[@data-qaid="buy-button"]')
        buy_button.click()
        driver.implicitly_wait(4.0)
        time.sleep(3)

        # Open Shopping cart
        shopping_cart = driver.find_element("xpath", '//button[@data-qaid="shopping_cart"]')
        shopping_cart.click()
        time.sleep(3)

        # Press button to create order
        create_order_btn = driver.find_element("xpath", '//button[@data-testid="create_order_btn"]')
        create_order_btn.click()
        time.sleep(1)

        # Fill a form
        phoneInputLabel = driver.find_element(By.ID, "phoneInputLabel")
        phoneInputLabel.send_keys(Keys.NULL) # Set focus
        phoneInputLabel.send_keys(Keys.HOME) # Press key Home
        time.sleep(0.5)
        phoneInputLabel.send_keys('671111111')

        last_name_block = driver.find_element(By.ID, "last_name_block")
        last_name_block.send_keys('Тестувальненков')

        first_name_block = driver.find_element(By.ID, "first_name_block")
        first_name_block.send_keys('Тест')

        # Press button to continue
        save_btn = driver.find_element("xpath", '//button[@data-testid="save_btn"]')
        save_btn.click()

        break

time.sleep(10)
exit()


Цей скрипт на сайті prom.ua знаходить по слову "батарейка" перший товар у назві якого зустрічається "R6" (це такий тип батарейки), додає у кошик і заповнює форму замовлення з телефоном і ім'ям. На цьому робота припиняється, щоб не створювати фейкових замовлень. Цей приклад показує лише деякі механізми, які дозволяють нам імітувати дії користувача у браузері, отримувати дані з сайту та аналізувати їх. З часом дизайн сайту взятого для прикладу може змінитися і скрипт перестане коректно працювати.

Бажаю успіхів.

Web-dev склерозник
Коментарі:
Євгеній говорить:
18.07.2024 18:31
Типова і класична помилка початківця з Селеніумом це ось ті сліпи після кожної дії в очікуванні, що через заданий проміжок часу щось гарантовано має статись. Насправді ж на практиці дуже часто щось іде не так і часто доводиться постійно збільшувати сліпи. Рішення: це той самий implicitly_wait

Більше інформації: https://www.selenium.dev/documentation/webdriver/waits/

andre говорить:
19.07.2024 05:32
Дякую! Я очікував подібний коментар. Приємно, що мене читають тямущі люди. Як ви бачите, я використовую implicitly_wait. Звичайні time.sleep вставив, щоб встигати візуально спостерігати що відбувається.

Євгеній говорить:
26.07.2024 15:17
Ааа, тепер зрозуміло. А то було дивно що і implicitly_wait і просто сліпи теж присутні

Ant говорить:
29.07.2024 20:15
Selenium зручний, але досить застарілий. Зараз для автоматизованого тестування популярніший і зручніший playwright. 
І якщо необхідно зробити якийсь проект, то зручно застосовувати page object model для перевикористання взаємодії з елементами сторінок

Додати коментар
Code
* - обов'язкові поля

Архіви