Быстро и просто разворачиваем приложение на Selenium Python в Docker
На примере показываю, как развернуть программу или целое приложение на Python, использующее selenium chomedriver, в Docker.
Selenium — это инструмент, созданный для автоматизации работы браузера. Он имеет довольно длинную историю, но несмотря на это на данный момент он является главным инструментом, если нужно прибегнуть к автоматизации браузера. Важно отметить, что здесь я расскажу только про chromedriver (но большинство программ пишется именно с его использованием).
Но у некоторых может возникнуть проблема с развертыванием кода, использующего этот инструмент, на сервере. На самом деле, все очень просто, если вы знакомы с Docker.
Наше приложение
В качестве примера мы будем использовать несложный, но практичный скрипт, который, кстати, я использовал в одном из своих заказов на фрилансе:
import time import os from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By def test_fullpage_screenshot(url: str, filename: str): options = Options() options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--disable-dev-shm-usage') options.add_argument('--headless') options.add_argument('--start-maximized') service = Service(executable_path="./chromedriver") driver = webdriver.Chrome(service=service, options=options) try: driver.get(url) time.sleep(2) ele = driver.find_element(By.TAG_NAME, 'body') height = driver.execute_script("return document.body.scrollHeight") driver.set_window_size(1920, height) if not os.path.exists("screenshots"): os.mkdir("screenshots") driver.save_screenshot(f"screenshots/") except Exception: pass finally: driver.close() driver.quit() if __name__ == "__main__": test_fullpage_screenshot("https://tproger.ru", "tproger.png") test_fullpage_screenshot("https://stackoverflow.com", "stackoverflow.png")
Это немного упрощенная версия скрипта, который я реально использовал в заказе, но главное, что он выполняет свою задачу. Этот код делает полный скриншот запрошенной веб-страницы. Мы можем запустить этот код на своей машине, учитывая, что cromedriver (если запускать на Linux) находится в правильной папке.
Кстати говоря, таким же способом можно делать скриншоты определенных элементов (просто находим нужный элемент и записываем в переменную ele).
Развертывание на сервере
Так, приложение готово, теперь мы хотим его запустить на сервере. Есть довольно большое количество способов сделать это, перечислю, пожалуй, самые часто используемые из них:
- systemd
- supervisorctl
- docker
И эти способы, казалось бы, подразумевают установку Chrome, а этот процесс может сопровождаться различными трудностями. Первые два способа означают, что это нужно делать вручную; docker делает это согласно указаниям в Dockerfile. Но этот процесс можно упростить настолько, что о нем даже не нужно будет задумываться (не зря же в DockerHub так много образов).
Помимо трех файлов также имеется пустая папка screenshots, где будут сделанные скриншоты.
Давайте взглянем на Dockerfile:
FROM joyzoursky/python-chromedriver:3.8 WORKDIR /src COPY requirements.txt /src RUN pip install -r requirements.txt COPY . /src CMD ["python", "main.py"]
Самая главная (и замечательная) часть здесь — это образ, на основе которого мы будем создавать контейнер. В нем уже установлен python (поддерживается большое количество версий интерпретатора), chromedriver и Chrome актуальной на текущий момент версии.
Дальше все относительно несложно: делаем директорию src рабочей, копируем все необходимые файлы для работы программы, устанавливаем нужные зависимости и запускам скрипт.
Уверен, вы заметили две операции COPY. И здесь логичен вопрос: «А почему нельзя сразу скопировать все файлы в контейнер?» На самом деле, можно, но эта тема для отдельной статьи. Так что подписывайтесь на мой профиль и ждите новые статьи!
Но это еще не все: теперь мы можем сократить наш код. Вот что в итоге получается:
import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By def test_fullpage_screenshot(url: str, filename: str): options = Options() options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--disable-dev-shm-usage') options.add_argument('--headless') options.add_argument('--start-maximized') driver = webdriver.Chrome(options=options) try: driver.get(url) time.sleep(2) ele = driver.find_element(By.TAG_NAME, 'body') height = driver.execute_script("return document.body.scrollHeight") driver.set_window_size(1920, height) driver.save_screenshot(f"screenshots/") except Exception: pass finally: driver.close() driver.quit() if __name__ == "__main__": test_fullpage_screenshot("https://tproger.ru", "tproger.png") test_fullpage_screenshot("https://stackoverflow.com", "stackoverflow.png")
Еще один приятный бонус: теперь не нужно использовать Service для указания пути к chromedriver, так как driver автоматически заглядывает в системные файлы установленного Chrome (а он установлен в нашем контейнере) и ищет все, что ему нужно.
Осталось ввести правильные команды для запуска контейнера. А они выглядят следующим образом:
docker build -t full_screenshot . docker run -d -v $(pwd)/screenshots:/src/screenshots --name test full_screenshot
Сначала создаем образ, а затем создаем и запускаем контейнер в фоновом режиме. Важно связать папку на хосте с папкой в контейнере, чтобы можно было посмотреть скриншоты (посредством флага -v), так что не упустите этот момент.
Selenium автоматизация браузера в Python | Изучаем Selenium
Selenium — это бесплатная и открытая библиотека для автоматизированного тестирования веб-приложений. Я предполагаю Если вы посетили этот сайт, скорее всего, вы хотя бы слышали и имеете представление о Selenium.
Что такое Selenium?
Библиотека первоначально была создана в 2004 году Джейсоном Хаггинсом, к которому впоследствии присоединились другие его коллеги из компании ThoughtWorks. Selenium поддерживает все основные браузеры, и тесты могут быть записаны на многих языках программирования, а также работать на платформах Windows, Linux и Macintosh.
Selenium 2 объединяется с другим тестовым фреймворком WebDriver (именно поэтому вы видите ‘seleniumwebdriver‘) во главе с Саймоном Стюартом в Google. Сегодня Саймон работает в FaceBook. Selenium 2.0 был выпущен в июле 2011 года.
Язык программирования для Selenium
Тесты могут быть написаны в нескольких языках программирования, таких как Java, C#, Python, JavaScript и Ruby. Весьма часто можно услышать высказывание типа «Это Java, поэтому мы также будем писать тесты на Java.» Это не совсем правильно. Тестирование программного обеспечения заключается в том, соответствует ли работа программиста требованиям заказчика. В некотором смысле, тестеры представляют самих клиентов. Тестеры должны иметь больший вес при определении тестового синтаксиса, чем программисты. Плюс, зачем вам требовать, чтобы у ваших тестировщиков был один и тот же язык программирования?
Сценарные языки программирования, такие как Ruby и Python больше подходят для тестовых скриптов, чем компилируемые языки, такие как C# и Java.
Все примеры на этом сайте написаны в Selenium, в связке с Python. Это не означает, что этот материал предназначен только для тестеров / разработчиков, которые знают Python. В нижеприведенных примерах можно увидеть, что использование Selenium в различных языках программирования очень похоже. Как только вы овладеете одним, вы сможете применять его к другим довольно легко. Взгляните на простой тестовый сценарий Selenium в пяти разных языковых привязках: Java, C#, JavaScript, Ruby и Python.
Selenium + Java
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class GoogleSearch < public static void main(String[] args) < // Создаем новый экземпляр драйвера устройства html // Обратите внимание, что остальная часть кода зависит от интерфейса, не реализации. WebDriver driver = new FirefoxDriver(); // И теперь используем это, чтобы посетить Google. driver.get("http://www.google.com"); // Найти элемент ввода текста по его имени. WebElement element = driver.findElement(By.name("q")); // Введите что-нибудь для поиска. element.sendKeys("Hello Selenium WebDriver!"); // Нажимаем кнопку отправки. element.submit(); // Проверяем заголовок страницы. System.out.println("Page title is: " + driver.getTitle()); >>
Selenium + C#
using System; using OpenQA.Selenium; using OpenQA.Selenium.Firefox; using OpenQA.Selenium.Support.UI; class GoogleSearch < static void Main() < // Создаем новый экземпляр драйвера Firefox IWebDriver driver = new FirefoxDriver(); // И теперь используем это, чтобы посетить Google. driver.Navigate().GoToUrl("http://www.google.com"); // Найти элемент ввода текста по его имени. IWebElement query = driver.FindElement(By.Name("q")); // Введите что-нибудь для поиска. query.SendKeys("Hello Selenium WebDriver!"); query.Submit(); Console.WriteLine(driver.Title); >>
Javascript + Selenium
var webdriver = require('selenium-webdriver'); var driver = new webdriver.Builder() .forBrowser('chrome') .build(); driver.get('http://www.google.com/ncr'); driver.findElement(webdriver.By.name('q')).sendKeys('webdriver'); driver.findElement(webdriver.By.name('btnG')).click(); driver.wait(webdriver.until.titleIs('webdriver - Google Search'), 1000); console.log(driver.title);
Ruby + Selenium
require "selenium-webdriver" driver = Selenium::WebDriver.for :firefox driver.navigate.to "http://www.google.com" element = driver.find_element(:name, 'q') element.send_keys "Hello Selenium WebDriver!" element.submit puts driver.title
Python + Selenium
from selenium import webdriver driver = webdriver.Firefox() driver.get("http://www.google.com") elem = driver.find_element_by_name("q") elem.send_keys("Hello WebDriver!") elem.submit() print(driver.title)
Последние статьи
Отправка писем из Python используя модуль smtplib
Selenium
Selenium — это набор программ с открытым исходным кодом, которые применяют для тестирования веб-приложений и администрирования сайтов локально и в сети. Программы Selenium позволяют автоматизировать действия браузера. Среди программ проекта:
- Selenium IDE — плагин для браузера Firefoх для записи действий пользователя.
- Selenium RC — устаревшая библиотека для управления браузерами.
- Selenium WebDriver — библиотека для управления браузерами.
- Selenium Grid — кластер Selenium-серверов для управления браузерами на разных компьютерах в сети.
- Selenium Server — сервер для управления браузером удаленно по сети.

Selenium IDE
Selenium IDE — плагин для браузера Firefoх для записи действий пользователя (тестировщика) и их воспроизведения для тестирования. Является библиотекой Selenium с графическим интерфейсом и возможностями для работы со сценариями тестирования веб-страниц. IDE генерирует код для Selenium RC или Selenium WebDriver, который повторяет записанные действия пользователей.
Профессия / 16 месяцев
Тестировщик-автоматизатор
Лучший выбор для быстрого старта в IT

Selenium RC
Selenium RC (Remote Control) — предыдущий основной продукт Selenium до появления WebDriver в 2007 году. Программа, называемая также Selenium 1.0, являлась средством удаленного управления браузером, но по функциональности сильно уступала WebDriver (Selenium 2.0). Selenium RC продолжает поставляться в дистрибутиве WebDriver, но продукт не развивается — при необходимости сложных тестов вне ограничений первой версии пользователям предлагают воспользоваться второй.
Selenium WebDriver
Selenium WebDriver — библиотека для управления браузерами, основной продукт комплекта Selenium. Представляет из себя семейство драйверов для разных браузеров (Firefox, Edge, Google Chrome/Chromium, Internet Explorer, Safari, Opera) и набор клиентских библиотек на разных языках программирования для работы с драйверами. WebDriver поддерживает работу с языками Java, .Net (C#), Python, Ruby, JavaScript.
WebDriver напрямую отправляет команды браузеру, используя его API и получает результаты тестирования. В предыдущей версии Selenium RC принцип работы был другим — программа внедряла код на языке JavaScript в браузер для управления им. WebDriver же использует способ взаимодействия с браузером, максимально близкий к действиям обычного пользователя.
Selenium Grid
Selenium Grid — кластер из нескольких Selenium-серверов, которые позволяют управлять браузером удаленно по сети. Grid позволяет организовать сеть, в которой можно запускать большое количество браузеров на большом количестве компьютеров. Параллельное тестирование позволяет тестировщикам экономить время.

Станьте тестировщиком – это лучший выбор для быстрого старта в IT
Преимущества Selenium
Selenium — бесплатный продукт с открытым исходным кодом для тестирования с поддержкой всех основных языков программирования. Его можно использовать на разных браузерах в разных операционных системах, включая мобильные устройства.
Selenium WebDriver — гибкий инструмент тестирования, который можно легко интегрировать с разными тестовыми фреймворками и другими инструментами тестирования. Это позволяет расширить инструментарий тестировщика и применять его для узких задач, например web crawling и тестирования производительности.
Selenium разрабатывают с 2004 года, и за это время он стал самым популярным инструментом функционального тестирования веб-приложений. Его используют в крупных корпорациях, включая Google.
Недостатки Selenium
В программах Selenium можно тестировать только веб-приложения, функций тестирования сетевых и десктопных приложений в комплекте нет. Также для работы с Selenium нужно владеть продвинутыми навыками программирования и написания скриптов. Новички в тестировании могут пользоваться более простыми аналогами Selenium, например Katalon Studio или UFT.
Тестировщик-автоматизатор
Как ворваться в IT, даже если вы не умеете программировать? Стать тестировщиком. Для старта достаточно базовых знаний ПК. А начать работать можно уже через 4 месяца обучения.

Статьи по теме:
Selenium для Python. Глава 1. Установка
Представляю перевод неофициальной документации Selenium для Python.
Перевод сделан с разрешения автора Baiju Muthukadan.
Оригинал можно найти здесь.
Предисловие от автора статьи
Selenium WebDriver – это программная библиотека для управления браузерами. WebDriver представляет собой драйверы для различных браузеров и клиентские библиотеки на разных языках программирования, предназначенные для управления этими драйверами.
По сути своей использование такого веб-драйвера сводится к созданию бота, выполняющего всю ручную работу с браузером автоматизированно.
Библиотеки WebDriver доступны на языках Java, .Net (C#), Python, Ruby, JavaScript, драйверы реализованы для браузеров Firefox, InternetExplorer, Safari, Andriod, iOS (а также Chrome и Opera).
Сфера применения
Чаще всего Selenium WebDriver используется для тестирования функционала веб-сайтов/веб-ориентированных приложений. Автоматизированное тестирование удобно, потому что позволяет многократно запускать повторяющиеся тесты. Регрессионное тестирование, то есть, проверка, что старый код не перестал работать правильно после внесения новых изменений, является типичным примером, когда необходима автоматизация. WebDriver предоставляет все необходимые методы, обеспечивает высокую скорость теста и гарантирует корректность проверки (поскольку человеский фактор исключен). В официальной документации Selenium приводятся следующие плюсы автоматизированного тестирования веб-приложений:
- возможность проводить чаще регрессионное тестирование;
- быстрое предоставление разработчикам отчета о состоянии продукта;
- получение потенциально бесконечного числа прогонов тестов;
- обеспечение поддержки Agile и экстремальным методам разработки;
- сохранение строгой документации тестов;
- обнаружение ошибок, которые были пропущены на стадии ручного тестирования.
Также одной из незаменимых особенностей Selenium WebDriver является ожидание загрузки страницы. Сюда можно отнести случаи, когда парсинг данных на странице невозможен из-за страниц перенаправления или ожидания, содержащих примерно такой текст: «Подождите, страница загружается». Такие страницы, само собой разумеется, не является целью парсинга, однако обойти их часто не представляется возможным. Естественно, без Selenium WebDriver. Selenium WebDriver позволяет в таких случаях «ожидать», как ожидал бы человек, пока на странице, к примеру, не появится элемент с необходимым именем.
Еще один плюс Selenium заключен в том, что действия веб-драйвера видимы визуально и требуют минимального времени нахождения на странице, это позволяет с удобством демонстрировать функционал сайта, когда необходима презентация сервиса.
Некоторые проблемы WebDriver (из сети и личного опыта):
- бывает, что поведение отличается в разных браузерах;
- иногда возникают сложности с поиском элементов (XPath и другие методы иногда просто не работают, хотя должны);
- необъяснимые падения драйвера прямо посреди теста;
- взаимодействие возможно только с первой вкладкой браузера, драйвер позволяет открывать новые вкладки и новые окна, но не позволяет в них работать;
- необходимо четко продумывать архитектуру теста, часто использовать assert или ожидания, чтобы тест умел «думать», когда делать и когда нет.
1. Установка
1.1. Введение
Привязка Selenium к Python предоставляет собой простой API [Интерфейс программирования приложений (англ. Application Programming Interface) — Прим. пер.] для написания тестов функциональности/тестов соответствия требованиям с использованием веб-драйвера Selenium WebDriver. С помощью Selenium Python API вы можете интуитивно просто получить доступ ко всему функционалу Selenium WebDriver.
Привязка Python-Selenium предоставляет удобный API для доступа к таким веб-драйверам Selenium как Firefox, Ie, Chrome, Remote и других. На данный момент поддерживаются версии Python 2.7, 3.2, 3.3 и 3.4.
В данной документации рассмотрен Selenium 2 WebDriver API. Selenium 1 / Selenium RC API в ней не охвачены.
1.2. Загрузка Selenium для Python
Вы можете загрузить привязку Selenium к Python со страницы пакета selenium на PyPI. Однако, лучшим способом будет использование модуля pip. Python 3.4 содержит pip в стандартной библиотеке. Используя pip, вы можете установить selenium следующей командой:
pip install selenium
Для создания изолированной среды Python вы можете использовать virtualenv. Также библиотека Python 3.4 содержит модуль pyvenv, который практически аналогичен virtualenv.
1.3. Подробная инструкция для пользователей Windows
Примечание
Для данной инсталляции вам необходим доступ к сети Интернет.
1. Установите Python 3.4 через файл MSI, доступный на странице загрузок сайта python.org.
2. Запустите командную строку через программу cmd.exe и запустите команду pip установки selenium, как показано ниже.
C:\Python34\Scripts\pip.exe install selenium
Теперь вы можете запускать свои тестовые скрипты, используя Python. К примеру, если вы создали скрипт на основе Selenium и сохранили его в C:\my_selenium_script.py, то вы можете запустить его следующей командой:
C:\Python34\python.exe C:\my_selenium_script.py
1.4. Загрузка Selenium server
Примечание
Selenium server необходим в случаях, когда вы хотите использовать remote WebDriver [удаленный — Прим. пер.]. За дополнительной информацией обращайтесь к разделу Использование Selenium с remote WebDriver. Если вы только начинаете изучать Selenium, вы можете пропустить этот раздел и продолжить изучение со следующей главы.
Selenium server написан на языке Java. Для его запуска рекомендована среда Java Runtime Environment (JRE) версии 1.6 или выше.
Вы можете скачать Selenium server 2.x на странице загрузок сайта selenium. Имя файла должно выглядеть примерно таким образом: selenium-server-standalone-2.x.x.jar. Вы всегда можете загрузить последнюю версию Selenium server 2.x.
Если Java Runtime Environment (JRE) не установлена в вашей системе, вы можете скачать JRE с сайта Oracle. Если вы используете системы GNU/Linux и имеете права root [права администратора — Прим. пер.], вы так же можете установить JRE, используя инструкции вашей системы.
Если команда java доступна в PATH (переменная окружения), вы можете запустить Selenium server используя следующую команду:
java -jar selenium-server-standalone-2.x.x.jar
Замените 2.x.x актуальной версией Selenium server, скачанной вами с сайта.
Если JRE установлена под пользователем, не обладающим правами root и/или если она недоступна в переменной окружения PATH, вы можете ввести относительный или полный путь до файла java. Аналогично, вы можете дополнить имя jar-файла Selenium server до относительного или полного пути. После этого команда будет выглядеть так:
/путь/до/java -jar /путь/до/selenium-server-standalone-2.x.x.jar
