Использование метода .download() за proxy

selenide
Теги: #<Tag:0x00007f7b6d1d2eb0>

(Michael Ivanko) #1

Есть кнопка, по нажатии на которую, AJAX-ом отправляется POST запрос на получение файла.

Напрашивается решение: использовать метод .download() с указанием Configuration.fileDownload = FileDownloadMode.PROXY;

Но проблема заключается в том, что я и так сижу за корпоративной проксёй. В следствии чего получаю “Bad Gateway: /”, т.к. в настройках Firefox, запускаемого selenide, прописывается порт 36909, который слушает BrowserMobProxy. И он ничего про корпоративную прокси не знает.

Можно ли для BrowserMobProxy указать корпоративную прокси в качестве родительской прокси?


(asolntsev) #2

@Michael_Ivanko Конечно можно!
В селениде для этого есть специальный метод: WebDriverRunner.setProxy(myCorporateProxy);


(Michael Ivanko) #3

Спасибо, указание прокси через WebDriverRunner.setProxy помогло. Теперь страницы открываются через прокси.
Но со скачиванием файла словил ещё одну проблему.

// Проверяем скачивание файла по кнопке "Скачать Excel"
        try {
            File excel = $("button.download-excel").download();
            System.out.println(excel.exists());
            System.out.println(excel.length());
        } catch (FileNotFoundException exception) {
            System.out.println("Невозможно скачать файл \"План проверок\"->\"скачать Excel\"");
            System.out.println(exception);
        }

В результате выполнения данного теста файл скачивается, но ловлю exception, в котором 2 успешно выполненных запроса

Невозможно скачать файл "План проверок"->"скачать Excel"

java.io.FileNotFoundException: Failed to download file {button.download-excel} in 15000 ms.Intercepted 2 responses.
http://***.adc.spb.ru/examinations/excel/ -> 200 "OK" {X-Cache=MISS from ***.iac.spb.ru, Server=nginx/1.14.1, Cache-Control=private, must-revalidate, X-Cache-Lookup=MISS from ***.iac.spb.ru:3128, Pragma=no-cache, Expires=-1, Proxy-Connection=Close, Content-Length=76, Date=Tue, 27 Nov 2018 13:47:13 GMT, Content-Type=applications/json, Via=1.1 ***.iac.spb.ru (squid/3.3.8)} applications/json  (76 bytes)

http://***.adc.spb.ru/photos/documents/download6ac551fb0732b987850051189e14e14d.xlsx -> 200 "OK" {Accept-Ranges=bytes, X-Cache=MISS from ***.iac.spb.ru, Server=nginx/1.14.1, ETag="5bfd4af2-b639", X-Cache-Lookup=MISS from ***.iac.spb.ru:3128, Last-Modified=Tue, 27 Nov 2018 13:47:30 GMT, Content-Length=46649, Proxy-Connection=Keep-Alive, Date=Tue, 27 Nov 2018 13:47:13 GMT, Content-Type=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, Via=1.1 ***.iac.spb.ru (squid/3.3.8)} application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  (44645 bytes)

Проблема оказалась в том, что метод .download() определяет скачиваемые файлы по http-заголовку Content-Disposition. Собственно, на описание того как работает .download() нашёл только в новости про версию selenide-3.9.1 - https://ru.selenide.org/2016/08/27/selenide-3.9.1/
Мне кажется, что это описание стоит перенести в документацию https://selenide.gitbooks.io/user-guide/content/ru/selenide-api/selenide-element.html, т.к. не все разработчики заморачиваются с отправлением всех нужных http-заголовков.


(asolntsev) #4

@Michael_Ivanko Спасибо. В одной из последних версий мы улучшили скачивание файлов без заголовков: https://ru.selenide.org/2018/11/07/selenide-5.0.1/

P.S. Да, документацию надо улучшить, но конкретно упомянутый gitbook не наш.