Вступление
Автоматизация веб – браузеров набирает популярность, и появилось много фреймворков/инструментов, предлагающих разработчикам услуги автоматизации.
Автоматизация веб-браузера часто используется для тестирования в среде разработки и производства, хотя она также часто используется для веб-очистки данных из открытых источников, анализа и обработки данных.
На самом деле, то, что вы делаете с автоматизацией, зависит только от вас, просто убедитесь, что то, что вы делаете, законно, так как “боты”, созданные с помощью инструментов автоматизации, часто могут нарушать законы или условия обслуживания сайта.
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-это один из широко используемых инструментов автоматизации веб-браузеров, который предлагает множество функций и возможностей по сравнению с браузером, управляемым человеком.
Он в основном используется для тестирования/автоматизации производственной или интеграционной среды, хотя также может использоваться в качестве веб-скребка для исследовательских целей и т. Д. Обязательно соблюдайте все законы, когда вы практикуете веб-скребок публичного контента, чтобы не нарушать никаких законов.