Selenide скачивание файла, полученного с бекенда (JAVA)

Добрый день!
У меня задача проверить скачанный файл. Проблема в том, что это не просто ссылка на скачивание файла, мы получаем его с бека. При нажатии на кнопку скачивания делается запрос в API, после получения ответа, контент файла записывается в сам файл и скачивается.

Подскажите, как мне его отловить? Буду благодарна любым идеям)

Сейчас я пробую следующий вариант:

Configuration.fileDownload = FileDownloadMode.PROXY;
Configuration.proxyEnabled = true;
SelenideProxyServer proxy = new SelenideProxyServer(new StaticConfig(), null);
proxy.start();
// т.к драйвер уже запущен
WebDriverRunner.setWebDriver(WebDriverRunner.getWebDriver(), proxy);
File file = element.downloadInvoice();

Ошибка:

java.io.FileNotFoundException: Failed to download file {By.xpath: //*[@type=‘submit’ or @class=‘submit-button’]} in 20000 ms.
at com.codeborne.selenide.impl.Downloads.firstDownloadedFile(Downloads.java:75)
at com.codeborne.selenide.impl.DownloadFileWithProxyServer.clickAndInterceptFileByProxyServer(DownloadFileWithProxyServer.java:78)
at com.codeborne.selenide.impl.DownloadFileWithProxyServer.lambda$download$0(DownloadFileWithProxyServer.java:43)
at com.codeborne.selenide.impl.WindowsCloser.runAndCloseArisedWindows(WindowsCloser.java:25)
at com.codeborne.selenide.impl.DownloadFileWithProxyServer.download(DownloadFileWithProxyServer.java:42)
at com.codeborne.selenide.commands.DownloadFile.execute(DownloadFile.java:57)
at com.codeborne.selenide.commands.DownloadFile.execute(DownloadFile.java:23)
at com.codeborne.selenide.commands.Commands.execute(Commands.java:152)
at com.codeborne.selenide.impl.SelenideElementProxy.dispatchAndRetry(SelenideElementProxy.java:104)
at com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:70)
at com.sun.proxy.$Proxy92.download(Unknown Source)

Что-то вы переусложнили.

Нет смысла запускать прокси ПОСЛЕ того, как драйвер запущен - он не увидит вашего прокси.

Всё намного проще:

  1. ДО открытия браузера:
    Configuration.fileDownload = FileDownloadMode.PROXY;
    Configuration.proxyEnabled = true;

  2. В любой момент:
    File file = element.downloadInvoice();

1 лайк

Проблема в том, что весь запуск браузера происходит глубоко в недрах кора, куда не хотелось лезть. Но, как оказалось, придется)

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

1 лайк

Сделала инициализацию прокси до запуска

Configuration.fileDownload = FileDownloadMode.PROXY;
Configuration.proxyEnabled = true;
//Используя рабочий Selenium прокси:
selenideProxy = new SelenideProxyServer(new StaticConfig(), proxy);
selenideProxy.start();
WebDriverRunner.setWebDriver(new ChromeDriver((ChromeOptions) capabilities), selenideProxy);

Но все равно получаю ошибку:

java.io.FileNotFoundException: Failed to download file {By.xpath: //*[@type=‘submit’ or @class=‘submit-button’]} in 50000 ms.
at com.codeborne.selenide.impl.Downloads.firstDownloadedFile(Downloads.java:75)
at com.codeborne.selenide.impl.DownloadFileWithProxyServer.clickAndInterceptFileByProxyServer(DownloadFileWithProxyServer.java:78)
at com.codeborne.selenide.impl.DownloadFileWithProxyServer.lambda$download$0(DownloadFileWithProxyServer.java:43)
at com.codeborne.selenide.impl.WindowsCloser.runAndCloseArisedWindows(WindowsCloser.java:25)
at com.codeborne.selenide.impl.DownloadFileWithProxyServer.download(DownloadFileWithProxyServer.java:42)
at com.codeborne.selenide.commands.DownloadFile.execute(DownloadFile.java:57)

Нет-нет, вы создаёте new ChromeDriver только с одним параметром capabilities, и он всё ещё ничего не знает про селенидовский прокси.

Зачем вы вообще создаёте свой ChromeDriver? В большинстве случаев это не нужно, ведь селенид и так создаёт правильный ChromeDriver за вас.

В setWebDriver я передаю прокси в качестве второго параметра
Если сделать вызов WebDriverRunner.getSelenideProxy() то возвращается корректный прокси.
Фактически, в capabilities тоже лежит прокси (capabilities.setCapability(CapabilityType.PROXY, proxy)) т.е. прокси известен.

Вся работа с селенидом сделана как надстройка над инициализацией драйверов для селениума. Для работы с файлами в селениуме мы использовали прокси, но в данном конкретном случае это не получается сделать, т.к. при скачивании, Content-Type: application/json и прокси “слушает” большинство лишних запросов.
Ощущение, что селенид тоже пропускает нужный нам запрос. А где происходит та самая “утечка” я не вижу

Ох, всё сложно… Ну ладно, тогда вроде должно работать.

  1. Селенидовский метод $.download() должен вывести в лог все респонсы, которые он вообще получил. У вас в логах они видны? Среди них есть нужный?
  2. Чтобы помочь прокси отыскать нужный среди запрос среди кучи левых, стоит вызывать метод download с параметром: File f = download(withName("hello_world.txt")). См. примеры.
  3. А можно вообще попробовать без прокси, с помощью нового способа FOLDER: selenide/FileDownloadToFolderTest.java at main · selenide/selenide · GitHub

Нет, вообще ничего не получил похоже:

Just in case, all intercepted responses: Intercepted 0 responses:

Попробую использовать FOLDER, к прокси уже со всех сторон попыталась подойти и все тщетно

Фраза “Intercepted 0 responses” всё-таки говорит о том, что браузер не использует прокси.

Кстати, а запросы не к localhost случайно? По умолчанию браузер не пропускает их через прокси.

Кстати, я так и не понял, зачем вы вообще создаёте свой ChromeDriver. Из-за этого же все проблемы.

1 лайк

Нет, не к локалхосту.
Почему создаётся ChromeDriver. В зависимости от режима запуска тестов, добавляются настройки в capabilities. И создаётся ChromeDriver/Firefox/RemoteWebDriver и тд…

Боюсь сказать, что это уже так сложилось(задолго До) и на это сверху я пытаюсь навешать Селенид. Все шло хорошо, пока не появилась задача по проверке скачанного инвойса.

Все получилось с FOLDER. Спасибо большое за помощь!

@asolntsev @rid00dle а FOLDER может работать со скачиванием файла полученным по api?

Ну конечно. Всем методам, кроме HTTPGET, наплевать, откуда взялся файл. Если он оказался в папке - он скачался.