Очередная статья по теме настроек Selenide, которая затрагивает сетевые настройки.
ProxyEnabled
Одна из важных настроек, которая используется при тестировании с помощью Selenide. Включая прокси, мы запускаем браузер через прокси-сервер, что дает нам доступ к запросам и сетевому трафику.
Перед тем как работать с прокси необходимо добавить зависимость в свой проект:
maven
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>selenide-proxy</artifactId>
<version>7.9.3</version>
</dependency>
gradle
implementation("com.codeborne:selenide-proxy:7.9.3")
Для демонстрации работы прокси напишем тест, который открывает канал, выполнит поиск и получим доступ к трафику:
@Test
@DisplayName("Тест открытия канала через Proxy")
public void testWithProxy() {
Configuration.baseUrl = "https://dzen.ru";
Configuration.proxyEnabled = true;
Configuration.proxyHost = "127.0.0.2";
Configuration.proxyPort = 12345;
Selenide.open("/id/65d7431f1759d9595653fed1");
// Получаем прокси
com.browserup.bup.BrowserUpProxy proxy = WebDriverRunner.getSelenideProxy().getProxy();
// Говорим что будем отслеживать все (При желании можно выбрать конкретные типы файлов)
proxy.setHarCaptureTypes(CaptureType.getAllContentCaptureTypes());
// Говорим, что будем запоминать контент запросов и ответов
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
// Отсюда начинается запись трафика
proxy.newHar("MyHar");
Selenide.$x(".//input[@name='query']").as("Строка запроса").shouldBe(Condition.visible).val("Записки тестировщика");
Selenide.$x(".//button[@aria-label='Кнопка Найти']").as("Кнопка найти").shouldBe(Condition.visible).click();
Selenide.$x(".//div[@id='LayoutContentMicroRoot']").as("Контент запроса").shouldBe(Condition.visible);
// Сетевые запросы
List<HarEntry> records = proxy.getHar().getLog().getEntries();
System.out.println("proxy port: " + proxy.getPort());
System.out.println(records.size());
Selenide.closeWebDriver();
}
В итоге видим, что в список "records" попали сетевые запросы
Эта фитча дает возможность почувствовать себя немного хакерменом, не так ли)
ProxyHost и ProxyPort
Позволяет выполнить тонкую настройку сервера прокси
По умолчанию хост определяется как IP машины, на которой выполняются тесты, а порт - "0"
В предыдущем примере можно увидеть данные настройки, и думаю, этой информации на данный момент будет достаточно, лучше вопрос про прокси рассмотреть в другой статье подробнее.
DownloadsFolder
Параметр настройки папки для скачивания файлов. По умолчанию "build/downloads". Тут по моему мнению все понятно: сюда будут скачиваться файлы)
FileDownload
Настройка, которая отвечает за стратегию загрузки файлов.
Существует несколько:
1. С помощью HTTP (по умолчанию) - файл скачивается с помощью HTTP.
Важно понимать, данный метод работает либо по прямой ссылке на скачивание, либо в теге <a href=.../>
Задается следующим образом:
Configuration.fileDownload = FileDownloadMode.HTTPGET;
Для примера я выложил файл на Google Disk(Возможно ссылка будет не валидна, но всегда можно найти в интернете и подменить) и давайте его скачаем:
@Test
@DisplayName("Загрузка файла методом HTTP")
public void downloadFileViaHttp() throws URISyntaxException, IOException {
// Складывать файлы загрузки будем в папку download/http рядом с проектом
Path root = Paths.get("download", "http");
if(!Files.exists(root))
Files.createDirectories(root);
// Настройка папки для скачивания файлов
Configuration.fileDownload = FileDownloadMode.HTTPGET;
Configuration.downloadsFolder = root.toAbsolutePath().toString();
Selenide.open("https://google.com/");
File download = Selenide.download("https://drive.usercontent.google.com/u/0/uc?id=1jd_gIsMtUwHodtL_NoJ-s6h1_gRHKRtl&export=download");
System.out.println(download.getAbsolutePath());
}
После скачивания получим файлик "hello.txt" в папке "download", который в свою очередь в коде запишется в переменную download
2. В загружаемую папку.
Данная стратегия работает вне зависимости от атрибутов и ссылок, скачивает как есть в папку
Задается следующим образом:
Configuration.fileDownload = FileDownloadMode.FOLDER;
Внесем изменения в предыдущий пример
@Test
@DisplayName("Загрузка файла методом FOLDER")
public void downloadFileViaFolder() throws URISyntaxException, IOException {
// Складывать файлы загрузки будем в папку download/folder рядом с проектом
Path root = Paths.get("download", "folder");
if(!Files.exists(root))
Files.createDirectories(root);
// Настройка папки для скачивания файлов
Configuration.fileDownload = FileDownloadMode.FOLDER;
Configuration.downloadsFolder = root.toAbsolutePath().toString();
Selenide.open("https://google.com/");
File download = Selenide.download("https://drive.usercontent.google.com/u/0/uc?id=1jd_gIsMtUwHodtL_NoJ-s6h1_gRHKRtl&export=download");
System.out.println(download.getAbsolutePath());
}
Результат будет аналогичен - в папке download/folder появился файлик
3. Через CDP (chrome dev tools/Инструменты разработчика chrome).
Итак, этот вариант, судя по расшифровке, работает ТОЛЬКО в Google Chrome. Подробнее об этой технологии рассмотрим в другой статье, а сейчас просто посмотрим как скачивается файл.
Задается следующим образом:
Configuration.fileDownload = FileDownloadMode.CDP;
Снова исправляем настройку в тесте
@Test
@DisplayName("Загрузка файла методом CDP")
public void downloadFileViaCDP() throws URISyntaxException, IOException {
// Складывать файлы загрузки будем в папку download/cdp рядом с проектом
Path root = Paths.get("download", "cdp");
if(!Files.exists(root))
Files.createDirectories(root);
// Настройка папки для скачивания файлов
Configuration.fileDownload = FileDownloadMode.CDP;
Configuration.downloadsFolder = root.toAbsolutePath().toString();
Selenide.open("https://google.com/");
File download = Selenide.download("https://drive.usercontent.google.com/u/0/uc?id=1jd_gIsMtUwHodtL_NoJ-s6h1_gRHKRtl&export=download");
System.out.println(download.getAbsolutePath());
}
И получаем аналогичный результат
4. Через Proxy
Данная стратегия требует, чтобы был включен прокси сервер, соответственно мы увидим сколько запросов прошло, прежде чем получить файл
Формируем тест
@Test
@DisplayName("Загрузка файла методом Proxy")
public void downloadFileViaProxy() throws URISyntaxException, IOException {
// Складывать файлы загрузки будем в папку download/cdp рядом с проектом
Path root = Paths.get("download", "proxy");
if(!Files.exists(root))
Files.createDirectories(root);
// Настройка папки для скачивания файлов
Configuration.proxyEnabled = true;
Configuration.fileDownload = FileDownloadMode.PROXY;
Configuration.downloadsFolder = root.toAbsolutePath().toString();
Selenide.open("https://google.com/");
// Получаем прокси
com.browserup.bup.BrowserUpProxy proxy = WebDriverRunner.getSelenideProxy().getProxy();
// Говорим что будем отслеживать все (При желании можно выбрать конкретные типы файлов)
proxy.setHarCaptureTypes(CaptureType.getAllContentCaptureTypes());
// Говорим, что будем запоминать контент запросов и ответов
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT, CaptureType.RESPONSE_BINARY_CONTENT);
// Отсюда начинается запись трафика
proxy.newHar("MyFileHar");
File download = Selenide.download("https://drive.usercontent.google.com/u/0/uc?id=1jd_gIsMtUwHodtL_NoJ-s6h1_gRHKRtl&export=download");
// Сетевые запросы
List<HarEntry> records = proxy.getHar().getLog().getEntries();
System.out.println("Количество запросов: " + records.size());
System.out.println(download.getAbsolutePath());
}
В результате получим снова аналогичный результат
Как можно увидеть, как не крути все один результат (вспоминаем мем про человека-паука), однако, разница в методах, которые, в свою очередь, отвечают определенной задаче.
Remote, RemoteConnectionTimeout, RemoteReadTimeout
Так же стоит упомянуть эти три настройки в контексте данной статьи, но раскрою я их позже, когда буду писать о Selenium Grid, а пока проста напишу за что отвечают:
remote - URL удаленного драйвера,
remoteConnectionTimeout - Лимит ожидания соединения с удаленным драйвером (по умолчанию - 10000 мс)
remoteReadTimeout- Лимит ожидания ответа от удаленного драйвера (по умолчанию - 90000 мс)
ps.
Кто это уже знал - красавчики, кто не знал - стали тоже красавчиками) Спасибо, что прочитали) И если не заняты вечными созвонами с тимэйтами, нажмите подписаться)
Ссылка на репозиторий
Selenide Configuration. Часть 1
Selenide Configuration. Часть 2