Playwrightium

Зачем

Мне нравится Java. Мне нравится Selenium. Мне нравится Selenide. Но также мне нравится Playwright Java. 

Я хочу использовать все (или почти все) возможности Playwright и продолжать использовать синтаксис Selenide. 

Что делать? Я сделал Playwrightium.

Как ставится

Maven 

Добавить в pom.xml.

Добавить зависимость:

<dependency>
    <groupId>io.github.britka</groupId>
    <artifactId>playwrightium</artifactId>
    <version>LAST_VERSION</version>
</dependency>

Gradle

implementation 'io.github.britka:playwrightium:LAST_VERSION'

Эта зависимость инкапсулирует:

  • Selenide 
  • Playwright Java

Работает как обычный Webdriver

Вы можете использовать его как обычный Webdriver:

WebDriver driver = new PlaywrightiumDriver();
driver.get("https://example.com");
driver.findElement(By.name("username")).sendKeys("Some value");
driver.findElement(By.cssSelector("input[value=submit][name=submitbutton]")).click();

Если нужно больше примеров, прошу, они здесь.

При первом запуске в Playwright будут установлены образы браузеров:

  • chromium
  • firefox
  • webkit (Safari)

После установки тест будет запущен.

Если вы хотите пропустить загрузку одного из браузеров, можно настроить это с помощью PlaywrightiumOptions и укажите Playwrightium использовать локальный браузер.

Пример:

PlaywrightiumOptions playwrightiumOptions = new PlaywrightiumOptions();
playwrightiumOptions.setSkipDownloadBrowsers(true);
playwrightiumOptions.setBrowserName(Browsers.CHROME_CHANNEL);
PlaywrightiumDriver playwrightiumDriver = new PlaywrightiumDriver(playwrightiumOptions);

Что умеет Playwrightium

Переход на URL

driver.get("https://examle.com");

Поиск элементов и коллекций элементов по различным локаторам:

  • By.xpath
  • By.cssSelector
  • By.id
  • By.name
  • By.linkText
  • By.partialLinkText
  • By.className
  • By.tagName

Например:

WebElement xpathElement = driver.findElement(By.xpath("//label[text()='Some text']"));
WebElement cssElement = driver.findElement(By.xpath("//label[text()='Some text']"));

List<WebElement> elementList = driver.findElements(By.name("any name"));

Также вы можете использовать локаторы Playwright (здесь оф.документация)

Для этого используйте класс PlaywrightiumBy:

  • PlaywrightiumBy.byRole
  • PlaywrightiumBy.byAltTextbyLabel
  • PlaywrightiumBy.byPlaceholder
  • PlaywrightiumBy.byTestId
  • PlaywrightiumBy.byText
  • PlaywrightiumBy.byTitle 

Например:

import org.openqa.selenium.WebElement;

WebElement submitButton = driver.findElement(PlaywrightiumBy.byRole(AriaRole.BUTTON, AriaRoleOptions.builder().setName("submit").build()));
WebElement driver.findElement(PlaywrightiumBy.byLabel("LabeText", true));

Работа с WebElements

Например:

var name = element.getAttribute("name");
element.click();
element.isDisplayed();
element.getText();

Важно! Метод sendKeys работает быстро и плавно. Но метод Selenide setValue может работать медленно. Этот метод делает много полезного. Поэтому, если есть возможность, используйте sendKey из Playwrightium.

Переключаться на фрейм

driver.switchTo().frame("frameName");

Работать с веб-элементом Select

ISelect select = new PlaywrightiumSelect(driver.findElement(By.name("dropdown"))); 
select.selectByValue("dd"+faker.number().numberBetween(1,7));
String selectValue = select.getFirstSelectedOption().getAttribute("value");

Используйте ожидания:

 new WebDriverWait(driver, Duration.ofSeconds(10)).
    until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//h1[contains(.,'Processed Form Details')]")));

Алерты

Но для этого необходимо хорошо знать, как они работают в Playwright.

// At first describe what we want to do with alert
Alert alert = driver.switchTo().alert();
alert.sendKeys(testString);
alert.accept();

// After we do some actions that will lead to alert appearance.
driver.findElement(By.id("promptexample")).click();

// After we can make some checks
assertThat(alert.getText()).isEqualTo("I prompt you");

Класс Actions

new Actions(driver).moveToElement(driver.findElement(By.id("someId"))).build().perform();

Важно. Некоторые функции находятся в стадии разработки. Поэтому я не могу гарантировать, что всё будет работать нормально.

Запускать JS-скрипты

((JavascriptExecutor)driver).executeScript("return alert();");

Захватывать видео

Инициализируйте драйвер Playwrightium с помощью класса PlaywrightiumOptions:

PlaywrightiumOptions playwrightiumOptions = new PlaywrightiumOptions();
playwrightiumOptions.setRecordVideo(true);

driver =new PlaywrightiumDriver(playwrightiumOptions);

Это создаст папку ‘builds/video’ в корне вашего проекта.

или инициализируйте папку с видео:

PlaywrightiumOptions playwrightiumOptions = new PlaywrightiumOptions();
playwrightiumOptions.setRecordVideo(true);
playwrightiumOptions.setRecordsFolder(Path.of("videosFolder"));
driver =new PlaywrightiumDriver(playwrightiumOptions);

Это создаст папку ‘videosFolder‘ в корне вашего проекта.

Если инициализировать драйвер в разделе BeforeAll (или аналогичном), он запишет все тесты в один видеофайл. Чтобы записать видео отдельных тестов, необходимо инициализировать браузер перед каждым тестом.

Этот метод будет работать везде: локально, в Selenoid, Selenium Grid, Aerokube Moon.

Как работает эта функция.

Для браузеров на базе Chromium Playwright пытается использовать протокол CDP для скринкастинга контекста браузера и сбора скриншотов, после чего использует ffmpeg для создания видео из изображений.

Удаленный запуск

Использование Selenoid или Selenium Grid

Это будет работать только с браузерами на основе Chromium (Chromium, Chrome, MS Edge, Opera и т.д.).

Инициализируйте драйвер Playwrightium с помощью класса PlaywrightiumOptions:

PlaywrightiumOptions playwrightiumOptions = new PlaywrightiumOptions();
playwrightiumOptions.setConnectionByWS(false);
playwrightiumOptions.setHeadless(true);
return new PlaywrightiumDriver("http://localhost:4444/wd/hub",chromeOptions);

chromeOptions.setConnectionByWS(false); говорит нам о том, что мы будем использовать http-соединения, как при обычном подключении к Selenoid или Selenium Grid.

Использование Aerokube Moon

Работает со всеми браузерами. 

Инициализируйте драйвер Playwrightium с помощью класса PlaywrightiumOptions:

PlaywrightiumOptions playwrightiumOptions = new PlaywrightiumOptions();
playwrightiumOptions.setConnectionByWS(true);
playwrightiumOptions.setHeadless(true);
return new PlaywrightiumDriver("http://localhost:4444/wd/hub",playwrightiumOptions);

chromeOptions.setConnectionByWS(true); говорит нам о том, что мы будем использовать ws-соединения, как и при обычном подключении к Aerokube Moon.

Как использовать с Selenide

Для этого обходимо реализовать интерфейс WebDriverProvider. Например:

public class PWDriverProvider implements WebDriverProvider {
    @Nonnull
    @Override
    public WebDriver createDriver(@Nonnull Capabilities capabilities) {
        PlaywrightWebdriverOptions playwrightiumOptions = new PlaywrightWebdriverOptions();
        playwrightiumOptions.merge(capabilities);
        return new PlaywrightiumDriver(playwrightiumOptions);
    }
}

Тогда нужно использовать его с Configuration.

Configuration.browser = PWDriverProvider.class.getName();

Список всех доступных опций Playwrightium

Таблица — по ссылке.

Трейсинг

Если тесты были запущены с использованием опции enableTracing, по умолчанию файл tracing.zip должен быть создан в папке {projectRootDirectory}/tracing/

Для запуска просмотра трассировки:

viewTracing.sh path/to/your/tracing.zip

Сергей Брит, контрибьютор Selenide


Презентация на Selenium Conf

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

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

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

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

Мы в Telegram

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

? Популярное

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

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

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

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

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

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

live

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