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

Как Запустить Тесты Selenium В Docker ?

Автоматизированное тестирование и непрерывная интеграция (CI) являются неотъемлемыми частями закона о разработке и тестировании… Помечено как java, селен, докер, тестирование.

Автоматизированное тестирование и непрерывная интеграция (CI) являются неотъемлемыми частями деятельности по разработке и тестированию. Автоматизация тестирования Selenium – один из таких подходов, который помогает в комплексном тестировании веб-продукта. Не столь предпочтительный способ выполнения тестов с использованием Selenium framework включает установку необходимого веб-браузера и соответствующих драйверов браузера. В этом блоге мы подробно рассмотрим, как запускать тесты Selenium в Docker, чтобы ускорить автоматизацию тестирования Selenium.

Введение в Docker

Когда дело доходит до тестирования автоматизации Selenium, важно, чтобы запуск теста в одной среде выполнения не мешал выполнению тестов, выполняемых в другой среде (средах) тестирования. Следовательно, тесты автоматизации должны выполняться изолированно, и Docker помогает реализовать это “важное” требование.

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

Что такое Докер?

Docker – это платформа контейнеризации с открытым исходным кодом, которая позволяет легко создавать, развертывать и запускать приложения безопасным способом с использованием контейнеров. Docker обеспечивает виртуализацию на уровне операционной системы (ОС). Все программные части в Docker организованы в контейнеры.

По умолчанию докеры обладают самыми мощными возможностями изоляции, а приложения работают безопасно и надежно в соответствующих контейнерах. Кроме того, Docker запускается как отдельный процесс на главной машине. Наряду с гибкостью запуска Docker на локальных компьютерах под управлением Windows, Mac или Linux, его также можно запускать в облачной инфраструктуре, такой как AWS, Azure и т. Д.

Изображения докеров

По сути, образ Docker содержит все, что требуется для запуска приложения в качестве контейнера. Изображение докера включает в себя следующее:

  • Код
  • Библиотеки
  • Переменные времени выполнения
  • Системные инструменты
  • Настройки
  • Файлы конфигурации
  • Переменные среды и больше

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

Контейнеры в докере

Контейнер в Docker – это отдельное программное обеспечение, которое упаковывает код и все необходимые зависимости, чтобы приложение могло работать быстрее и надежнее из одной вычислительной среды в другую.

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

Установленные контейнеры Docker также можно использовать совместно с разными пользователями, чтобы они могли быстро приступить к фактической работе с использованием образа контейнера. Контейнерное программное обеспечение, доступное для приложений на базе Windows и Linux, не зависит от базовой инфраструктуры. Многие бессерверные фреймворки с открытым исходным кодом также используют преимущества контейнерной технологии Docker.

Контейнер Против. Виртуальные машины

Контейнеризацию часто сравнивают с виртуальными машинами, но между ними есть явная разница.

Docker работает в операционной системе хоста (например, Windows, Linux и т. Д.), А контейнеры Docker содержат зависимости, такие как библиотеки, файлы конфигурации и т. Д. Это также включает в себя само приложение. Контейнеры Docker имеют малый вес, так как они не содержат никакой гостевой операционной системы. Ниже показан контейнер Docker, состоящий из концентратора Selenium и узлов Firefox и Chrome.

С другой стороны, виртуальные машины имеют собственную гостевую операционную систему и управляют гипервизором, который в первую очередь отвечает за запуск виртуальных машин. В Docker также есть серверная часть Hyper-V, но для повышения производительности рекомендуется использовать WSL (подсистема Windows для Linux). Поскольку виртуальные машины имеют собственную гостевую ОС, размер виртуальной машины намного больше, и для ее запуска требуется больше ресурсов.

Как установить и настроить докер в Windows

Перед запуском тестов Selenium в контейнерах Docker нам необходимо установить и настроить Docker в Windows. Обязательным шагом для запуска теста Selenium в контейнере Docker является установка Docker на хост-компьютере. В нашем случае мы будем устанавливать Docker на компьютер с Windows. Во–первых, вы должны загрузить Docker Рабочий стол для Windows – версию сообщества Docker для Microsoft Windows.

Рабочий стол Docker для Windows 10 – это встроенное приложение для Windows, которое предоставляет простую в использовании среду разработки для создания, запуска и доставки приложений с докеризацией. Он поддерживает контейнеры как на базе Linux, так и на базе Windows. В нашей демонстрации мы будем использовать контейнеры на базе Linux.

Двойной щелчок по “Докеру для установщика Windows” запускает программу установки. Установка довольно проста.

Для Docker для Windows требуется поддержка WSL 2 (подсистема Windows для Linux). Выберите необходимые параметры для включения функций Hyper-V Windows и установки необходимых компонентов Windows для WSL 2.

После успешной установки вы получите следующее сообщение.

Общие проблемы и решения при установке Docker в Windows 10

Перед запуском тестов Selenium в контейнерах Docker вы можете столкнуться с некоторыми проблемами, связанными с включением Hyper-V и защитой выполнения данных в BIOS при запуске Docker.

  • Hyper-V и защита выполнения данных

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

В зависимости от конфигурации компьютера вы можете выполнить любую из двух команд на терминале (от имени администратора), чтобы включить поддержку Hyper-V и защиту выполнения данных на главном компьютере:

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
bcdedit /set hypervisorlaunchtype auto

Перезагрузите систему, чтобы применить изменения. В некоторых случаях вам потребуется включить Hyper-V из “Функции Windows”. Чтобы сделать то же самое, перейдите в раздел “Панель управления” 🡪 “Программы и компоненты” 🡪 “Включение или выключение функций Windows” и включите элементы – Hyper-V и платформу гипервизора Windows.

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

  • WSL 2 не установлен

Хотя мы включили Hyper-V на главной машине, рекомендуется использовать WSL 2 с докером вместо Hyper-V. WSL 2 обеспечивает более высокую производительность, чем серверная часть Hyper-V. В случае, если вы включили поддержку WSL 2 в настройках Docker, но WSL 2 не установлен на компьютере, вы увидите сообщение об ошибке “WSL 2 не установлен”.

Включите опцию “Подсистема Windows для Linux” в разделе “Функции Windows” в разделе “Управление”.

Как указано в руководстве по установке WSL для Windows 10, сначала мы должны включить подсистему Windows для Linux. Это можно сделать, выполнив следующую команду на терминале (от имени администратора):

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

Перед установкой WSL 2 вам может потребоваться функция виртуальной машины (это необязательный шаг).

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

Загрузите Пакет обновления ядра Linux WSL 2 для машины x64 и установите его на хост-машину. Установите WSL 2 в качестве версии по умолчанию с помощью команды:

wsl --set-default-version 2

Перезагрузите компьютер, чтобы изменения вступили в силу. Таким образом, вы все готовы использовать рабочий стол Docker с бэкэндом WSL 2. В настройках рабочего стола Docker включите опцию “Использовать движок на основе WSL 2”, чтобы вместо серверной части Hyper-V. Используется WSL 2.

Запустите команду docker –версия, чтобы проверить, установлен ли Docker и запущен ли экземпляр:

Зачем использовать Selenium с Docker для тестирования веб-приложений

В этом руководстве о том, как запускать тесты Selenium в Docker, мы рассмотрим некоторые из основных преимуществ, которые делают Selenium с Docker идеальной комбинацией для тестирования веб-приложений:

  • Масштабируемый и надежный

При обычной настройке сетки Selenium конфигурация включает размещение нескольких виртуальных машин (виртуальных машин) в качестве “Узлов” и подключение “Узлов” к одному “Концентратору”.’ При настройке сетки Selenium вам необходимо загрузить jar сервера Selenium (с Selenium 3) и запустить его на компьютере, используемом для настройки сетки. Кроме того, браузеры и соответствующие драйверы браузеров должны быть доступны на виртуальных машинах (или машинах), которые действуют как узлы Selenium.

Этот подход не является ни масштабируемым, ни надежным, поскольку инфраструктура потребует постоянного обслуживания и усовершенствования, чтобы гарантировать, что ее можно использовать с точки зрения тестирования. Кроме того, запуск Selenium Grid увеличивает ненужные вычислительные издержки.

Изображения докеров, используемые для кроссбраузерного тестирования с Selenium, содержат несколько узлов в одном изображении. Кроме того, образы Docker совместно используют определенные системные ресурсы, что приводит к меньшему использованию ресурсов по сравнению с виртуальными машинами.

  • Тестирование локально размещенных сайтов

Контейнеры Docker имеют возможность доступа к локальным сайтам разработки. Если вы используете Windows или Linux, использование опции –хост при запуске контейнеров Docker помогает в тестировании локально размещенных сайтов.

  • Меньшие накладные расходы на установку

При использовании Selenium с Docker нет необходимости устанавливать необходимые браузеры и драйверы браузеров на хост-компьютере. В целом, значительно быстрее начать работу с Selenium web автоматизированное тестирование с использованием готовых контейнеров Docker, чем установка и настройка сетки Selenium. Вы можете назвать это “минимальной установкой и максимальными преимуществами”!

Ряд образов Docker (с Selenium) на концентраторе Docker можно использовать, выполнив несколько команд на терминале. Некоторые из этих изображений в Docker Hub были разработаны и поддерживаются штаб-квартирой Selenium.

Вот широкая категория изображений, доступных в Docker Hub и используемых для тестирования веб-автоматизации:

  1. Автономный: Автономные изображения (Chrome, Firefox и т.д.) это можно запустить на сервере Selenium. Эти образы должны запускаться на разных портах (например, 4444, 4445 и т.д.), Иначе это приведет к конфликтам портов.
  2. Концентратор: Роль, которую играет концентратор Selenium с докером, такая же, как и у обычной сетки Selenium. В терминах Docker концентратор – это облачный сервис, который позволяет создавать изображения и тестировать их.
  3. Узел: Подобно узлам в терминологии Selenium, контейнеры узлов можно запускать вместе с изображением концентратора. Например, контейнеры узлов Firefox и Chrome можно запускать с изображением концентратора Selenium.

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

  • Улучшенная безопасность

Docker безопасен и переносим, а контейнеры Docker работают в изолированной среде. Тесты Selenium могут выполняться гораздо более безопасным способом с помощью контейнера Docker по сравнению с локальной сеткой Selenium.

Для улучшения масштабируемости тесты Selenium в Docker могут быть:

  • Меньшие шансы на расхождения

Установленный контейнер Docker можно использовать совместно с другими пользователями, и поведение остается неизменным независимо от базовой среды. Например, тесты, проводимые в контейнере Windows, будут без проблем работать в контейнере на базе Linux.

Следовательно, вся команда

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

  • Больше никаких забот о сбоях селена

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

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

  • Докер с Селеном 4

Selenium 4 , который все еще находится на стадии альфа-тестирования, привлек значительное внимание как сообщества Selenium, так и пользователей. Помимо значительных улучшений, таких как протокол WebDriver W3C, внедрение относительных локаторов, улучшенная сетка Selenium и полезная среда разработки Selenium, Selenium 4 поставляется с поддержкой докеров.

Образы докеров для Selenium 4 GridServer позволяют запускать автономный контейнер с помощью Chrome/Firefox/Opera. Для настройки и настройки концентратора и узлов Selenium 4 предоставляет несколько способов запуска образов Docker и создания сети концентраторов и узлов.

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

Создание селенового теста в докере

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

Существуют различные способы выполнения тестов Selenium с использованием контейнера Selenium Docker. Selenium может быть запущен в автономном (или одном) контейнере Docker или в сетке, состоящей из нескольких контейнеров.

Сценарии тестирования

Те же сценарии тестирования используются для демонстрации автоматизации тестирования Selenium с помощью Docker. Тесты выполняются параллельно на уровне “Методы”.

Тестовая группа – 1 [Тестовая группа – “Поиск”]

Тестовый сценарий – 1 (Браузер: Chrome)

  1. Зайдите в Google.
  2. Найдите “Лямбда-тест”.
  3. Нажмите на первый результат теста.
  4. Подтвердите, если заголовок страницы не соответствует ожидаемому заголовку.

Тестовый сценарий – 2 (Браузер: Chrome)

  1. Иди в Бинг.
  2. Найдите “Блог лямбда-теста”.
  3. Нажмите на первый результат теста.
  4. Подтвердите, если заголовок страницы не соответствует ожидаемому заголовку.

Тестовая группа – 2 [Тестовая группа – “Задача”]

Тестовый сценарий – 1 (Браузер: Firefox)

  1. Перейти к https://lambdatest.github.io/sample-todo-app/
  2. Отметьте первые два пункта (li1 и li2) как выполненные.
  3. Добавьте новый пункт “Счастливого тестирования на лямбда-тесте” в список задач.
  4. Подтвердите, если новый элемент не добавлен в список.

Тестовый сценарий – 2 (Браузер: Firefox)

  1. Перейти к https://lambdatest.github.io/sample-todo-app/
  2. Отметьте первые три элемента (li1, li2 и li3) как выполненные

При выполнении тестов с помощью Selenium Docker у вас есть следующие опции:

  • Используйте один (или автономный) контейнер для запуска кроссбраузерных тестов.
  • Используйте сетку контейнеров для запуска кроссбраузерных тестов.
  • Используйте Zalenium – масштабируемую и гибкую сетку Selenium на основе контейнеров, которая предоставляет такие функции, как запись видео, предварительный просмотр в реальном времени, панель мониторинга и многое другое. Вы можете использовать предложения Selenium для выполнения тестов Selenium в облачной сетке Selenium, предоставляемой Lambda Test .

Мы рассмотрим каждый из этих подходов более подробно в последующих разделах.

Запуск Селена в отдельном контейнере

В этом руководстве “как запускать тесты Selenium в Docker” мы используем один контейнер для запуска всех тестов. Чтобы начать, мы должны сначала извлечь необходимые изображения из Docker Hub . Поскольку мы хотим выполнить тесты в браузерах Chrome и Firefox, мы загружаем изображения контейнеров Chrome и Firefox.

Выполните следующие команды в терминале (командная строка или PowerShell) от имени администратора:

Автономный Хром докер вытащит селен / автономный-хром
Автономный Firefox докер вытащит селен / автономный-firefox

Выполнение команд docker pull для автономного-chrome и автономного-firefox загружает последнюю версию изображений контейнеров Chrome и Firefox.

Автономный Chrome (Последняя версия)

docker pull selenium/standalone-chrome

Автономный Firefox (Последняя версия)

docker pull selenium/standalone-firefox

Вы также можете загрузить определенную версию изображения контейнера, перейдя в Docker Hub и выполнив поиск нужного изображения. Например, команда docker pull selenium/standalone-chrome:87.0 загрузит версию 87.0 контейнера Chrome.

Как только изображения будут загружены, запустите команду docker images, чтобы проверить, была ли загрузка успешной. Как показано ниже, мы видим, что для использования доступны последние версии контейнеров Chrome и Firefox:

Порт по умолчанию, который подключается к WebDriver, равен 4444, а контейнеры Chrome и Firefox будут доступны через порт 4444. Поскольку мы хотим запустить тесты Selenium в браузерах Chrome и Firefox, мы используем порт 4445 для контейнера Chrome и 4446 для контейнера Firefox.

Запустите контейнер, указанный на номере порта 4445 для подключения к веб-драйверу Chrome:

docker run -d -p 4445:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome

Запустите контейнер, указанный на номере порта 4446 для подключения к веб-драйверу Firefox:

docker run -d -p 4446:4444 -v /dev/shm:/dev/shm selenium/standalone-firefox

Как видно на скриншоте ниже, контейнеры докеров Chrome и Firefox успешно запущены:

Выполнение команды docker ps в Windows PowerShell показывает, что контейнеры Docker Chrome и Firefox готовы к использованию:

Теперь нам нужно настроить URL-адрес Remotewebdriver:

Хромированный Контейнер

public static String remote_url_chrome = "http://localhost:4445/wd/hub";
ChromeOptions options = new ChromeOptions();
driver.set(new RemoteWebDriver(new URL(remote_url_chrome), options));

Контейнер Firefox

public static String remote_url_firefox = "http://localhost:4446/wd/hub";
FirefoxOptions options = new FirefoxOptions();
driver.set(new RemoteWebDriver(new URL(remote_url_firefox), options));

Теперь, когда мы коснулись основ запуска отдельных контейнеров Docker для Chrome и Firefox, давайте рассмотрим полную реализацию.

Реализация

package org.testnggroup;

import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.safari.SafariOptions;

public class Helper {
    protected static ThreadLocal driver = new ThreadLocal<>();
    public static String remote_url_chrome = "http://localhost:4445/wd/hub";
    public static String remote_url_firefox = "http://localhost:4446/wd/hub";

    public void setupThread(String browserName) throws MalformedURLException
    {
        if(browserName.equalsIgnoreCase("chrome"))
        {
            System.out.println("Inside Chrome");
            ChromeOptions options = new ChromeOptions();
            driver.set(new RemoteWebDriver(new URL(remote_url_chrome), options));
        }
        else if (browserName.equalsIgnoreCase("firefox"))
        {
            System.out.println("Inside Firefox");
            FirefoxOptions options = new FirefoxOptions();
            driver.set(new RemoteWebDriver(new URL(remote_url_firefox), options));
        }
    }

    public WebDriver getDriver()
    {
        return driver.get();
    }

    public void tearDownDriver()
    {
        getDriver().quit();
    }
}

На основе параметра “окружающая среда”, переданного из testng.xml , тест выполняется либо в браузере Chrome, либо в браузере Firefox.

Поскольку контейнер Chrome включен http://localhost:4445/wd/hub , экземпляр RemoteWebDriver с удаленным URL-адресом, установленным в контейнер Chrome , используется для запуска тестов в Chrome.

public static String remote_url_chrome = "http://localhost:4445/wd/hub";

public void setupThread(String browserName) throws MalformedURLException
{
   if(browserName.equalsIgnoreCase("chrome"))
   {
      ChromeOptions options = new ChromeOptions();
      driver.set(new RemoteWebDriver(new URL(remote_url_chrome), options));
   }
   ......................
   ......................
}

Поскольку контейнер Firefox включен http://localhost:4446/wd/hub ,

public static String remote_url_chrome = "http://localhost:4445/wd/hub";

public void setupThread(String browserName) throws MalformedURLException
{
   ......................
   ......................

   else if (browserName.equalsIgnoreCase("firefox"))
   {
      FirefoxOptions options = new FirefoxOptions();
      driver.set(new RemoteWebDriver(new URL(remote_url_firefox), options));
   }
package org.testnggroup;

import org.openqa.selenium.*;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Assert;
import org.testng.IExecutionListener;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import java.io.Console;
import java.net.MalformedURLException;
import java.net.URL;

public class TestNG_SearchGroup extends Helper implements IExecutionListener
{
    public static String status = "passed";

    @Override
    public void onExecutionStart()
    {
        System.out.println("onExecutionStart");
    }

    @Test(priority = 1, groups = {"Search"})
    @Parameters({"environment"})
    public void test_GoogleSearch(String environment) throws InterruptedException, MalformedURLException
    {
        String search_string =" LambdaTest";
        String exp_title = "Most Powerful Cross Browser Testing Tool Online | LambdaTest";

        if (environment.equalsIgnoreCase("local"))
        {
            setupThread("chrome");
        }
        WebDriver webdriver = getDriver();
        webdriver.navigate().to("https://www.google.com");
        webdriver.manage().window().maximize();
        System.out.println("Started session");

        try {
            /* Enter the search term in the Google Search Box */
            WebElement search_box = webdriver.findElement(By.xpath("//input[@name='q']"));
            search_box.sendKeys(search_string);

            search_box.submit();
            Thread.sleep(3000);

            /* Click on the first result which will open up the LambdaTest homepage */
            WebElement lt_link = webdriver.findElement(By.xpath("//span[.='LambdaTest: Most Powerful Cross Browser Testing Tool Online']"));
            lt_link.click();
            Thread.sleep(5000);

            String curr_window_title = webdriver.getTitle();
            Assert.assertEquals(curr_window_title, exp_title);
            status = "passed";
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        if (getDriver() != null)
        {
            tearDownDriver();
        }
    }

    @Test(priority = 2, groups = {"Search"})
    @Parameters({"environment"})
    public void test_BingSearch(String environment) throws InterruptedException, MalformedURLException {
        String search_string ="LambdaTest Blog";
        String exp_title = "LambdaTest | A Cross Browser Testing Blog";

        if (environment.equalsIgnoreCase("local"))
        {
            setupThread("Chrome");
        }
        WebDriver webdriver = getDriver();
        webdriver.navigate().to("https://www.bing.com");
        webdriver.manage().window().maximize();
        System.out.println("Started session");

        try {
            /* Enter the search term in the Google Search Box */
            WebElement search_box = webdriver.findElement(By.xpath("//input[@id='sb_form_q']"));
            search_box.sendKeys(search_string + Keys.ENTER);
            Thread.sleep(3000);

            /* Click on the first result which will open up the LambdaTest homepage */
            WebElement lt_link = webdriver.findElement(By.xpath("//a[.='LambdaTest | A Cross Browser Testing Blog']"));
            lt_link.click();
            Thread.sleep(5000);

            String curr_window_title = webdriver.getTitle();
            Assert.assertEquals(curr_window_title, exp_title);
            status = "passed";
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        if (getDriver() != null)
        {
            tearDownDriver();
        }
    }

    @Override
    public void onExecutionFinish()
    {
        System.out.println("onExecutionFinish");
    }
}
package org.testnggroup;

import org.openqa.selenium.*;
import org.testng.IExecutionListener;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import java.net.MalformedURLException;

public class TestNG_ToDoGroup extends Helper implements IExecutionListener {
    public static String status = "passed";

    @Override
    public void onExecutionStart()
    {
        System.out.println("onExecutionStart");
    }

    @Test(priority = 1, groups = {"ToDo"})
    @Parameters({"environment"})
    public void test_Selenium4_ToDoApp_Test1(String environment) throws InterruptedException, MalformedURLException
    {
        if (environment.equalsIgnoreCase("local"))
        {
            setupThread("Firefox");
        }
        WebDriver webdriver = getDriver();
        webdriver.navigate().to("https://lambdatest.github.io/sample-todo-app/");
        webdriver.manage().window().maximize();
        System.out.println("Started session");
        Thread.sleep(5000);

        try
        {
            /* Let's mark done first two items in the list. */
            webdriver.findElement(By.name("li1")).click();
            webdriver.findElement(By.name("li2")).click();

            /* Let's add an item in the list. */
            webdriver.findElement(By.id("sampletodotext")).sendKeys("Happy Testing at LambdaTest");
            webdriver.findElement(By.id("addbutton")).click();

            /* Let's check that the item we added is added in the list. */
            String enteredText = webdriver.findElement(By.xpath("/html/body/div/div/div/ul/li[6]/span")).getText();
            if (enteredText.equals("Happy Testing at LambdaTest")) {
                System.out.println("Demonstration is complete");
                status = "passed";
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
        if (getDriver() != null)
        {
            tearDownDriver();
        }
    }

    @Test(priority = 2, groups = {"ToDo"})
    @Parameters({"environment"})
    public void test_Selenium4_ToDoApp_Test2(String environment) throws InterruptedException, MalformedURLException {
        if (environment.equalsIgnoreCase("local"))
        {
            setupThread("Firefox");
        }
        WebDriver webdriver = getDriver();
        webdriver.navigate().to("https://lambdatest.github.io/sample-todo-app/");
        webdriver.manage().window().maximize();
        System.out.println("Started session");
        Thread.sleep(5000);

        try
        {
            /* Let's mark done first three items in the list. */
            webdriver.findElement(By.name("li1")).click();
            webdriver.findElement(By.name("li2")).click();
            webdriver.findElement(By.name("li3")).click();
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
        status = "passed";
        if (getDriver() != null)
        {
            tearDownDriver();
        }
    }

    @Override
    public void onExecutionFinish()
    {
        System.out.println("onExecutionFinish");
    }
}




    
    
    
        
            
                
            
        
        
            
        
    

    
    
    
        
            
                
            
        
        
            
        
    

Исполнение

Таким образом, мы все готовы к проведению тестов в соответствующих контейнерах. Как видно на скриншоте контейнера, два экземпляра браузера Chrome (или драйвера Chrome) были созданы в контейнере Chrome Docker (работает на порту номер 4445).

Аналогичным образом, два экземпляра браузера Firefox (или GeckoDriver) были созданы в контейнере докера Firefox (работает на порту номер 4446).

Тесты выполняются безголовым способом, так как мы не установили образы Docker, в которых не предустановлен VNC. Как показано ниже, тесты выполнены успешно:

Чтобы просмотреть, что происходит внутри контейнера, нам нужно будет загрузить standalone-chrome-debug и автономный-firefox-отладка изображения, в которых предустановлен VNC. Основным недостатком выполнения тестов в автономном контейнере является низкая масштабируемость. Следовательно, запуск Selenium в автономном (или одиночном) контейнере подходит только для небольших проектов.

Запуск Селена в сетке контейнеров

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

При таком подходе вы можете получить несколько экземпляров разных браузеров (и версий браузеров). Например, у вас может быть “X экземпляров Chrome v83.0”, “y” экземпляров Chrome v76.0, “Z” экземпляров Firefox 68.0 и так далее. Тесты могут выполняться параллельно с различными версиями различных браузеров.

Этот подход использует модель “Концентратор/узел” сетки Selenium. Тестовые запросы отправляются клиентом (или тестовым кодом) в концентратор, который затем отправляет тестовые запросы на узлы, которые лучше всего подходят для выполнения тестов.

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

По умолчанию отладочные образы запускают сервер VNC с номером порта 5900. Однако порт по умолчанию может быть переназначен на любой внешний порт, который в данный момент не используется.

Извлеките необходимые изображения докера

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

Селеновый концентратор докер тянет селен/концентратор
Хромированный узел докер вытащит селен/узел-хром-отладка
Узел Firefox докер вытащит селен/узел-firefox-отладка

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

Запустите команду docker images, чтобы убедиться, что все изображения успешно извлечены.

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

  • Запустите команду docker run для запуска и запуска контейнеров по одному.
  • Используйте docker-compose (или Compose) для определения и запуска многоконтейнерных приложений Docker и настройки служб приложений.

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

В docker-compose (или Compose) вы используете файл YAML для настройки служб приложений. С помощью одной команды вы можете гибко создавать и запускать все службы из конфигурации. Другим преимуществом использования Compose является то, что он работает в различных средах, таких как промежуточные, производственные, рабочие процессы разработки, тестирования и CI.

Как использовать Docker run для запуска контейнеров Docker

Здесь мы используем команду docker run для запуска загруженного образа Selenium. Как только концентратор запущен, мы подключаем узлы Chrome и Firefox к концентратору, чтобы на них можно было выполнять тесты веб-автоматизации Selenium.

Вот синтаксис команды запуска docker:

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

Команда docker run должна в обязательном порядке указывать изображение для получения контейнера. Давайте воспользуемся командой docker run, чтобы запустить концентратор и подключить к нему узлы.

Запуск концентратора Selenium

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

docker run -d -P -p "4444:4444" --name selenium-hub selenium/hub

Здесь мы говорим докеру выполнить контейнер с изображением под названием “селен/концентратор”. Изображение помечено как “selenium-концентратор”, который действует как идентификатор изображения.

Чтобы предоставить доступ к порту, мы используем следующий формат:

[ip]:host_port:container_port

Поле [ip] используется для определения источников, и по умолчанию оно равно 0.0.0.0 (если ip не определен). Опция –опубликовать список (или –p) публикует порт контейнера на хосте. Опция –опубликовать-все (или –P) публикует все открытые порты в случайных портах.

Здесь host_port 4444 (первое появление в 4444:4444) доступен для внешнего мира. Вы можете отслеживать состояние сетки, запущенной на указанном порту, перейдя по URL-адресу: http://localhost:4444/grid/console .

Мы проверяем, запущен ли контейнер Selenium Hub, выполнив команду docker ps –a на терминале.

Подключение браузера к концентратору Selenium

Флаг –link принимает следующую форму:

--link :alias

Где “имя” – это имя контейнера, который необходимо связать, а “псевдоним” – это псевдоним имени ссылки.

Теперь, когда концентратор Selenium запущен и запущен, мы запускаем узлы Chrome и Firefox, выполнив следующие команды на терминале:

Chrome (Отладка) Узел

docker run -d -P -p 5900:5900 --link selenium-hub:hub selenium/node-chrome-debug

Firefox (Отладка) Узел

docker run -d -P -p 5901:5900 --link selenium-hub:hub selenium/node-firefox-debug

В нашем случае selenium-концентратор (–ссылка selenium-концентратор : концентратор ) – это контейнер, на который мы ссылаемся, а концентратор – псевдоним контейнера ( -ссылка selenium-концентратор: концентратор ).

После выполнения вышеуказанных команд изображения узлов Chrome и Firefox будут подключены (или связаны) к контейнеру с именем selenium-hub. Мы проверяем, запущены ли контейнеры браузера или нет, используя команду docker ps –a.

Чтобы проверить, запущен ли концентратор Selenium (или сервер) и подключены ли узлы Chrome и Firefox к концентратору, выполните команду docker logs <Идентификатор контейнера концентратора Selenium>.

С другой стороны, URL-адрес http://localhost:4444/grid/console покажет состояние концентратора Selenium и узлов, подключенных к концентратору. В случае, если вы используете контейнер Selenium Hub на другом порту, пожалуйста, используйте этот номер порта вместо 4444 в URL-адресе.

Как запускать тесты с сеткой Selenium с помощью Docker Compose

Ручной запуск команды docker run для запуска тестов Selenium в Docker идеально подходит в сценариях, когда требуется выполнить меньшее количество тестов на образе концентратора. Чем больше количество комбинаций браузера (и соответствующей версии), тем сложнее управлять командами запуска docker.

Настроить сетку с помощью docker-compose (или Compose) относительно просто, так как сетка представляет собой композицию из нескольких изображений docker. Использование Compose – это трехэтапный процесс:

  1. Определите среду приложения с помощью файла Dockerfile, чтобы его можно было воспроизвести в любом месте.
  2. Определите необходимые службы, составляющие приложение, в файле YAML (например, docker-compose.yml), чтобы его можно было запускать в изолированной среде.
  3. Запустите команду docker-compose –f .\ up –d, чтобы compose запускал и запускал полное приложение.

Вот файл Compose (docker-compose.yml) для запуска соответствующих тестовых сценариев в браузерах Chrome и Firefox.

version: "3.9"
services:

  hub:
    image: selenium/hub
    ports:
      - "4444:4444"

    environment:
      GRID_MAX_SESSION: 16
      GRID_BROWSER_TIMEOUT: 3000
      GRID_TIMEOUT: 3000

  chrome:
    image: selenium/node-chrome-debug
    container_name: web-chrome
    depends_on:
      - hub
    environment:
      HUB_PORT_4444_TCP_ADDR: hub
      HUB_PORT_4444_TCP_PORT: 4444
      NODE_MAX_SESSION: 4
      NODE_MAX_INSTANCES: 4
    volumes:
      - /dev/shm:/dev/shm
    ports:
      - "5900:5900"
    links:
      - hub

  firefox:
    image: selenium/node-firefox-debug
    container_name: web-firefox
    depends_on:
      - hub
    environment:
      HUB_PORT_4444_TCP_ADDR: hub
      HUB_PORT_4444_TCP_PORT: 4444
      NODE_MAX_SESSION: 2
      NODE_MAX_INSTANCES: 2
    volumes:
      - /dev/shm:/dev/shm
    ports:
      - "5901:5900"
    links:
      - hub

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

  • версия – Последняя версия докера-создание файлов.
  • услуги (или контейнеры) – Этот раздел содержит список используемых изображений и их конфигурации (например, максимальное количество экземпляров, имена контейнеров, порт хоста и порт контейнера и т.д.).
  • изображение – Изображение, используемое для запуска контейнера. Selenium Hub запускается с изображением контейнера selenium/hub. Контейнер с именем web-chrome запускается с помощью изображения selenium/node-chrome-debug. Аналогично, контейнер с именем web-firefox запускается с использованием изображения selenium/node-firefox-debug.
  • порты – Порты, опубликованные в формате <Хост:Контейнер>.
  • тома – Путь к хосту подключается к службе в формате <Хост:Контейнер>.
  • depends_on – Это указывает порядок зависимостей контейнеров. В нашем случае изображения Firefox и Chrome следует запускать только после запуска концентратора. Следовательно, значение depends_on для контейнеров selenium/node-chrome-debug и selenium/node-firefox-debug равно hub (т.Е. контейнер selenium/hub).
  • ссылки – Контейнер, к которому необходимо подключиться. Это похоже на флаги, используемые в команде –link, которая обсуждалась ранее.
  • среда – Они состоят из переменных среды, используемых в изображениях контейнеров. Переменная среды HUB_PORT_4444_TCP_PORT указывает номер порта контейнера, предоставляемого концентратором (который равен 4444).
  • NODE_MAX_INSTANCES – Это указывает максимальное количество экземпляров браузера, которые могут быть созданы в любой данный момент. Мы установили максимальное количество экземпляров узла (chrome-debug и firefox-debug) равным двум, что означает, что не более двух экземпляров Chrome и двух экземпляров firefox могут выполняться параллельно.
  • NODE_MAX_SESSION – Эта переменная среды указывает, сколько браузеров (любой браузер и версия) могут работать параллельно. Например, если значение NODE_MAX_INSTANCES равно 4, а значение NODE_MAX_SESSION равно 2, вы можете запустить узел Chrome (или узел Firefox) с 4 экземплярами Chrome (или Firefox) при максимальном уровне распараллеливания 2 (как указано в NODE_MAX_SESSION).

Файл docker-compose YML (docker-compose.yml) при выполнении команды запускает контейнер-концентратор (selenium/концентратор) и две службы узлов – selenium/node-chrome-debug и selenium/node-firefox-debug. Имена контейнеров (или псевдонимы) служб узлов – web-chrome и web-firefox соответственно. Мы запускаем концентратор и узлы, запустив следующую команду на терминале:

docker-compose -f /path/to/docker-compose.yml up -d

Опция –d (или –отсоединить) в docker-compose up запускает контейнеры в фоновом режиме и печатает имена контейнеров. Эта опция полезна в тех случаях, когда вы хотите запустить контейнеры в фоновом режиме и оставить их запущенными, тем самым избавляя от необходимости запускать файл docker-compose каждый раз, когда вы хотите запустить контейнеры.

Мы используем команду docker ps -a, чтобы проверить, запущен ли контейнер Selenium Hub и узлы Chrome и Firefox:

Поскольку контейнер Selenium Hub начинается с порта 4444, мы используем тот же URL-адрес http://localhost:4444/grid/console для проверки состояния концентратора и подключенных к нему узлов.

Реализация

Реализация для запуска тестов в Selenium Grid с использованием Docker Compose аналогична реализации, продемонстрированной в разделе “Запуск Selenium в автономном контейнере”. Единственное отличие состоит в том, что тесты теперь будут выполняться в контейнере Docker, содержащем отладочные версии образов Chrome и Firefox.

Сетка настроена для запуска на порту 4444, и тестовые запросы выполняются в соответствующем докере (Chrome/Firefox) на основе желаемого браузера для теста. Следовательно, изменение связано только с Helper.java где удаленный URL-адрес имеет значение http://localhost:4444/wd/hub .

package org.testnggroup;

import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.safari.SafariOptions;

public class Helper {
    protected static ThreadLocal driver = new ThreadLocal<>();
    public static String remote_url = "http://localhost:4444/wd/hub";

    public void setupThread(String browserName) throws MalformedURLException
    {
        if(browserName.equalsIgnoreCase("chrome"))
        {
            ChromeOptions options = new ChromeOptions();
            driver.set(new RemoteWebDriver(new URL(remote_url), options));
        }
        else if (browserName.equalsIgnoreCase("firefox"))
        {
            FirefoxOptions options = new FirefoxOptions();
            driver.set(new RemoteWebDriver(new URL(remote_url), options));
        }
    }

    public WebDriver getDriver()
    {
        return driver.get();
    }

    public void tearDownDriver()
    {
        getDriver().quit();
    }
}

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

Исполнение

Как показано выше, вы можете запускать тесты с помощью команды Docker run или Docker Compose (docker-compose), которая, в свою очередь, запускает необходимые контейнеры. В обоих случаях:

  • Контейнер–концентратор Селена – Он вращается в порту 4444 (как показано в 4444: 4444). Тайм-аут браузера и тайм-аут сетки установлены на 3000 секунд. В любой момент времени концентратор может обрабатывать 16 одновременных сеансов (или тестов).
  • Контейнеры узлов – selenium/node-chrome-debug и контейнеры selenium/node-firefox-debug развернуты на портах 5900 и 5901 соответственно. Эти порты видны внешнему миру, и их можно использовать для отслеживания состояния тестов с помощью средства просмотра VNC (или клиента VNC).

Как видно из моментального снимка выполнения, тесты успешно выполняются в сетке Selenium. Два экземпляра Chrome (а также Firefox) выделены серым цветом (или отключены), что указывает на то, что тесты для запуска в Chrome (и Firefox) выполнялись параллельно.

Поскольку параллельный атрибут в testng.xml установлено значение Методы, все методы с аннотацией @test выполняются параллельно.

Отладка контейнера Docker с помощью средства просмотра RealVNC

Основным преимуществом использования отладочного варианта узла или автономных образов является то, что в этих образах предварительно установлен сервер VNC. По умолчанию сервер VNC в отладочных образах запускается с порта 5900. Следовательно, изображения можно использовать для отладки тестов, выполняемых в соответствующих контейнерах.

В целом, это помогает вам понять, что происходит внутри контейнеров Docker.

Скачать RealVNC Зритель

Первым шагом является загрузка real-vnc (или VNC Viewer) для установки на хост-компьютере. В нашем случае основной операционной системой является Windows 10, поэтому мы загрузили VNC Viewer для Windows .

Извлеките отладочные изображения узлов

Нам нужны отладочные изображения соответствующих узлов (т.е. селен/узел-chrome-отладка и селен/узел-firefox-отладка ).

В рамках демонстрации в разделе Запуск Selenium в сетке контейнеров мы уже вытащили варианты отладки узлов Chrome и Firefox. Как только отладочные изображения узлов будут извлечены, вам необходимо запустить контейнер Docker с изображением. Мы запустили контейнер Docker в демонстрации в разделе “Как запускать тесты с сеткой Selenium с помощью Docker Compose”.

Мы проверяем, успешно ли запустились концентратор и узлы, запустив команду docker ps -a на терминале:

Как видно на скриншоте команды, номера портов соответствующих узлов приведены ниже:

селен/узел-хром-отладка 5900
селен/узел-firefox-отладка 5901

Чтобы увидеть, что происходит на соответствующих узлах, используя средство просмотра RealVNC, сервер VNC должен быть настроен на следующее:

селен/узел-хром-отладка 5900 0.0.0:5900 (или локальный хост:5900)
селен/узел-firefox-отладка 5901 0.0.0:5901 (или локальный хост:5901)

Следующим шагом является настройка соответствующих значений сервера VNC в реальном средстве просмотра VNC, установленном на хост-компьютере.

Запуск средства просмотра VNC для мониторинга тестов

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

  1. Получите порт, к которому подключен сервер VNC, выполнив приведенную ниже команду:
docker port  5900

В нашем случае идентификатор узла web-chrome равен 7ee5a430ff46. Порт 5900 можно получить, выполнив любую из команд:

docker port 7ee5a430ff46 5900
docker port 7ee5a430ff46 5900
  1. В режиме реального просмотра VNC создайте новое соединение, перейдя к файлу 🡪 Создайте новое соединение.
  2. Создайте два соединения с настройками, показанными ранее, для мониторинга тестов, выполняемых на узлах – selenium/node-chrome-debug и selenium/node-firefox-debug.
  1. Откройте соединения, которые мы создали на шаге(2).
  2. При запросе пароля введите пароль как секретный. Нажмите “Запомнить пароль”, чтобы вам не приходилось вводить пароль каждый раз, когда вы открываете соединение.
  1. Теперь, когда контейнер Selenium WebDriver и сервер VNC запущены, вы можете увидеть тесты, выполняемые в соответствующих браузерах на сервере VNC.

Сервер VNC полезен для отладки и проверки того, что происходит внутри контейнера. Основным требованием является использование вариантов отладки соответствующих образов, поскольку в них предварительно установлен сервер VNC.

Запуск тестов Selenium на лямбда-тесте с помощью Docker

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

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

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

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

Основные характеристики селена

Решение на основе docker-selenium может использоваться для выполнения тестов в собственной сетке Selenium, а также для перенаправления тестов в облачную сетку Selenium, предлагаемую LambdaTest.

Вот основные функции, предлагаемые Selenium:

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

Как использовать лямбда-тест с Selenium Docker

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

Вот необходимые условия для использования Lambda Test docker:

  1. Убедитесь, что у вас готова настройка Selenium docker. Для настройки докера Zalenium извлеките следующие изображения – Докер-Селен (elgalu/селен) и Залениум (досел/залениум). Выполните следующие команды на терминале (от имени администратора):
docker pull elgalu/selenium

docker pull dosel/zalenium
  1. Вот скриншоты загрузки следующих изображений:
  1. Вам нужна рабочая (или действительная) учетная запись для лямбда-теста. Пожалуйста, запишите имя пользователя и ключ доступа со страницы профиля Лямбда-теста .
  2. Настройте необходимые переменные среды (LT_USERNAME и LT_ACCESS_KEY), выполнив следующие команды в Cygwin (в Windows):
export LT_USERNAME=

export LT_ACCESS_KEY=

Вот скриншот выполнения при запуске на Cygwin:

  1. Теперь, когда мы загрузили необходимые образы докеров, следующим шагом будет указание переменных среды лямбда-теста в докере Zalenium.

При использовании Selenium Docker с сеткой Selenium для лямбда-теста у вас есть возможность использовать туннель для лямбда-теста. Для настройки лямбда-тестового туннеля загрузите UnderPass и установите его на локальном компьютере. Начинайте туннель с подземного перехода , как показано ниже:

  1. Объявите переменные среды лямбда-теста в соответствующем докере Selenium, через который необходимо выполнить автоматическое тестирование браузера:
docker run --rm -ti --name zalenium -p 4444:4444 \
-e LT_USERNAME -e LT_ACCESS_KEY -e https://hub.lambdatest.com/wd/hub \
-v /c/Test_Videos:/home/seluser/videos \
-v /var/run/docker.sock:/var/run/docker.sock \
--privileged dosel/zalenium start --lambdaTestEnabled true --startTunnel true

Давайте выясним, что означает каждый параметр в тесте:

  • Изображение zalenium (т.е. дозы/селен) запускается на порту 4444.
  • Переменные среды, которые мы объявили на предыдущем шаге, используются для доступа к сетке лямбда-теста Selenium [т.е. https://hub.lambdatest.com/wd/hub ].
  • Видеозаписи исполнения будут сохранены в папке C:/Test_Videos . Создайте папку в нужном месте назначения перед запуском тестов.
  • Переменная lambda Test Enabled имеет значение true, так как мы будем запускать тесты в сетке Selenium Lambda Test.
  • Установка начального туннеля в значение true означает, что в тестах будет использоваться лямбда-тестовый туннель. Он не создает туннель, а только запускает туннель.

Когда вы установите флажок “Контейнеры/приложения” в докере, вы увидите, что докер Selenium работает на порту 4444.

Как показано ниже, узел зарегистрирован в концентраторе, который работает по адресу http://localhost:4444/grid/register Zalenium и LambdaTest теперь готовы к использованию.

Состояние сетки можно отслеживать, введя http://localhost:4444/grid/console в браузере.

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

Реализация

package org.testnggroup;

import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.safari.SafariOptions;

public class Helper {
    protected static ThreadLocal driver = new ThreadLocal<>();
    public static String username = "user-name";
    public static String access_key = "access-key";
    public static String remote_url = "http://localhost:4444/wd/hub";

    public void setupLTCombination (String build, String name, String platformName, String browserName, String browserVersion) throws MalformedURLException
    {
        DesiredCapabilities capabilities = new DesiredCapabilities();

        capabilities.setCapability("build", build);
        capabilities.setCapability("name", name);
        capabilities.setCapability("platform", platformName);
        capabilities.setCapability("browserName", browserName);
        capabilities.setCapability("version",browserVersion);
        capabilities.setCapability("tunnel",true);

        driver.set(new RemoteWebDriver(new URL(remote_url), capabilities));
    }

    public WebDriver getDriver()
    {
        return driver.get();
    }

    public void tearDownDriver()
    {
        getDriver().quit();
    }
}

Поскольку изображение Selenium docker (с интеграцией лямбда-теста) запущено на порту 4444, URL-адрес теста установлен в http://localhost:4444/wd/hub .

package org.testnggroup;

import org.openqa.selenium.*;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Assert;
import org.testng.IExecutionListener;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import java.io.Console;
import java.net.MalformedURLException;
import java.net.URL;

public class TestNG_SearchGroup extends Helper implements IExecutionListener
{
    public static String status = "passed";

    @Override
    public void onExecutionStart()
    {
        System.out.println("onExecutionStart");
    }

    @Test(priority = 1, groups = {"Search"})
    @Parameters({"environment"})
    public void test_GoogleSearch(String environment) throws InterruptedException, MalformedURLException
    {
        String search_string =" LambdaTest";
        String exp_title = "Most Powerful Cross Browser Testing Tool Online | LambdaTest";

        if (environment.equalsIgnoreCase("cloud"))
        {
            setupLTCombination("test_GoogleSearch", "test_GoogleSearch",
                    "MacOS Big sur", "Safari", "14.0");
        }
        WebDriver webdriver = getDriver();
        webdriver.navigate().to("https://www.google.com");
        webdriver.manage().window().maximize();
        System.out.println("Started session");

        try {
            /* Enter the search term in the Google Search Box */
            WebElement search_box = webdriver.findElement(By.xpath("//input[@name='q']"));
            search_box.sendKeys(search_string);

            search_box.submit();
            Thread.sleep(3000);

            /* Click on the first result which will open up the LambdaTest homepage */
            WebElement lt_link = webdriver.findElement(By.xpath("//span[.='LambdaTest: Most Powerful Cross Browser Testing Tool Online']"));
            lt_link.click();
            Thread.sleep(5000);

            String curr_window_title = webdriver.getTitle();
            Assert.assertEquals(curr_window_title, exp_title);
            status = "passed";
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        if (getDriver() != null)
        {
            //webdriver.quit();
            tearDownDriver();
        }
    }

    @Test(priority = 2, groups = {"Search"})
    @Parameters({"environment"})
    public void test_BingSearch(String environment) throws InterruptedException, MalformedURLException {
        String search_string ="LambdaTest Blog";
        String exp_title = "LambdaTest | A Cross Browser Testing Blog";

        if (environment.equalsIgnoreCase("cloud"))
        {
            setupLTCombination("test_BingSearch", "test_BingSearch",
                    "Windows 7", "Firefox", "84.0");
        }
        WebDriver webdriver = getDriver();
        webdriver.navigate().to("https://www.bing.com");
        webdriver.manage().window().maximize();
        System.out.println("Started session");

        try {
            /* Enter the search term in the Google Search Box */
            WebElement search_box = webdriver.findElement(By.xpath("//input[@id='sb_form_q']"));
            search_box.sendKeys(search_string + Keys.ENTER);
            Thread.sleep(3000);

            /* Click on the first result which will open up the LambdaTest homepage */
            WebElement lt_link = webdriver.findElement(By.xpath("//a[.='LambdaTest | A Cross Browser Testing Blog']"));
            lt_link.click();
            Thread.sleep(5000);

            String curr_window_title = webdriver.getTitle();
            Assert.assertEquals(curr_window_title, exp_title);
            status = "passed";
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        if (getDriver() != null)
        {
            //webdriver.quit();
            tearDownDriver();
        }
    }

    @Override
    public void onExecutionFinish()
    {
        System.out.println("onExecutionFinish");
    }
}
package org.testnggroup;

import org.openqa.selenium.*;
import org.testng.IExecutionListener;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import java.net.MalformedURLException;

public class TestNG_ToDoGroup extends Helper implements IExecutionListener {
    public static String status = "passed";

    @Override
    public void onExecutionStart()
    {
        System.out.println("onExecutionStart");
    }

    @Test(priority = 1, groups = {"ToDo"})
    @Parameters({"environment"})
    public void test_Selenium4_ToDoApp_Test1(String environment) throws InterruptedException, MalformedURLException
    {
        if (environment.equalsIgnoreCase("cloud"))
        {
            setupLTCombination("test_Selenium4_ToDoApp_Test1", "test_Selenium4_ToDoApp_Test1",
                    "Windows 10", "MicrosoftEdge", "87.0");
        }
        WebDriver webdriver = getDriver();
        webdriver.navigate().to("https://lambdatest.github.io/sample-todo-app/");
        webdriver.manage().window().maximize();
        System.out.println("Started session");
        Thread.sleep(5000);

        try
        {
            /* Let's mark done first two items in the list. */
            webdriver.findElement(By.name("li1")).click();
            webdriver.findElement(By.name("li2")).click();

            /* Let's add an item in the list. */
            webdriver.findElement(By.id("sampletodotext")).sendKeys("Happy Testing at LambdaTest");
            webdriver.findElement(By.id("addbutton")).click();

            /* Let's check that the item we added is added in the list. */
            String enteredText = webdriver.findElement(By.xpath("/html/body/div/div/div/ul/li[6]/span")).getText();
            if (enteredText.equals("Happy Testing at LambdaTest")) {
                System.out.println("Demonstration is complete");
                status = "passed";
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
        if (getDriver() != null)
        {
            //webdriver.quit();
            tearDownDriver();
        }
    }

    @Test(priority = 2, groups = {"ToDo"})
    @Parameters({"environment"})
    public void test_Selenium4_ToDoApp_Test2(String environment) throws InterruptedException, MalformedURLException {
        if (environment.equalsIgnoreCase("cloud"))
        {
            setupLTCombination("test_Selenium4_ToDoApp_Test2", "test_Selenium4_ToDoApp_Test2",
                    "Windows 8", "Firefox", "84.0");
        }
        WebDriver webdriver = getDriver();
        webdriver.navigate().to("https://lambdatest.github.io/sample-todo-app/");
        webdriver.manage().window().maximize();
        System.out.println("Started session");
        Thread.sleep(5000);

        try
        {
            /* Let's mark done first three items in the list. */
            webdriver.findElement(By.name("li1")).click();
            webdriver.findElement(By.name("li2")).click();
            webdriver.findElement(By.name("li3")).click();
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
        status = "passed";
        if (getDriver() != null)
        {
            //webdriver.quit();
            tearDownDriver();
        }
    }

    @Override
    public void onExecutionFinish()
    {
        System.out.println("onExecutionFinish");
    }
}




    
    
    
        
            
                
            
        
        
            
        
    

    
    
    
        
            
                
            
        
        
            
        
    

Как видно из testng.xml , параметр с именем “окружающая среда” передается соответствующим тестам. Параметр имеет значение Cloud, чтобы указать, что для выполнения тестов используется сетка Selenium лямбда-теста. Мы бы не стали углубляться в реализацию, поскольку код говорит сам за себя.

Исполнение

Запустите проект TestNG, демонстрирующий использование Selenium Docker с лямбда-тестом, запустив тесты в testng.xml . Мы отслеживаем состояние выделенных ресурсов, войдя в систему на http://localhost:4444/grid/console .

Поскольку мы проводим параллельные тесты для всех методов @test (т.Е.), два метода в одном классе выполняются параллельно. Когда тесты выполняются, два сеанса в сетке лямбда-тестов указывают, что тесты в данный момент выполняются в сетке.

Вот снимок выполнения с панели автоматизации тестирования Lambda, который показывает ход выполнения параллельных тестов.

Вот окончательный снимок выполнения, полученный с панели мониторинга автоматизации и IntelliJ IDEA, которые указывают на то, что тесты были выполнены успешно.

При настройке Selenium docker с помощью лямбда-теста мы указали, что видео выполнения теста должно храниться по адресу C:\Test_Videos .

Как показано ниже, видеозаписи казни доступны по адресу C:\Test_Videos . Средство записи видео встроено в Selenium docker, и его следует использовать для проверки состояния тестовых сценариев.

Закрепите Его В Доке

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

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

Оригинал: “https://dev.to/himanshusheth004/how-to-run-selenium-tests-in-docker-4f09”