- Как ставится
- Работает как обычный Webdriver
- Что умеет
- Как использовать с Selenide
- Список всех доступных опций
- Трейсинг
Зачем
Мне нравится 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