Тема 2 из 6

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

Selenium управляет настоящим браузером из кода: открывает страницы, нажимает кнопки, заполняет формы и читает результат. Так автоматизируют рутину и тестируют сайты. В отличие от requests и BeautifulSoup, Selenium видит страницу так же, как человек, — вместе со всем, что нарисовал JavaScript.

В курсе вы соберёте автозаполнение формы: найти поля, ввести данные, дождаться ответа сайта и проверить результат.

Подготовка

Нужен установленный Google Chrome. Драйвер для управления им Selenium скачает сам при первом запуске (это может занять минуту).

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

driver = webdriver.Chrome()            # откроется окно Chrome
try:
    driver.get("https://example.com")
    print(driver.title)
    print(driver.find_element(By.TAG_NAME, "h1").text)
finally:
    driver.quit()                      # закрыть браузер в любом случае

Без окна (быстрее, удобно на сервере): options = webdriver.ChromeOptions(); options.add_argument("--headless=new"); webdriver.Chrome(options=options).

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

driver.find_element(By.ID, "login")                 # первый элемент или исключение NoSuchElementException
driver.find_elements(By.CSS_SELECTOR, "article h2") # список, может быть пустым
driver.find_element(By.NAME, "email")
driver.find_element(By.XPATH, "//button[text()='Войти']")

Способы поиска (By): ID, NAME, CLASS_NAME, TAG_NAME, CSS_SELECTOR, XPATH, LINK_TEXT. Чаще всего хватает CSS-селекторов — тех же, что в CSS и BeautifulSoup:

Селектор Что найдёт
#main элемент с id="main"
.title элементы с классом title
article h2 h2 где-то внутри article
nav > a a прямо внутри nav
input[name=email] input с атрибутом name="email"

Искать можно и внутри найденного элемента: row.find_elements(By.TAG_NAME, "td").

Что можно узнать об элементе

  • .text — видимый текст;
  • .get_attribute("href") — значение атрибута (у ссылок — полный адрес);
  • .is_displayed(), .is_enabled(), .is_selected() — виден ли, активен ли, отмечен ли;
  • .tag_name.

Как проверяются задачи

Проверка запускает Chrome без окна и открывает маленькую страницу прямо из программы (адрес data:text/html,… — без интернета). «Запустить у себя» открывает видимое окно браузера, чтобы вы видели, как программа работает.

Итог

  • webdriver.Chrome(), get, quit в finally;
  • find_element (один, или исключение) и find_elements (список);
  • By.CSS_SELECTOR и другие способы поиска; поиск внутри элемента;
  • .text, .get_attribute(...).