Рубрики
Без рубрики

Начало работы с Selenium и Python

Автор оригинала: Ely Shaffir.

Вступление

Автоматизация веб – браузеров набирает популярность, и появилось много фреймворков/инструментов, предлагающих разработчикам услуги автоматизации.

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

На самом деле, то, что вы делаете с автоматизацией, зависит только от вас, просто убедитесь, что то, что вы делаете, законно, так как “боты”, созданные с помощью инструментов автоматизации, часто могут нарушать законы или условия обслуживания сайта.

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

Он поддерживает множество языков, таких как C#, Java, Perl, PHP и Ruby, хотя ради этого урока мы будем использовать его с Python в Windows.

Что такое Селен?

Selenium-это отличный инструмент, который позволяет разработчикам имитировать конечных пользователей всего несколькими строками кода. Используя инструменты, которые он предлагает, очень легко использовать веб-страницы и имитировать человека, хотя на самом деле трудно воспроизвести человеческое поведение.

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

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

Некоторые из наиболее популярных задач, выполняемых с помощью Selenium, включают, но не ограничиваются ими:

  • Щелчок по кнопкам
  • Ввод текста
  • Извлечение текста
  • Доступ к файлам Cookie
  • Нажатие клавиш

Предпосылки

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

  • Установите Google Chrome на свой компьютер – мы будем имитировать пользователя в Google Chrome, хотя вы могли бы имитировать и другие браузеры, но для этой статьи я буду использовать Google Chrome.
  • Получить chromedriver.exe , потому что для того, чтобы действительно имитировать браузер, вам понадобится путь к этому исполняемому файлу на вашем компьютере.
  • Установите пакет selenium с помощью pip install selenium в командной строке.

Основы

Хорошо, теперь мы все готовы начать работать с Селеном. Первое, что вам нужно сделать, это запустить браузер:

from selenium import webdriver

EXE_PATH = r'path\to\chromedriver.exe'
driver = webdriver.Chrome(executable_path=EXE_PATH)
driver.get('https://google.com')

Запустив его, вы откроете Google Chrome и перейдете к https://google.com .

Здесь важно отметить, что подключение к веб-странице осуществляется с помощью функции get(URL) объекта driver .

Как вы могли заметить, driver является объектом Selenium WebDriver , вы используете его для программного доступа к браузеру, например:

print(driver.page_source)

Приведенный выше код выводит исходный HTML – код всей страницы. Если вам нужно собрать данные, это очень полезно.

Локализующие Элементы

Обычно вам нужно не содержимое всей страницы, а конкретные элементы.

Для этого вам сначала нужно определить свою цель на странице, и для этого вы можете использовать инструмент Inspect Element в Google Chrome.

Это означает, что если вам нужно содержимое определенного элемента на странице, то для получения идентификатора тегов вы можете сделать следующее (в обычном сеансе Google Chome):

  • Щелкните правой кнопкой мыши на элементе
  • Выберите “Проверить”
  • А в новом окне вы можете взглянуть на HTML элемента, и идентификатор будет после id= .

Получив нужные нам элементы, мы можем выполнять над ними различные виды операций.

Получение элементов по идентификатору

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

element = driver.find_element_by_id('element_id')

Получение элементов по имени

Аналогично предыдущему подходу:

element = driver.find_element_by_name('element_name')

Получение элементов по классам

И снова аналогично предыдущему подходу:

element = driver.find_element_by_class_name('element_class_name')

Получение элементов по тегу HTML

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

links = driver.find_elements_by_tag_name('a')

В этом случае links заполняется всеми тегами a , которые теперь содержат каждую ссылку на странице. Это может быть полезно для целей обхода веб-страниц.

Получение элементов с помощью XPath

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

tag_list = driver.find_elements_by_xpath("//tag[@attr='val']")

tag_list теперь содержит каждый тег , который имеет и атрибут attr установлен в val :

Foo

Теперь вы можете перебирать tag_list и взаимодействовать с каждым Selenium WebElement в нем.

Вы можете прочитать больше о системе XPath в Selenium здесь .

Selenium WebElement

Selenium WebElement практически представляет собой HTML-элемент. Вы можете выполнять операции с этими элементами аналогично тому, как вы делали бы это в качестве конечного пользователя.

Эти операции включают в себя:

  • Доступ к простым свойствам элемента, таким как текст внутри ( element.text )
  • Доступ к родительским элементам, которые также имеют тип WebElement ( element.parent )
  • Доступ к определенным атрибутам, таким как href тега a ( element.get_attribute('href') )
  • Поиск внутри него (так же, как вы бы искали в драйвере )
  • Щелчок по нему ( element.click() )
  • Ввод текста, если это возможно ( element.send_keys('Input Text') )

Selenium WebDriver

WebDriver похож на WebElement , однако основное отличие заключается в их области применения. Область действия последнего-это сам элемент, тогда как область действия первого-вся страница.

Вы также можете делать много вещей с объектом Selenium WebDriver , практически все, что вы могли бы сделать как человек с обычным браузером.

Некоторые другие очень полезные вещи:

  • Выполнение JavaScript: driver.execute_script("script")
  • Сохранение скриншота: driver.save_screenshot('image.png')
  • Запуск в “безголовом режиме”, где браузер экономит время, не отображая страницу:
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
driver = webdriver.Chrome(executable_path=EXE_PATH, chrome_options=options)
driver.set_window_size(1440, 900)

Обратите внимание, что размер окна установлен на (1440, 900) , это делается для того, чтобы предотвратить всевозможные ошибки, связанные с тем, что некоторые элементы не загружаются должным образом из-за безголового режима.

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

Навигация по странице

Доступ к файлам Cookie

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

ck = {'some_attr': 'foo', 'some_other_attr': 'bar'}
driver.add_cookie(ck)

Это добавляет файл cookie в браузер, который может быть полезен, например, если вам нужно добавить файлы cookie аутентификации или предпочтений. Важно убедиться, что файл cookie находится в формате dict .

Кроме того, очень легко получить файлы cookie из браузера:

cookies = driver.get_cookies()
for ck in cookies:
    print(ck)

Приведенный выше код печатает каждый файл cookie в браузере.

Изменение HTML-кода

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

Как уже упоминалось ранее, вы можете использовать Selenium WebDriver для выполнения JavaScript, и изменение свойств элементов просто так очень легко сделать с помощью JavaScript:

driver.execute_script("arguments[0].setAttribute('attr','value')", element)

Здесь element – это элемент, который нужно изменить, attr – это атрибут, который нужно изменить, а value – это новое значение.

Загрузка файлов с помощью ссылок для скачивания

Иногда вам может понадобиться загрузить файл с веб-сайта:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("prefs", {
    "download.default_directory": r"path\to\directory",
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "safebrowsing.enabled": True
})

driver = webdriver.Chrome(executable_path=EXE_PATH, chrome_options=options)

Вы можете указать путь к месту сохранения , определив download.default_directory , например path\to\directory .

Нажатие Клавиш

import time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

action = ActionChains(driver)
for _ in range(3):
    action.send_keys(Keys.ARROW_DOWN)
    time.sleep(.1)
action.perform()

Этот код нажимает стрелку вниз ( Клавиши.ARROW_DOWN ) 3 раза. После каждого действия.send_keys(Keys.ARROW_DOWN) программа немного подождет. Это рекомендуется для того, чтобы убедиться, что все ключи зарегистрированы.

Если мы просто запустим несколько команд, они могут потеряться в процессе и фактически не будут регистрироваться.

Keys содержит все клавиши на клавиатуре, что означает, что вы также можете использовать этот метод для tab ( Keys.TAB ) между элементами на странице, облегчающими взаимодействие с ней ( Клавиши.ВЕРНИТЕ и Ключи.ПРОСТРАНСТВО также очень важно).

Щелчок по кнопкам

Обратите внимание, что вы можете использовать нажатия клавиш для перемещения между элементами страницы, например, вы можете использовать вкладки и пробелы для заполнения флажков, а также использовать клавиши со стрелками для перемещения между пунктами выпадающего меню.

Конечно, более естественным способом выбора флажков и выпадающих элементов было бы просто получить элемент с помощью драйвера и щелкнуть по нему:

checkbox = driver.find_element_by_id('checkbox')
checkbox.click()

Ввод форм

Вы также можете имитировать нажатия клавиш внутри самих элементов:

element.send_keys(Keys.CONTROL, 'a')
element.send_keys(value)

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

Кстати, этот код использует комбинацию клавиш (CTRL + A) для выделения всего текста внутри элемента. Следующая строка заменяет выделенный текст введенным значением .

Чтобы зарегистрировать сочетания клавиш, передайте все нужные клавиши в параметрах в send_keys .

Прокрутка

Иногда части страницы загружаются только после прокрутки вниз (например, лента Instagram или любая другая страница с бесконечной прокруткой). Это можно легко сделать, выполнив простой JavaScript-скрипт:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

Приведенный выше код использует команду JavaScript для прокрутки вниз страницы, теперь вы можете снова использовать driver.page_source и получить новый контент.

Вывод

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

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