Selenium

Selenium — открытый проект, объединяющий множество инструментов и библиотек для поддержки автоматизации работы с веб-браузерами[2]. Проект предоставляет средство записи и воспроизведения функциональных тестов во множестве современных веб-браузеров без необходимости изучать специальный язык написания тестов (Selenium IDE)[3]. Также проект включает язык тестирования (Selenese) для написания тестов на популярных языках программирования, включая JavaScript (Node.js), C#, Groovy, Java, C++, Perl, PHP, Python, Ruby и Scala. Selenium работает под управлением Windows, Linux и macOS, является программой с открытым исходным кодом и распространяется по лицензии Apache License 2.0.

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

Общие сведения
Selenium
Тип фреймворк для тестирования веб-приложений
Написана на Selenium Server: Java; Selenium WebDriver: JavaScript (Node.js), Python, Ruby, Java, C++, C#
Операционные системы кроссплатформенная (Windows, Linux, macOS)
Последняя версия
Репозиторий github.com/SeleniumHQ/
github.com/SeleniumHQ/se…
Лицензия Apache License 2.0
Сайт selenium.dev

История

Selenium был изначально разработан Джейсоном Хаггинсом в 2004 году как внутренний инструмент в компании ThoughtWorks[4]. Вскоре к нему присоединились другие программисты и тестировщики из ThoughtWorks, а после прихода Пола Хамманта началась работа над вторым режимом работы, впоследствии получившим название Selenium Remote Control (RC). В том же 2004 году инструмент был открыт как свободное ПО.

В 2005 году Дэн Фабулич и Нельсон Спроул (при поддержке Пэта Лайтбади) предложили внести ряд изменений, благодаря которым Selenium-RC приобрёл популярность. Тогда же управление проектом было передано комитету с представителями от ThoughtWorks — Хаггинсом и Хаммантом[5].

В 2007 году Хаггинс присоединился к Google, где совместно с другими (например, Дженнифер Биван) продолжил развитие и стабилизацию Selenium RC. Параллельно Саймон Стюарт в ThoughtWorks разрабатывал усовершенствованный инструмент автоматизации браузеров под названием WebDriver. В 2009 году на встрече разработчиков на Google Test Automation Conference было решено объединить оба проекта под названием Selenium WebDriver, или Selenium 2.0[6].

В 2008 году Филипп Анригу (тогда в ThoughtWorks) создал Selenium Grid, предоставивший хаб для одновременного запуска множества тестов Selenium на разных локальных и удалённых системах, тем самым сокращая время выполнения тестирования. Grid стал открытым аналогом схожих внутренних облачных решений Google для Selenium RC. Ранее Пэт Лайтбади уже реализовал частное облако для HostedQA, впоследствии проданное компании Gomez, Inc.

Название Selenium связано с шуткой Хаггинса в электронном письме относительно конкурирующего продукта Mercury: по его словам, отравление ртутью (Mercury) лечится селеном (selenium). Получившие письмо коллеги подхватили это название[7].

Компоненты

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

Selenium IDE

Selenium IDE — это полноценная интегрированная среда разработки (IDE) для тестов на Selenium, реализованная как расширение для Firefox и Google Chrome. Она позволяет записывать, редактировать и отлаживать функциональные тесты. Ранее инструмент назывался Selenium Recorder. Изначально создан Шиньей Касатани и в 2006 году передан проекту Selenium. С 2018 года Selenium IDE снова активно развивается[9][10][11][12].

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

Клиентский API Selenium

В качестве альтернативы написанию тестов на Selenese возможна разработка на различных языках программирования. Такие тесты взаимодействуют с Selenium через методы клиентского API Selenium. На данный момент официально поддерживаются API для Java, C#, Ruby, JavaScript, R и Python.

Selenium Remote Control

Selenium Remote Control (RC) — это сервер на Java, принимающий HTTP-команды для браузера. RC позволяет писать автоматизированные тесты для веб-приложений на различных языках программирования и интегрировать Selenium в существующие фреймворки юнит-тестирования. Для облегчения работы проект предлагает клиентские драйверы для PHP, Python, Ruby, .NET, Perl и Java. Java-драйвер также может использоваться с JavaScript (через Rhino). Для запуска html тест-кейса требуется отдельный экземпляр сервера Selenium RC для каждого параллельного запуска. Однако для тестов на Java/PHP достаточно одного запущенного экземпляра RC[13].

Selenium RC стал переработкой Driven Selenium или Selenium B, автором которой был Пол Хаммант, а в соавторах — Джейсон Хаггинс. Первая версия напрямую запускала браузер из тестового языка (Java, .NET, Python или Ruby), а протокол взаимодействия (названный Selenese) реализовывался заново для каждого языка. После рефакторинга Фабулича и Спроула (при поддержке Лайтбади) появился промежуточный процесс-демон, позволивший удалённо управлять браузерами и снизить необходимость полного портирования кода на новые языки. Selenium RC окончательно сменил Driven Selenium в 2006 году. Взаимодействие с браузером строилось по схеме response/request, ставшей впоследствии известной как Comet.

Selenium RC долгое время был основным инструментом тестирования во всём проекте Selenium и первым инструментом для автоматизированного тестирования веб-приложений, который позволял использовать выбранный пользователем язык программирования[14][15].

С выходом Selenium 2 поддержка Selenium RC была официально прекращена в пользу Selenium WebDriver.

Selenium WebDriver

Ядро Selenium составляет компонент WebDriver — интерфейс для написания инструкций, работающих во всех поддерживаемых браузерах. Это преемник Selenium RC. WebDriver принимает команды (отправленные на Selenese или через клиентский API) и направляет их в браузер. Для управления браузером используются специфичные для него драйверы, которые отправляют команды и получают результаты. Большинство драйверов действительно запускают браузер (например, Firefox, Google Chrome, Internet Explorer, Safari, Microsoft Edge), однако есть и драйвер HtmlUnit, моделирующий работу браузера.

В отличие от Selenium 1, где требовался сервер для запуска тестов, WebDriver напрямую запускает экземпляр браузера и управляет им, без отдельного сервера. Чтобы выполнять тесты на удалённых системах, WebDriver может использоваться совместно с Selenium Grid. По возможности WebDriver применяет нативные средства ОС, а не только команды на JavaScript, что помогает обойти различия и ограничения между ними[16].

С 2012 года Саймон Стюарт (автор WebDriver) из Google и Дэвид Бернс из Mozilla работали с W3C, чтобы сделать WebDriver стандартом. В июле 2012 года опубликован рабочий проект, а рекомендация W3C вышла в июне 2018 года[17]. Selenium WebDriver (Selenium 2.0) полностью реализован и поддерживается для JavaScript (Node.js), Python, Ruby, Java, Kotlin, C#. По состоянию на 2021 год, Selenium 4 вышел как кандидат в релизы[18].

Примеры

Некоторые из простейших инструкций на разных языках:

Python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located

# Необходим Selenium WebDriver версии 3.13 или новее
with webdriver.Firefox() as driver:
    wait = WebDriverWait(driver, 10)
    driver.get("https://google.com/ncr")
    driver.find_element(By.NAME, "q").send_keys("cheese" + Keys.RETURN)
    first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3")))
    print(first_result.get_attribute("textContent"))
Java
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
import java.time.Duration;

public class HelloSelenium {

    public static void main(String[] args) {
        WebDriver driver = new FirefoxDriver()
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        try 
        {
            driver.get("https://google.com/ncr");
            driver.findElement(By.name("q")).sendKeys("cheese" + Keys.ENTER);
            WebElement firstResult = wait.until(presenceOfElementLocated(By.cssSelector("h3")));
            System.out.println(firstResult.getAttribute("textContent"));
            driver.quit();
        }
    }
}
C#
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;

using IWebDriver driver = new FirefoxDriver;
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
driver.Navigate().GoToUrl("https://www.google.com/");
driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
wait.Until(webDriver => webDriver.FindElement(By.CssSelector("h3")).Displayed);
IWebElement firstResult = driver.FindElement(By.CssSelector("h3"));
Console.WriteLine(firstResult.GetAttribute("textContent"));

Selenium Grid

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

Возможность запускать тесты на удалённых экземплярах браузеров полезна для распределения нагрузки между машинами и проверки в разных браузерах и средах. Особенно это важно, если часть браузеров недоступна для запуска на одной платформе[19].

Примечания

  1. Release 4.35.0 — 2025.
  2. The Selenium Browser Automation Project (англ.). selenium.dev (16 марта 2020). Дата обращения: 1 ноября 2021. Архивировано 27 марта 2020 года.
  3. Abdullaiev, O.A.; Ibrahimova, L. V. (2020). “Review of testing software: Selenium software”. Вінницький національний технічний університет [рус.]. УДК 004.457.
  4. About Selenium. selenium.dev. Архивировано 7 октября 2025 года.
  5. Selenium History (англ.). selenium.dev. Дата обращения: 11 августа 2021. Архивировано 30 августа 2025 года.
  6. The Selenium Project (англ.). thenewcircle.com. NewCircle. Дата обращения: 29 июня 2014. Архивировано 12 августа 2014 года.
  7. Krill, Paul (6 апреля 2011). “Open source Selenium web app test suite to support iPhone and Android”. InfoWorld [англ.]. Архивировано из оригинала 2011-05-05. Дата обращения 9 мая 2012. Название Selenium было выбрано потому, что селен как минерал используется для лечения отравления ртутью (Mercury); таким образом подчеркивался альтернативный характер по отношению к продукту Mercury Interactive QuickTest Professional. Используется устаревший параметр |url-status= (справка)
  8. Moizuddin, Khaja Components of the Selenium Automation Tool (англ.). dzone.com. DevOps Zone (7 июня 2018). Дата обращения: 10 июля 2019. Архивировано 7 июня 2018 года.
  9. It's back! Selenium IDE Reborn with Dave Haeffner (англ.). testingpodcast.com (24 декабря 2018). Архивировано 26 января 2025 года.
  10. Dave, Tour de Selenium IDE Is Dead, Long Live Selenium IDE! (англ.). Selenium IDE Official Blog (6 августа 2018). Дата обращения: 27 ноября 2019. Архивировано 27 февраля 2025 года.
  11. Colantonio, Joe Stunning return of Selenium IDE (англ.). testguild.com (27 ноября 2018). Дата обращения: 27 ноября 2019. Архивировано 8 сентября 2025 года.
  12. Sargent, Al List of new Selenium IDE features (англ.). applitools.com (19 марта 2019). Дата обращения: 18 октября 2021. Архивировано 12 августа 2025 года.
  13. Selenium Remote-Control (англ.). seleniumhq.org. Дата обращения: 13 ноября 2019. Архивировано 11 декабря 2008 года.
  14. Selenium 1 (Selenium RC) :: Documentation for Selenium (англ.). selenium.dev. Дата обращения: 20 декабря 2020. Архивировано 16 сентября 2025 года.
  15. sparkdatabox_author Selenium (англ.) (16 октября 2019). Дата обращения: 20 декабря 2020. Архивировано 13 мая 2025 года.
  16. The Architecture of Open Source Applications: Selenium WebDriver (англ.). aosabook.org. Дата обращения: 7 февраля 2016. Архивировано 27 мая 2011 года.
  17. Smith, Michael WebDriver motors on to W3C Recommendation (англ.). W3C Blog (5 июня 2018). Дата обращения: 10 сентября 2018. Архивировано 6 февраля 2023 года.
  18. Downloads (англ.). selenium.dev. Дата обращения: 29 сентября 2021. Архивировано 26 сентября 2025 года.
  19. Selenium Grid (англ.). The Selenium Browser Automation Project. Дата обращения: 9 сентября 2020. Архивировано 16 декабря 2019 года.

Ссылки