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 — это полноценная интегрированная среда разработки (IDE) для тестов на Selenium, реализованная как расширение для Firefox и Google Chrome. Она позволяет записывать, редактировать и отлаживать функциональные тесты. Ранее инструмент назывался Selenium Recorder. Изначально создан Шиньей Касатани и в 2006 году передан проекту Selenium. С 2018 года Selenium IDE снова активно развивается[9][10][11][12].
Скрипты могут автоматически записываться и вручную редактироваться, с поддержкой автодополнения и возможностью перемещения команд. Записи ведутся на Selenese, специальном языке тестирования для Selenium, предоставляющем команды для выполнения действий (например, клик по ссылке, выбор опции) и получения данных со страниц. Команды Selenese предназначены для взаимодействия с элементами интерфейса по HTML-тегам и проверки их наличия, а также определения действий для выполнения Selenium.
В качестве альтернативы написанию тестов на Selenese возможна разработка на различных языках программирования. Такие тесты взаимодействуют с Selenium через методы клиентского API Selenium. На данный момент официально поддерживаются API для Java, C#, Ruby, JavaScript, R и Python.
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 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].
Некоторые из простейших инструкций на разных языках:
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"))
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();
}
}
}
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 — сервер, позволяющий запускать тесты во множестве экземпляров браузеров на удалённых машинах. Один сервер выступает в роли центрального хаба, а тесты обращаются к нему для получения доступа к нужным браузерам. Хаб хранит список серверов с экземплярами браузеров (WebDriver-узлов) и предоставляет их по запросу тестам. Это даёт возможность параллельного выполнения тестов, управления версиями и конфигурациями браузеров в одном месте (а не в каждом отдельном тесте).
Возможность запускать тесты на удалённых экземплярах браузеров полезна для распределения нагрузки между машинами и проверки в разных браузерах и средах. Особенно это важно, если часть браузеров недоступна для запуска на одной платформе[19].