Автоматизация кроссбраузерного тестирования на Java/Python/JS — гайд

Разберем основы автоматизации кроссбраузерного тестирования, делая упор на главном инструменте — Selenium. Также коснемся параллельного выполнения тестов на разных фреймворках Java, Python, JavaScript.

Почему автоматизируют

Кроссбраузерное тестирование нужно для проверки User Experience. Бывают челенджи, когда нужно настраивать локальную инфраструктуру на выполнение множества разнообразных тестов на всех платформах. Это расход труда тестировщиков, да и денежных средств, на автоматизированное тестирование на всех возможных браузерах, девайсах и платформах. Понятно, что локальная инфраструктура не лучший вариант, особенно на больших проектах она вряд ли масштабируема; есть смысл смотреть в сторону “внешних”, облачных платформ автоматизированного тестирования.

Поэтому автоматизированное кроссбраузерное тестирование в облаке — хорошее решение. Созданы и прекрасно работают достаточно качественные инструменты, более-менее гарантируется эффективность, масштабируемость, реюзабельность.

Приступая к автоматизации, и уже имея план/стратегию тестирования, QA-отдел грамотно сочетает ручное и автоматизированное тестирование, в зависимости от типа тестовых сценариев, их сложности. Ручное тестирование всех функций сайта или веб-приложения — это долго и дорого. Тестирование бывает затратным, длительным, и попросту муторным, если сделать все неправильно с самого начала.

Автоматизация идет лучше, если QA применяют проверенные инструменты (в частности опенсорсные) и пишут грамотные тестовые скрипты

Автоматизация в Selenium уже много лет как «золотое правило» в QA-индустрии; фреймворк поддерживает все основные браузеры и операционные системы. Отлично работает с языками программирования Python, Java, JavaScript, C#, Ruby (то есть всеми возможными, с которыми имеет, или может иметь дело, тестировщик в 2022 году). На этих языках делают тесты для Selenium.

Преимущества автоматизированного кроссбраузерного тестирования:

  • Возможность протестировать во всех браузерах и ОС
  • Экономия времени; возможность масштабировать тесты, передав на автоматизацию стандартные и повторяемые задачи
  • Быстрое выполнение тестов — поддерживается параллельное выполнение
  • Быстрая подстройка к поступающим изменениям требований заказчика
  • Хорошее тестовое покрытие
  • Ускорение релиза
  • Простота: автоматизация уже достаточно простой процесс для тестировщика-новичка

Как перейти от ручного тестирования к автоматизации

Ручное тестирование предполагает поэтапное выполнение тест-кейса, “по шагам”. Если тест-кейс большой и сложный, конечно уйдет много времени на выполнение тест-кейсов вручную на каждом браузере. Поэтому QA-отделы пытаются автоматизировать тест-кейсы’; понятно, что все тест-кейсы автоматизировать не получится. При переходе к автоматизации желательно руководствоваться такими общими соображениями:

  1. Пиши небольшие и простые тест-кейсы — потому что они должны быть “легкими” и пригодными для повторного применения в другом тест-кейсе. Уже в начале процесса можно понять, подходит ли автоматизация для конкретного приложения/сайта, и в каком масштабе.
  2. Если подходит, автоматизируем дальше и другие кейсы. Расширяем автоматизацию, по покрытию и по типам. Тест-кейсы, не подходящие для автоматизации, возвращаем на ручное тестирование.
  3. Распланируй тест-кейсы по модулям, и обозначь тегами, чтобы проще было искать потом. Модульность и теги — улучшат тестовое покрытие и упростят отчеты.
  4. Старайся сначала протестировать вручную все новое в приложении, и далее делай автоматизацию тест-кейсов, исходя из приоритетов в бизнес-требованиях.
  5. Пользуйся аналитикой поведения пользователей на самых ходовых, часто используемых браузерах и девайсах. Это поможет сфокусироваться на главном.

Какие тесты автоматизируются

Тест-кейсы, которые используются редко, лучше оставить на ручное тестирование; должны автоматизироваться часто используемые тест-кейсы, или с большими объемами данных. Хорошо бы автоматизировать смок-тесты и регрессионные тесты. Тогда автоматизация действительно “упорядочивает тестовый цикл, ускоряет релиз продукта, экономит труд 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 для браузеров.

БраузерГде скачать
Operahttps://github.com/operasoftware/operachromiumdriver/releases
Firefoxhttps://github.com/mozilla/geckodriver/releases
Chromehttp://chromedriver.chromium.org/downloads
IEhttps://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver
Microsoft Edgehttps://developer.microsoft.com/en-us/microsoft-edge/tools/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 — тест выполнен успешно:

eclipse выполнение автотестов seleniumАвтоматизация через remote-драйвер Selenium Grid

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

Поэтому надо уметь тестировать через remote Selenium Grid. Так проверяем разные версии браузеров, повышаем тестовое покрытие. Существуют облачные платформы, позволяющие протестировать на 2000+ версиях браузеров. Та же LambdaTest — нужно создать аккаунт, взять юзернейм и ключ из профиля, посмотреть на дашборд и capabilities-генератор.

Работаем с тем же тестом, что в разделе выше (о локальном Selenium WebDriver). 

  1. Переходим к приложению https://lambdatest.github.io/sample-todo-app/, используя выбранные браузеры.
  2. Выбираем первые два элемента.
  3. Добавим текст “Let’s add it to list” в поле.
  4. Нажмем кнопку “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-команде экономить время, высвобождая тестировщиков для задач, требующих особого внимания.

источник

Какой была ваша первая зарплата в QA и как вы искали первую работу?

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Мы в Telegram

Наш официальный канал
Полезные материалы и тесты
Готовимся к собеседованию
Project- и Product-менеджмент

🔥 Популярное

💬 Telegram-обсуждения

Наши подписчики обсуждают, как искали первую работу в QA. Некоторые ищут ее прямо сейчас.
Наши подписчики рассказывают о том, как не бояться задавать тупые вопросы и чувствовать себя уверенно в новой команде.
Обсуждаем, куда лучше податься - в менеджмент или по технической ветке?
Говорим о конфликтных ситуациях в команде и о том, как их избежать
$1100*
медианная зарплата в QA в июне 2023

*по результатам опроса QA-инженеров в нашем телеграм-канале

Собеседование

19%*
IT-специалистов переехало или приняло решение о переезде из России по состоянию на конец марта 2022

*по результатам опроса в нашем телеграм-канале

live

Обсуждают сейчас