Всем привет. Java + WebDriver. В тесте, при нажатии на ссылку, автоматически происходит скачивание файла в определенную папку. А если вручную, то появляется модальное окно с выбором - открыть/скачать файл. В этом окне присутствует имя файла. Но как в тестах получить это имя файла, не соображу. Где этот контент, откуда можно дернуть данную информацию?
Как вариант:
Проставить дефолтную папку для скачивания файлов (напр. для хрома ), скачать файл, после скачивания искать файл в папке и взять его имя file.getName()
В папке будут складироваться файлы, и проверять нужно будет содержимое того файла, который только что был скачан.
Можно сравнивать время создания файла с текущим временем, или очищать папку перед скачиванием файла.
update: еще можно создать текстовый файл в котором записывать имена всех скачанных файлов и проверять новый файл на отсутствие в этом списке (соответственно при скачивании нового файла, его не будет в списке и такой проверкой можно будет выявить нужное имя ) (но это уже слишком)))
Костыльный вариант, хочется все-таки выдернуть инфу из окна. В ту папку будут разные файлы сливаться, с разными принципами именования файла.
Просто средствами Selenium не получится выдернуть инфу из этого окна, поэтому предлагаю такие варианты) Я бы использовал сравнение времени загрузки файла (Самый не костыльный вариант)
Еще вариант: Перед загрузкой сохранять список скачаных файлов из папки в лист имен, и после загрузки сделать такой же лист имен и сравнивая их найти имя нового файла.
Вот ссылка как сравнивать (на всякий случай))
Так, а в какой момент генерируется имя файла и отдается на с качку? Можно ли это получить через js или сделать как-то еще автоматически? в самой ссылке точно не отдается полный uri к файлу?
Имя файла генерится в момент нажатия на ссылку. Смотрю в сторону HTTPClient, но пока безрезультатно.
Есть возможность показать?
Возможно стоит брать последний измененный файл, у которого расширение != ‘.part’ ?
Показать возможности нет
В библиотеке Selenide есть функция download, которая сама скачивает файл во временную папку и возвращает объект java.ok.File - у него можно спросить имя файл с помощью метода getName(). Попробуйте, это просто:
File file = $(By.name(“myInput”)).download());
Так вам вообще не придётся заморачиваться с окошками и папками.
Я так понимаю, что файл отдается определенным сервисом на бэкэнде при нажатии на кнопку? Вам обязательно ее нажимать? Может проще узнать у девелоперов end-point и дернуть соответствующий сервис самостоятельно? Через HTTP реквест вы запросите байт стрим, а в хэдерах вычитаете имя файла.
неужели нигде на странице при этом не отображается название файла? зачем искать как называется файл, если можно ждать, что файл с определенным именем появится в папке?
Читайте темы внимательней, а не “по-диагонали”.
public File download(WebElement element) throws IOException {
String fileToDownloadLocation = element.getAttribute("href");
@ArtOfLife, спасибо за идею, поговорю с разработчиками, возможно придется именно так сделать.
@tymoschuk_jane, нет, название файла нигде не отображается. Как я узнаю имя файла, чтобы ждать когда он появится в папке?
@vmaximv, результат - http://localhost:9000/reportscheduler/download?id=13684
А что вы тут “динамического” увидели?
@ArtOfLife вам уже ответил:
“Подсмотреть” можете у тов. @asolntsev:
Так у него в href= “http://localhost:9000/reportscheduler/download?id=13684”, вы бы хоть код смотрели как оно работает. Это для самого элементарного случая, ему не подойдет. Надо или через бэкенд получать это значение, либо уже смотреть в папке назначения последний скачанный файл.
Сделал так. В результате в браузере я вижу инфу о хэдере, котором содержится имя файла, а в коде, когда отлаживаю, у меня этот хэдер отсутствует (привожу скрины)
Подумал, может дело в куках. Решил с помощью WD получить куки, и передать их в request, но безрезультатно.
А вы уверены, что правильный end-point дернули? Как вообще отправляете реквест / читаете респонс? Спрашиваю, ибо у вас в скринах явное расхождение. Вы content-type / length видели в идее vs браузер?
text/html
vs text/csv
+ 1174
vs 73126
. Что-то вы явно не то читаете. Не удивительно, что там такого хэдера может не быть.