Как работать с selenium не открывая браузер

Начинаем работать с Selenium в Python

Введение

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

Автоматизация взаимодействия пользователя с веб-браузером часто используется как для тестирования в ходе процесса разработки ( development ), так и на стадии завершении работы над проектом ( production ). Также автоматизация управления веб-браузером может использоваться для извлечения данных из открытых источников сети Интернет для последующего анализа и обработки полученных данных.

То как вы используете технологии автоматизации работы с браузером будет зависит только от вас, просто убедитесь, что то, что вы делаете является законным. Поскольку «боты», созданные с помощью инструментов автоматизации, могут нарушать законные права владельцев контента сайтов или процесс функционирование сайта.

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

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

Что такое Selenium?

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

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

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

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

  • нажатие кнопок;
  • ввод текста;
  • извлечение текста;
  • доступ к данным в cookie файлах;
  • нажатие клавиш.

Подготовка к работе

Прежде чем мы начнем, нам необходимо проделать следующие операции:

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

Основы работы с Selenium

Отлично, теперь мы готовы начать работать с Selenium. Попробуем запустить браузер и перейти по заданному URL:

Запуск этого кода на исполнение откроет Google Chrome и перенаправит его по адресу https://www.google.com . Как видно из листинга кода подключение к веб-странице осуществляется с помощью метода get(URL) объекта driver .

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

Код выше выведет в консоли исходный HTML код всего содержимого нашей страницы, полученного с помощью метода get(URL) . Поэтому если вам в дальнейшем необходимо будет просмотреть содержимое запрашиваемой страницы, то этот прием вам пригодится.

Положение элементов на странице

Как правило, вам совсем не нужно всё содержимое страницы, а лишь только её отдельных частей (HTML элементов). Поэтому вначале необходимо определить местоположение нужного нам HTML элемента на странице, для этого можно использовать инструмент Inspect Element из состава web developer tools браузера Google Chrome.

Для решения нашей задачи, нам необходимо узнать идентификатор тега элемента, над содержимым которого мы хотим затем поработать. И для этого необходимо сделать следующее в обычной сессии Google Chome:

    Щелкните правой кнопкой мыши на элементе

Выберите в контекстном меню «Просмотреть код»

  • В появившемся новом окне вы увидите выделенный HTML код нужного вам элемента, из которого можно получить нужный вам идентификатор. Это может быть значение атрибута класса class или id элемента.
  • Читайте также:  Часы telefunken 1587 инструкция как настроить часы

    Как ещё можно использовать этот инструмент для поиска элементов на странице, вы можете прочитать на официальном сайте.

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

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

    Получение элементов и их содержимого по id

    Если знаете id нужного вам элемента, то его со всем содержимым, а также вложенными элементами, можно легко получить следующим способом:

    Получение элементов по значению атрибута name

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

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

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

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

    Так же вы можете получить элементы страницы по имени тега:

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

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

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

    Для решения подобных задач были разработаны другие способы получения содержимого конкретного элемента на странице, например, с использованием синтаксиса XPath (языка запросов к элементам XML документа). С использованием XPath вы сможете находить элементы на странице более быстрым и эффективным способом:

    Переменная tag_list теперь содержит все элементы страницы с тегом tag у которого задан атрибут attr с установленным значением val :

    Теперь вы можете перебирать итерируемый объект tag_list и обрабатывать по отдельности его элементы, имеющие тип WebElement , описанный в пакете Selenium.

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

    Selenium WebElement

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

    Перечислим основные из них:

    • Доступ к простым свойствам элемента, таким как текст внутри: element.text
    • Доступ к родительским элементам, которые также имеют тип WebElement : element.parent
    • Доступ к атрибутам элементов, таким как href тега a : element.get_attribute(‘href’)
    • Поиск в содержимом элемента (так же, как в глобальном корневом объекте driver )
    • Кликать по нему (нажимать на нем левой кнопкой мыши): element.click()
    • Пользовательский ввод в элемент текстовой информации, если это возможно для его типа: element.send_keys(‘Input Text’)

    Selenium WebDriver

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

    С помощью объекта WebDriver вы можете осуществлять множество операций, а точнее практически проделывать все действия, что может сделать человек с обычным браузером.

    Вот некоторые полезные его полезные возможности:

    • Запуск на странице произвольных JavaScript скриптов: driver.execute_script(«script»)
    • Сохранять скриншоты страницы: driver.save_screenshot(‘image.png’)
    • Включить режим работы браузера в режиме «headless» ( Как работает Headless Chrome ). Таким образом браузер экономит время, исключая этап рендеринга страницы:

    Обратите внимание на то, что в методе set_window_size указывается размер окна браузера, он устанавливается равным (1440, 900) . Это важно для предотвращения ситуаций, связанных с присутствием на странице элементов, которые могут не загружаются в «headless» режиме (загрузка которых зависит от текущего размера окна браузера, а точнее размера экрана устройства).

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

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

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

    Также очень легко получить cookie из текущей сессии браузера:

    Приведенный выше код выведет в консоли содержимое каждого файла cookie из текущей сессии браузера.

    Изменение HTML кода страницы

    Если вам понадобилось изменить свойства определенного HTML элемента страницы, например, добавить или удалить его атрибуты и т. д. То как уже упоминалось ранее, вы можете использовать объект Selenium WebDriver для выполнения произвольного JavaScript кода на загруженной странице. Таким образом с помощью JavaScript можно легко изменять любые свойства элементов страницы:

    Читайте также:  Как отремонтировать крышку термоса zojirushi

    Здесь element — это элемент страницы, полученный любым из описанных выше способов. attr соответственно его атрибут, который нужно изменить (или добавить), а value — его значение.

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

    Допустим вам необходимо загрузить какой-либо файл с веб-сайта. Следующий код поможет это осуществить:

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

    Нажатие клавиш клавиатуры

    Этот код эмулирует нажатие клавиши «стрелка вниз» ( Keys.ARROW_DOWN ) 3 раза. После каждого нажатия action.send_keys(Keys.ARROW_DOWN) программа ожидает небольшой промежуток времени (0.1 сек.).

    Этот прием рекомендуется использовать для того, чтобы убедиться, что в текущем окне браузера зарегистрированы обработчики событий нажимаемых клавиш. Также этот способ применяется для исключения ситуаций, когда команды нажатия клавиш могут «потеряться» в процессе взаимодействия с браузером (например, страница не успела загрузится и соответствующие обработчики событий элементов не были назначены), то есть они просто не будут зарегистрированы и исполнены в последствии.

    Таким образом, объект Keys позволяет эмулировать нажатия любых клавиш вашей клавиатурой. Что позволяет, например, использовать событие Keys.TAB (нажатие клавиши Tab ) для перемещения фокуса между элементами ввода в формах (касается элементов, способных принимать фокус для ввода с клавиатуры). Или эмулировать нажатие клавиш Keys.RETURN и Keys.SPACE , что облегчает взаимодействие с элементами ввода данных, а также имитирует поведение человека.

    Нажатия на кнопки и другие HTML элементы

    Как уже говорилось выше, вы можете использовать эмуляцию событий нажатия клавиши Tab для перемещения между элементами на странице, клавиши Space (пробел) для заполнения checkbox (флажков), а также клавиш со стрелками для перемещения между пунктами выпадающего меню.

    Но более простым является следующий способ реализации взаимодействия с HTML элементами, такими как button или элементами option выпадающего списка значений select . Способ включает в себя выполнение следующих действий: поиск и получение конкретного элемента на странице с помощью объекта webdriver , а затем инициирование клика по нему:

    Ввод данных в элементы ввода форм

    Вы также можете эмулировать нажатия клавиш внутри HTML элементов ввода в формы текстовой информации:

    Таким способом, например, вы можете поместить текстовую информацию в элемент text или textarea .

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

    И так, для эмуляции нажатия сочетаний клавиш передавайте их через параметры метода send_keys .

    Скроллинг

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

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

    Заключение

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

    Соблюдайте законы, если вы осуществляете сбор контента из ресурсов Интернет. Не нарушайте авторские права 😉

    Источник

    Selenium за 60 секунд

    Представляю вам перевод моей статьи на Medium.com.

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

    Проблема

    Как веб-разработчик или инженер по автоматизации тестирования вы можете столкнуться со следующими неудобствами при работе со стандартным Selenium сервером:

    1. Нужно устаналивать несколько разных браузеров себе на компьютер. В обычной жизни вы, как правило, используете один браузер, например, Chrome, но вам приходится устанавливать себе Firefox и Opera, чтобы отлаживать в них Selenium-тесты.
    2. Трудно устанавливать и использовать несколько версий одного браузера. Если вы устанавливаете браузер из пакетов, то вообще можно иметь только одну установленную версию. Кроме того Selenium и его веб-драйверы обычно ищут исполняемый файл браузера по определенному пути. Поэтому, поверьте, использовать несколько версий может быть трудной задачей.
    3. Если вы запускаете браузер, установленный в вашей операционной системе — он забивает место на диске своими временными файлами и содержимым кеша.
    4. Нельзя гарантировать, что настройки браузера всегда останутся в том же состоянии, как после чистой установки. Например, вы можете случайно изменить адрес прокси-сервера или настройки безопасности. Это может привести к падению ранее работавших тестов.
    5. Трудно запускать несколько тестов в разных браузерах параллельно. Попытка сделать это как правило приводит к различным проблемам: окна начинают конкурировать за фокус, не срабатывающие события, не ожидаемые CSS стили и так далее.
    6. Нужно знать какая версия Selenium совместима с какой версией браузера. То же самое верно для исполняемых файлов веб-драйверов (например, Chromedriver).
    Читайте также:  Как настроить фотоловушки филин инструкция

    Приведенный выше список недостатков далеко не полный. Но давайте остановимся на этом и попробуем гораздо более удобный способ отладки Selenium-тестов локально.

    Selenoid

    В моей предыдущей статье (часть I, часть II) я коротко описал новые открытые инструменты для работы с Selenium: Ggr и Selenoid. Ggr в основном нужен для больших Selenium кластеров и не нужен для отладки тестов на вашей машине. Сегодня я более подробно расскажу о Selenoid — альтернативной реализации Selenium хаба, которая запускает браузеры в Docker контейнерах.

    Но почему же запуск браузеров в контейнерах так удобен? И в чем разница между запуском браузеров из контейнеров, поставляемых разработчиками Selenium и Selenoid? — Основная идея Selenoid состоит в том, чтобы запускать новый контейнер для каждой Selenium сессии (т.е. запроса нового браузера) и останавливать их сразу же после закрытия сессии. Такой подход сразу же решает все проблемы связанные с залипанием состояния в кешах и использования одних настроек браузера в разных сессиях. В каждом контейнере находится конкретная версия браузера, правильная версия веб-драйвера или Selenium сервера, поддерживающая этот браузер и все зависимости наподобие шрифтов, графических библиотек и так далее. Более того, контейнеры обеспечивают достаточный уровень изоляции процессов браузеров. Это позволяет запускать неограниченное количество разлиных версий браузеров параллельно и забыть о проблемах с фокусом. Безусловно, эти же проблемы решаются и обычными Selenium контейнерами. Но для того, чтобы получить поведение, аналогичное Selenoid, в дополнение к Docker как правило требуется использовать сложные админские инструменты наподобие Ansible или Salt.

    Установка

    Немного порекламировав Selenoid, настало время показать как просто с ним работать. Для того, чтобы получить работающий Selenium нужно выполнить 3 коротких шага:

    Установить Docker. Обычно это делается при помощи стандартного менеджера пакетов вашей операционной системы такого как APT, Yum или Homebrew. Подробности можно найти в документации Docker.

    Создать каталог для хранения конфигурации Selenoid и сгенерировать конфигурационный файл:

    Последняя команда также скачает образы Docker-контейнеров двух последних версий Firefox, Chrome и Opera и сгенерирует правильный файл конфигурации для Selenoid.

    Все — прошло 60 секунд и Selenoid готов к работе. Не нужно устанавливать Java и скачивать Selenium руками. Просто запустите свои тесты, используя тот же самый URL, что и у обычного Selenium server:

    Мордочка и сбор статистики

    Selenoid может использоваться совместно с Ggr для настройки большого Selenium кластера, поэтому у него нет графического интерфейса наподобие Grid Console в обычном Selenium. Посмотреть потребление браузеров можно двумя способами:

    I. Запустить дополнительный легковесный контейнер с Selenoid UI. Это делается командой:

    Мордочка будет доступна в браузере по адресу http://localhost:8080/ :

    II. Отправлять статистику Selenoid во внешнюю систему: Graphite, InfluxDB, ElasticSearch и так далее. Статистика Selenoid может быть получена по следующему URL:

    Данные отправляются в виде JSON следующего формата:

    Selenoid возвращает сколько контейнеров может быть запущено одновременно (total), сколько запущено в данный момент (used), сколько запросов ожидают в очереди (queued) и сколько контейнеров еще стартуют (pending). Элемент browsers содержит информацию о потреблении браузеров различными пользователями. Имя пользователя извлекается из Basic HTTP headers, если они выставлены или выставляется в unknown, если нет. Хотя вы можете разбирать показанный JSON вручную при помощи скрипта, мы рекомендуем использовать для этой цели Telegraf. Больше информации о том, как использовать Telegraf изложено в этом разделе нашей документации.

    Готовые контейнеры с браузерами

    Согласитесь, круто иметь инструмент, автоматически запускающий контейнеры с разными браузерами. Но еще круче иметь набор готовых контейнеров с разными версиями популярных браузеров. Мы проделали много работы и подготовили образы контейнеров с разными версиями Firefox, Chrome и Opera. Полный список можно посмотреть на selenoid@DockerHub.

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

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

    Наши контейнеры также поддерживают возможность установки произвольно разрешения экрана (по-умолчанию 1920x1080x24 ). Чтобы выставить разрешение просто передайте capability screenResolution :

    Заключение

    В этой статье я рассказал как эффективно управлять различными браузерами при помощи Selenoid. Поверьте — работа с Selenium может быть комфортной. Если вам интересны вопросы построения эффективной инфраструктуры тестирования, вы можете взглянуть на другие открытые инструменты в нашей организации на Github или подпишитесь на наш Твиттер @aerokube.

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

    Источник

    Оцените статью