- Как ставится
- Работает как обычный 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