Разберем основы автоматизации кроссбраузерного тестирования, делая упор на главном инструменте — Selenium. Также коснемся параллельного выполнения тестов на разных фреймворках Java, Python, JavaScript.
- Почему автоматизируют
- Как перейти от ручного тестирования к автоматизации. Советы
- Фреймворки для автоматизированного кроссбраузерного тестирования
- Практика
- Локальное автоматизированное кроссбраузерное тестирование
- Автоматизация через remote-драйвер Selenium Grid
- Блиц
Почему автоматизируют
Кроссбраузерное тестирование нужно для проверки User Experience. Бывают челенджи, когда нужно настраивать локальную инфраструктуру на выполнение множества разнообразных тестов на всех платформах. Это расход труда тестировщиков, да и денежных средств, на автоматизированное тестирование на всех возможных браузерах, девайсах и платформах. Понятно, что локальная инфраструктура не лучший вариант, особенно на больших проектах она вряд ли масштабируема; есть смысл смотреть в сторону “внешних”, облачных платформ автоматизированного тестирования.
Поэтому автоматизированное кроссбраузерное тестирование в облаке — хорошее решение. Созданы и прекрасно работают достаточно качественные инструменты, более-менее гарантируется эффективность, масштабируемость, реюзабельность.
Приступая к автоматизации, и уже имея план/стратегию тестирования, QA-отдел грамотно сочетает ручное и автоматизированное тестирование, в зависимости от типа тестовых сценариев, их сложности. Ручное тестирование всех функций сайта или веб-приложения — это долго и дорого. Тестирование бывает затратным, длительным, и попросту муторным, если сделать все неправильно с самого начала.
Автоматизация идет лучше, если QA применяют проверенные инструменты (в частности опенсорсные) и пишут грамотные тестовые скрипты.
Автоматизация в Selenium уже много лет как «золотое правило» в QA-индустрии; фреймворк поддерживает все основные браузеры и операционные системы. Отлично работает с языками программирования Python, Java, JavaScript, C#, Ruby (то есть всеми возможными, с которыми имеет, или может иметь дело, тестировщик в 2022 году). На этих языках делают тесты для Selenium.
Преимущества автоматизированного кроссбраузерного тестирования:
- Возможность протестировать во всех браузерах и ОС
- Экономия времени; возможность масштабировать тесты, передав на автоматизацию стандартные и повторяемые задачи
- Быстрое выполнение тестов — поддерживается параллельное выполнение
- Быстрая подстройка к поступающим изменениям требований заказчика
- Хорошее тестовое покрытие
- Ускорение релиза
- Простота: автоматизация уже достаточно простой процесс для тестировщика-новичка
Как перейти от ручного тестирования к автоматизации
Ручное тестирование предполагает поэтапное выполнение тест-кейса, “по шагам”. Если тест-кейс большой и сложный, конечно уйдет много времени на выполнение тест-кейсов вручную на каждом браузере. Поэтому QA-отделы пытаются автоматизировать тест-кейсы’; понятно, что все тест-кейсы автоматизировать не получится. При переходе к автоматизации желательно руководствоваться такими общими соображениями:
- Пиши небольшие и простые тест-кейсы — потому что они должны быть “легкими” и пригодными для повторного применения в другом тест-кейсе. Уже в начале процесса можно понять, подходит ли автоматизация для конкретного приложения/сайта, и в каком масштабе.
- Если подходит, автоматизируем дальше и другие кейсы. Расширяем автоматизацию, по покрытию и по типам. Тест-кейсы, не подходящие для автоматизации, возвращаем на ручное тестирование.
- Распланируй тест-кейсы по модулям, и обозначь тегами, чтобы проще было искать потом. Модульность и теги — улучшат тестовое покрытие и упростят отчеты.
- Старайся сначала протестировать вручную все новое в приложении, и далее делай автоматизацию тест-кейсов, исходя из приоритетов в бизнес-требованиях.
- Пользуйся аналитикой поведения пользователей на самых ходовых, часто используемых браузерах и девайсах. Это поможет сфокусироваться на главном.
Какие тесты автоматизируются
Тест-кейсы, которые используются редко, лучше оставить на ручное тестирование; должны автоматизироваться часто используемые тест-кейсы, или с большими объемами данных. Хорошо бы автоматизировать смок-тесты и регрессионные тесты. Тогда автоматизация действительно “упорядочивает тестовый цикл, ускоряет релиз продукта, экономит труд QA-инженеров”.
Автоматизировать тесты надо, исходя из бизнес-приоритетов. Надо убедиться, что автоматизация снизит технические сложности у тестировщиков, и поможет выпустить продукт быстрее. Если да, приступаем.
Сценарии, обычно подходящие для автоматизации:
- Тесты, которые повторяются во всех билдах
- Тесты, в которых легко могут возникать ошибки тестировщиков
- Тесты с большими объемами данных
- Часто используемые функции с большими рисками
- Тесты, забирающие много ручного времени
- Тесты, задействующие много разных программных/аппаратных конфигураций
Кстати, мы уже размещали отдельные материалы о том, что автоматизировать в первую очередь и о том, как определить, нужно ли автоматизировать тест-кейс.
Инструменты автоматизированного тестирования
Инструменты автоматизированного тестирования, в первую очередь Selenium, поддерживают все популярные браузеры; таким образом, можно тестировать browser compatibility в Chrome, Firefox, Internet Explorer, Microsoft Edge, Safari. Большое преимущество Selenium — его расширяемость, благодаря открытому исходному коду, то есть он позволяет «писать и дописывать» тесты/кейсы на всех многих языках программирования.
Какие языки программирования применяются при автоматизации

По результатам опроса разработчиков на Stack Overflow, предпочитаемые языки программирования у них — это JavaScript (67.7%), Python (44.1%), и Java (40.2%).
Selenium поддерживает все три языка. Для каждого из этих ЯП есть узко-специализированные тестовые фреймворки, и они могут работать в связке с Selenium. Важно выбрать правильный фреймворк (“правильный” значит “наиболее подходящий для бизнес-требований в проекте”), поскольку неверный выбор повлечет задержку релиза, и убытки компании.
Популярные тестовые фреймворки для автоматизированного кроссбраузерного тестирования
Выбор правильного языка программирования в проекте важен для разработчиков; выбор правильного тестового фреймворка важен для тестировщиков-автоматизаторов.
Грубо говоря, тестовый фреймворк надо выбирать, исходя из скиллов QA-команды. Надо учесть технический уровень сценариев, простоту использования для тестировщиков, расширяемость (масштабируемость), и эффективность, что касается сложных тест-кейсов. Далее указаны наиболее популярные тестовые фреймворки для 3-х основных языков программирования.
Фреймворки автоматизации — JavaScript
JavaScript — не только самый предпочитаемый язык программирования, это (все еще) фактически основной язык автоматизации в Selenium. JS особенно удобен для сквозного, то есть end-to-end-тестирования, и для юнит-тестирования.
Итак, популярные фреймворки автоматизации на JavaScript:
- Jest – Jest это фреймворк автоматизации, разработанный в Facebook. По популярности фреймворк №2, по данным исследования stateofjs по американскому рынку. Главное преимущество Jest: минимальная настройка и конфигурация; поэтому неплохой вариант для новичков. Jest это предпочитаемый фреймворк тестирования приложений, созданных на ReactJS.
- Cypress – Cypress это JS-фреймворк с “холистическим” подходом, изначально заточенный на end-to-end-тестирование. Поддерживает современные веб-интерфейсы. Не требует наличия Selenium и/или WebDriver. Поддерживает сложные тесты, как-то симуляция мобильной сети с нестабильным покрытием, фоновую синхронизацию, сложные распределенные системы. В упомянутом выше исследовании он на 3-ем месте по популярности.
- Mocha – Mocha — тоже популярный фреймворк автоматизации на JavaScript. Открытый исходный код, работает с Selenium; подходит для тестирования приложений на Node.js. Достаточно простое и неутомительное автоматизированное тестирование. В исследовании на 7 месте.
- Jasmine – Jasmine — довольно богатый функциями JS-фреймворк на Node.js. Ему не нужен DOM; применяется главным образом для асинхронного тестирования. Хорош и для стандартной автоматизации кроссбраузерного тестирования, и в связке с Selenium. Отлично работает со многими библиотеками и фреймворками. Поддерживает snapshot testing.
- WebdriverIO – WebdriverIO это фреймворк “следующего поколения” как утверждают создатели, работающий с Webdriver и Node.js. Может сгодиться в автоматизированном тестировании с Selenium для тестов мобильных девайсов (да и немобильных тоже). Богат функциями, расширяемый, хорошо поддерживает Appium и Selenium. Есть встроенная поддержка Applitools Eyes — инструмента написания визуальных регрессионных тестов.
- Protractor – Protractor для тестирования приложений, написанных на React.js, а также Angular и Angular.js. Работает с Selenium, задействует Selenium WebDriver. Кроме функций, поддерживаемых Selenium WebDriver, есть дополнительные локаторы: репитер, байндинг, модель, и другие. Поддерживает работу с другими фреймворками: Mocha, Jasmine, Cucumber.
- Nightwatch – Nightwatch.js — JS-фреймворк для автоматизированного кроссбраузерного тестирования и end-to-end-тестирования веб-сайтов и веб-приложений (особенно на Node.js). Есть встроенный раннер тестов; поддерживает параллельное тестирование; хорошо подходит для continuous integration (что это?); поддерживает POM-паттерн (Page Object Model); работает с элементами страницы через W3C WebDriver API.
(Кстати у нас есть отдельный материал о фреймворках автоматизации — как их подобрать).
Фреймворки автоматизации — Python
Есть несколько хороших фреймворков для автоматизации на Python, работающих с Selenium:
- PyUnit (раньше был известен как UnitTest) – PyUnit, создатели вдохновлялись успешным примером JUnit, и это стандартный тестовый фреймворк для Python.
- Pytest – Pytest, с открытым кодом. Разработчики любят его для юнит-тестирования; а тестировщики для автоматизации. Позволяет писать приятные, компактные тест-сьюты.
- Robot – Robot, популярный фреймворк. Применяют для ATDD (Acceptance Test Driven Development), как и для “простого” acceptance-тестирования. Может работать через IronPython (то есть .NET), и Jython (Java).
- Behave – Behave, идеальный Python-фреймворк для BDD (Behavior Driven Development). По своей архитектуре входит в одну группу с SpecFlow и Cucumber.
- Lettuce – Lettuce еще один Py-фреймворк, “заточенный” на BDD-тесты, для тестирования черного ящика.
Фреймворки автоматизации на Java
Самый известный фреймворк у работающих с Java — JUnit, как следует из названия, в первую очередь предназначен для юнит-тестирования; а есть и другие неплохие фреймворки:
- JUnit – JUnit — вообще, это один из представителей семейства xUnit. Применяется для часто повторяемых тест-кейсов/тест-сьютов. Автоматизация идет в связке JUnit+Selenium; JUnit интегрируется с Selenium WebDriver. Однако JUnit требует особой тщательности при тестировании зависимостей (dependencies).
- TestNG – TestNG — создатели называют “фреймворком следующего поколения”, и как они говорят, “при создании вдохновлялись JUnit-ом”. По сравнению с JUnit, TestNG эффективнее в параметризации тестов, их группировании и упорядочивании тест-кейсов/сценариев. Также здесь лучше устроены репорты, есть поиск потенциальных проблем в коде.
- Selenium – конечно же №1 для автоматизированного кроссбраузерного тестирования. Особенно хорош в функциональном тестировании и Continuous Testing. Как уже говорилось, все возможные «языки тестировщика» поддерживаются в Selenium. На основе Selenium (если точнее Selenium WebDriver) построен тот же Selenide, о котором пойдет речь ниже. “Официально” о Selenium — здесь: SeleniumHQ.
- Spock – Spock фактически “ветка” JUnit. Написан на языке программирования Groovy, не так давно, а уже считается на StackOverflow “одним из предпочитаемых фреймворков у продвинутых QA-инженеров”. Хорошо совместим с языками JVM-семейства (Java Virtual Machine). Работает с большинством build-инструментов, IDE-редакторов, и CI-серверов.
- Selenide – Selenide — фреймворк на основе Selenium WebDriver. Не простая “обертка” вокруг Selenium WebDriver, задействует WebDriver для обработки ожиданий (smart waiting, это частая проблема тестировщиков); поддерживает AJAX; автоматизация скриншотов; особое внимание тестированию бизнес-логики.
Итак, с названиями ознакомились, теперь практика.
Практика
Для автоматизации кроссбраузерного тестирования в Selenium есть опция тестировать с локальным Selenium WebDriver, который задействует локальную Grid-инфраструктуру. Другая опция (лучше масштабируемая) — удаленный Selenium WebDriver.
Локальное автоматизированное кроссбраузерное тестирование
Это опция для “входа в автоматизацию”. В зависимости от масштаба проекта и его сложности, локального Selenium Grid может быть достаточно (или недостаточно) для покрытия.
Сначала надо поставить Selenium на локальной машине, далее скачать и поставить WebDriver для браузеров.
(Гайд по установке WebDriver здесь.)
Возьмем простой планировщик.
- Например такой, из известной платформы Лямбда — https://lambdatest.github.io/sample-todo-app/.
- Отметим первые две элемента в списке.
- Добавим текст «Let’s add it to list» в текстовое поле.
- Нажмем кнопку «Add«, и элемент добавился.
Локальное автоматизированное кроссбраузерное тестирование — JavaScript
Возьмем фреймворк WebDriverIO. Он поддерживает тестовые концепции BDD и TDD, популярные сейчас. Для корректной работы надо поставить Node.js.
Запускаем в терминале (Windows 10):
cd project npm init –y npm install WebDriverIO --save-dev cd node_modules/.bin wdio --help
const assert = require("assert"); describe("Lambdatest ToDoApp Test", function() { it("Lambdatest ToDoApp TestCase", function() { browser.url("https://lambdatest.github.io/sample-todo-app/"); $("*[name='li1']").click(); $("*[name='li2']").click(); $("#sampletodotext").setValue("Yey, Let's add it to list\n"); assert.strictEqual(browser.getTitle(), "Sample page - lambdatest.com"); }); });
Каждая describe()-функция может включать несколько it()-функций с тест-кейсами; блок describe() интегрирует все тесты в одну функцию.
describe("Lambdatest ToDoApp Test", function() { it("Lambdatest ToDoApp TestCase", function() {
Команды Selenium WebDriver выполняют операции — части тест-кейса. Детали по веб-локаторам получают при помощи известного каждому тестировщику инструмента Inspect в браузере.
Локальное автоматизированное кроссбраузерное тестирование — Python
В фреймворке Pytest применяется параметризация. Выполнение тестов на Firefox и Chrome идет последовательно.
# Import the 'modules' that are required for execution import pytest import pytest_html from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.keys import Keys from time import sleep global url_under_test # We make use of the parameterized decorator to supply input arguments # to the test function @pytest.mark.parametrize("input_browser", ['chrome', 'firefox']) @pytest.mark.parametrize("input_url", ['https://lambdatest.github.io/sample-todo-app/']) def test_url_on_browsers(input_browser, input_url): if input_browser == "chrome": driver = webdriver.Chrome() if input_browser == "firefox": driver = webdriver.Firefox() driver.maximize_window() driver.get(input_url) print(driver.title) sleep(5) # Click on check box check_box_one = driver.find_element_by_name("li1") check_box_one.click() # Click on check box check_box_two = driver.find_element_by_name("li2") check_box_two.click() # Enter item in textfield textfield = driver.find_element_by_id("sampletodotext") textfield.send_keys("Yey, Let's add it to list") # Click on add button add_button = driver.find_element_by_id("addbutton") add_button.click() # Verified added item added_item = driver.find_element_by_xpath("//span[@class='done-false']").text print (added_item) sleep(5) driver.close()
Как видно выше, тестовый URL-адрес и веб-браузеры обработаны при помощи параметризации в Pytest. Есть два тест-кейса, простые и расширяемые на другие браузеры и URL’ы.
@pytest.mark.parametrize("input_browser", ['chrome', 'firefox']) @pytest.mark.parametrize("input_url", ['https://lambdatest.github.io/sample-todo-app/'])
Тест запускается командой в терминале:
py.test -v parameterize-stacking-vars.py
Результат:
Локальное автоматизированное кроссбраузерное тестирование — Java
Будем работать с Selenium+TestNG.
package RelativeLocators; import io.github.bonigarcia.wdm.WebDriverManager; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import static org.openqa.selenium.support.locators.RelativeLocator.withTagName; import static org.testng.Assert.assertEquals; import org.testng.annotations.Test; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.TimeUnit; public class TestNGToDo_local { private WebDriver driver; boolean status = false; @BeforeClass public void setUp(){ //System.setProperty("webdriver.chrome.driver","C:\\Setup-Folder\\chromedriver.exe"); driver = new FirefoxDriver(); driver.get("https://lambdatest.github.io/sample-todo-app/"); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } @AfterClass public void tearDown() throws Exception { if (driver != null) { driver.quit(); } } @Test public void test_login_using_relative_locators_1(){ //Change it to production page driver.get("https://lambdatest.github.io/sample-todo-app/"); //Let's mark done first two items in the list. driver.findElement(By.name("li1")).click(); driver.findElement(By.name("li2")).click(); // Let's add an item in the list. driver.findElement(By.id("sampletodotext")).sendKeys("Yey, Let's add it to list"); driver.findElement(By.id("addbutton")).click(); // Let's check that the item we added is added in the list. String enteredText = driver.findElement(By.xpath("/html/body/div/div/div/ul/li[6]/span")).getText(); if (enteredText.equals("Yey, Let's add it to list")) { status = true; } driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } }
Setup() имплементируется через аннотацию @BeforeClass, и Teardown() имплементируется через аннотацию @AfterClass. Ключевая логика теста — в аннотации @Test.
Вывод в Eclipse — тест выполнен успешно:
Автоматизация через remote-драйвер Selenium Grid
Локальное автоматизированное кроссбраузерное тестирование работает отлично, пока не так важно тестовое покрытие, или пока нет необходимости тестировать для разных версий браузеров. Локального тестирования, скорее всего, будет недостаточно, для большинства QA-команд.
Поэтому надо уметь тестировать через remote Selenium Grid. Так проверяем разные версии браузеров, повышаем тестовое покрытие. Существуют облачные платформы, позволяющие протестировать на 2000+ версиях браузеров. Та же LambdaTest — нужно создать аккаунт, взять юзернейм и ключ из профиля, посмотреть на дашборд и capabilities-генератор.
Работаем с тем же тестом, что в разделе выше (о локальном Selenium WebDriver).
- Переходим к приложению https://lambdatest.github.io/sample-todo-app/, используя выбранные браузеры.
- Выбираем первые два элемента.
- Добавим текст “Let’s add it to list” в поле.
- Нажмем кнопку “Add”, элемент добавился.
Remote автоматизированное кроссбраузерное тестирование — JavaScript
Перед тем как имплементировать Selenium WebDriver и WebDriverIO, надо прописать dev-зависимости, командой в терминале:
npm install @wdio/selenium-standalone-service --save-dev
Применяется параллельное выполнение тестов, что, как мы уже знаем, ускоряет процесс и улучшает покрытие. В данном примере идет 5 параллельных потоков. В WebDriverIO есть параметр maxInstances для количества параллельных браузеров.
У нас Safari на MacOS и Chrome на Windows 10. Capabilities создавались в соответствующем генераторе.
Файл конфигурации WDIO (wdio.conf.js) переписан на параллельное выполнение тестов.
FileName – wdio.conf.js
capabilities: [ { maxInstances: 5, name: "My First Script - Chrome-Window", // name of the test, user: "user-name", accessKey: "access-key", build: "MyFirstScript-Demo", platformName: "Windows 10", // macOS High Sierra & Windows 10 browserName: "Chrome", browserVersion: "79.0", video: true, console: true, visual: false }, { name: "My First Script - Safari-Mac", // name of the test, user: "user-name", accessKey: "access-key", build: "MyFirstScript-Demo", platformName: "macOS High Sierra", // macOS High Sierra & Windows 10 browserName: "Safari", browserVersion: "11.0", video: true, console: true, visual: false } ]
Мы запускали параллельно 5 потоков, поэтому параметр maxInstances задан в значение “5”. Остальные данные в capabilities это свойства браузера.
Статус выполненных тестов:

Логи в локальной консоли:
Remote автоматизированное кроссбраузерное тестирование — Python
Для автоматизации на Python, в варианте PyTest + remote Selenium WebDriver, применялась параметризация. Для обеспечения модульности применялись следующие аргументы командной строки: браузер, его версия, и операционная система.
FileName – conf_test.py
import cross_browser_configuration import pytest import os # Capabilities can be generated using LambdaTest online capabilities generator # https://www.lambdatest.com/capabilities-generator/ @pytest.fixture def platform(request): "fixture for platform - can be Windows 10.0, OSX Sierra, etc." "Equivalent entry for 'platform' : platform-name" return request.config.getoption("-P") @pytest.fixture def browser(request): "fixture for browsername - can be Chrome, Firefox, Safari, etc." "Equivalent entry for 'browsername' : browser-name" return request.config.getoption("-B") @pytest.fixture def browser_version(request): "fixture for browser version - can be version number for the corresponding selected browser" "Equivalent entry for 'version' : version-number" return request.config.getoption("-V") def pytest_generate_tests(metafunc): "test generator function to run tests across different parameters" if 'browser' in metafunc.fixturenames: if metafunc.config.getoption("-B") == "all": # Parameters are passed according to the one generated by # https://www.lambdatest.com/capabilities-generator/ metafunc.parametrize("platform,browser,browser_version", cross_browser_configuration.LT_cross_browser_config) def pytest_addoption(parser): parser.addoption("-P","--platform", dest="platform", action="store", help="OS on which testing is performed: Windows 10.0, macOS Sierra, etc.", default="") parser.addoption("-B","--browser", dest="browser", action="store", help="Browser on which testing is performed: Firefox, Chrome, Edge, etc.", default= "") parser.addoption("-V","--ver", dest="browser_version", action="store", help="Corresponding Browser version: 71.0, 72.0, etc.", default= "")
В этом файле — имплементация общих fixture-функций для разных файлов. Применен parser.addoption для задания опций командной строки. Каждая опция командной строки имеет связанную с ней fixture-функцию.
FileName – cross_browser_configuration.py
platform_list = ["macOS High Sierra"] browsers = ["Chrome", "Firefox", "Safari"] chrome_test_versions = ["79.0"] firefox_test_versions = ["71.0"] safari_test_versions = ["11.0"] def generate_LT_configuration(platform_list=platform_list,browsers=browsers): if 'firefox_versions' in locals(): ff_ver = firefox_test_versions if 'chrome_versions' in locals(): ch_ver = chrome_test_versions if 'safari_versions' in locals(): edge_ver = safari_test_versions LT_config = [] for browser in browsers: if browser == "Chrome": for ch_ver in chrome_test_versions: for platform_name in platform_list: # if platform_name == "Windows 10": config = [platform_name,browser,ch_ver] LT_config.append(tuple(config)) if browser == "MicrosoftEdge": for edge_ver in edge_test_versions: for platform_name in platform_list: # if platform_name == "Windows 10": config = [platform_name,browser,edge_ver] LT_config.append(tuple(config)) if browser == "Firefox": for ff_ver in firefox_test_versions: for platform_name in platform_list: # if platform_name == "Windows 10": config = [platform_name,browser,ff_ver] LT_config.append(tuple(config)) if browser == "Safari": for ff_ver in safari_test_versions: for platform_name in platform_list: # if platform_name == "Windows 10": config = [platform_name,browser,ff_ver] LT_config.append(tuple(config)) return LT_config LT_cross_browser_config = generate_LT_configuration()
В файле — аргументы командной строки, передаваемые во время тестирования. Опции следующие: –B “all” или –browser “all” (или какая-то другая конфигурация). Аргументы соответствуют capabilities, созданным в генераторе.
platform_list = ["macOS High Sierra"] browsers = ["Chrome", "Firefox", "Safari"] chrome_test_versions = ["79.0"] firefox_test_versions = ["71.0"] safari_test_versions = ["11.0"]
FileName – test_exec.py
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.common.action_chains import ActionChains import sys,time import urllib3 from time import sleep from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait def test_send_keys_browser_combs(platform,browser,browser_version): driver = webdriver_interface_conf(platform,browser,browser_version) driver.get('https://lambdatest.github.io/sample-todo-app/') # Click on check box check_box_one = driver.find_element_by_name("li1") check_box_one.click() # Click on check box check_box_two = driver.find_element_by_name("li2") check_box_two.click() # Enter item in textfield textfield = driver.find_element_by_id("sampletodotext") textfield.send_keys("Yey, Let's add it to list") # Click on add button add_button = driver.find_element_by_id("addbutton") add_button.click() # Verified added item added_item = driver.find_element_by_xpath("//span[@class='done-false']").text print (added_item) driver.quit() # Configuration of Selenium WebDriver def webdriver_interface_conf(platform,browser,browser_version): urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) user_name = "user-name" app_key = "access-key" if browser == 'firefox' or browser == 'Firefox': desired_capabilities = DesiredCapabilities.FIREFOX if browser == 'chrome' or browser == 'Chrome': desired_capabilities = DesiredCapabilities.CHROME if browser == 'safari' or browser == 'Safari': desired_capabilities = DesiredCapabilities.SAFARI if browser == 'microsoftedge' or browser == 'MicrosoftEdge': desired_capabilities = DesiredCapabilities.EDGE desired_capabilities['browserName'] = browser desired_capabilities['platform'] = platform desired_capabilities['version'] = browser_version remote_url = "http://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub" return webdriver.Remote(command_executor=remote_url, desired_capabilities=desired_capabilities)
Интерфейс remote Selenium WebDriver конфигурируется через API configure_webdriver_interface(). Имя браузера, его версия, и платформа (ОС) записываются в соответствующие поля в форме desired_capabilities [ в webdriver.Remote() ]. В Pytest название теста должно начинаться с “test”, в нашем случае test_send_keys_browser_combs().
Вывод в терминале: py.test -v -n=4 –browser “all” :

Тесты выполняются параллельно:

Выполнены успешно:

Remote автоматизированное кроссбраузерное тестирование — Java
Теперь работаем в связке Java + TestNG + Selenium WebDriver + Selenium Grid + LambdaTest. Тесты с аннотацией @Test принимают параметры, переданные из метода DataProvider. Метод getData задается с аннотацией провайдера данных о браузерах, их версиях, и ОС.
FileName – TestNGToDo.java
import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.Keys; import org.openqa.selenium.Platform; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.annotations.AfterTest; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Parameters; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.TimeUnit; public class TestNGToDo { public static final String username= "user-name"; public static final String auth_key = "access-key"; public RemoteWebDriver driver; public static final String URL= "@hub.lambdatest.com/wd/hub"; boolean status = false; @Test(dataProvider= "Set_Environment") public void login(/* Platform platform_used */ String platform_used, String browser_Name, String browser_Version) { DesiredCapabilities capability= new DesiredCapabilities(); /* * capability.setPlatform(platform_used); * capability.setPlatform(platform_used); * capability.setBrowserName(browser_Name); * capability.setVersion(browser_Version); */ capability.setCapability("platform", platform_used); capability.setCapability("browserName", browser_Name); capability.setCapability("version",browser_Version); capability.setCapability("build", "Java - TestNG_Test: ToDoApp Test"); capability.setCapability("name", "Java - TestNG_Test: ToDoApp Test"); capability.setCapability("network", true);//to enable network logs capability.setCapability("visual", true);//to enable screenshots capability.setCapability("video", true);//to enable video capability.setCapability("console", true);//to enable console logs try { driver = new RemoteWebDriver(new URL("https://" + username + ":" + auth_key + URL), capability); /* driver.set(new RemoteWebDriver(new URL("https://" + username + ":" + auth_key + URL), capability)); */ } catch (Exception e) { System.out.println("Invalid grid URL" + e.getMessage()); } try { driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); driver.get("https://lambdatest.github.io/sample-todo-app/"); driver.findElement(By.name("li1")).click(); driver.findElement(By.name("li2")).click(); WebElement element = driver.findElement(By.id("sampletodotext")); element.sendKeys("Yey, Let's add it to list\n"); Assert.assertEquals(driver.getTitle(), "Sample page - lambdatest.com"); status = true; } catch (Exception e) { System.out.println(e.getMessage()); } } @DataProvider(name="Set_Environment", parallel=true) public static Object[][] getData() { Object[][] Browser_Property = new Object[][] { /* {Platform.WIN10, "chrome", "78.0"}, */ /* {Platform.WIN10, "chrome", "75.0"} */ {"macOS High Sierra", "Safari", "11.0"}, {"Windows 10", "Chrome", "79.0"}, {"Windows 10", "Firefox", "67.0"} }; return Browser_Property; } @AfterTest public void tearDown() { if (driver != null) { ((JavascriptExecutor) driver).executeScript("lambda-status=" + status); driver.quit(); } } }
Параллельная обработка активируется значением parallel=true в DataProvider / getData.
@DataProvider(name="Set_Environment", parallel=true) public static Object[][] getData() { Object[][] Browser_Property = new Object[][] {
Параллельное выполнение 3 тестов.

Статус Completed.

Итак
Автоматизация в Selenium — теперь правило в кроссбраузерном тестировании. Тестирование с локальным Selenium WebDriver не очень масштабируемо; хорошие результаты дают облачные платформы, ускоряющие процесс.
Вопрос-ответ:
Что такое автоматизированное кроссбраузерное тестирование?
Автоматизированное кроссбраузерное тестирование — это выполнение автоматических тестовых сценариев браузерной совместимости в специальных тестовых фреймворках.
Нужно ли автоматизировать кроссбраузерное тестирование?
Да, нужно, но не все тесты. Некоторые лучше делать вручную. В большинстве случаев кроссбраузерные тесты прекрасно автоматизируются. Тест-кейсы, подходящие под автоматизацию: очень длительные; повторяющиеся; сложные; и связанные с рисками.
Как автоматизировать кроссбраузерное тестирование?
Чаще всего кроссбраузерные тесты автоматизируются в Selenium. “Селениум” помогает QA-команде экономить время, высвобождая тестировщиков для задач, требующих особого внимания.