Как получить имя файла из модального окна?

Всем привет. 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 реквест вы запросите байт стрим, а в хэдерах вычитаете имя файла.

неужели нигде на странице при этом не отображается название файла? зачем искать как называется файл, если можно ждать, что файл с определенным именем появится в папке?

1 лайк

Читайте темы внимательней, а не “по-диагонали”.

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. Что-то вы явно не то читаете. Не удивительно, что там такого хэдера может не быть.