Открыть список
Как стать автором
Обновить

Комментарии 17

Очень часто вместо ввода пути к файлу в элемент .//input[@type='file'] загрузка происходит при помощи JS. На элемент другого типа вешается событие при срабатывании которого открывается системное окно, а затем скрипт загружает файл на сервер. Какой в этом случае верный способ загрузить файл без изменения кода страницы или поиска нужного скрипта? На каждой странице может быть свой скрипт.

Покажете пример такой реализации?
Для загрузки файлов в опредленное место можно загрузить headless chrome, в опциях которого, можно указать место для загрузки файла по умолчанию. И он не будет открывать окно для запроса места загрузки. А для Firefox можно использовать FirefoxOptions для автоматической загрузки, указать папку и отключить просмотрщик PDF, чтобы PDF тоже качались автоматом.
Ну пример реализации самого контрола я вряд ли покажу, но вот буквально на днях на проекте такое решение вполне устроило по скорости и стабильности работы — помещать путь в буфер обмена, а потом вставлять в открывшееся диалоговое окно:

        StringSelection ss = new StringSelection(путь_к_файлу);
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
        //native key strokes for CTRL, V and ENTER keys
        Robot robot = new Robot();

        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_ENTER);

Робот вставляет в то окно, которое в данный момент в фокусе. А это сложно контролировать. Если тесты не в докере конечно.


А в хедлес режиме ваше решение как себя ведёт?

Ну в будущем предполагается использовать Selenoid, так что по идее должно работать. А вот в headless — не знаю, не уверен что будет работать. Просто это был наиболее простой и быстрый способ выполнить задачу. А в будущем планируется перейти к более правильному пыти — надоедать разработчикам с просьбой добавить «input[type=file]».
«надоедать разработчикам» это отличный, если не лучший подход )
Если не ошибаюсь, то новый загрузчик видео на youtube как раз такой пример. В классической версии загрузчика у них всё чётко — input[@type='file'], а вот в новой не понятно как загрузить видео.
Разве есть среди тех, кто занимается автотестами, те кому нужно объяснять что кнопочка «скачать» на сайте это, как правило, всего лишь ссылка?
Я такой статистикой не владею. Но есть те, кто только начал заниматься. И они иногда задают вопросы, в ответ на которые, проще выслать статью, а не пересказывать каждый раз.
Если бы это всегда была бы всего лишь ссылка, жить было бы гораздо проще.
Бывает, что кнопка — это что угодно с привязанным к нему скриптом, который дернет апишку и уже потом с сервера прилетит ссылка. Или не прилетит.
Ну всё равно в итоге это всегда переход — по ссылке или редиректом. Браузер просто по content-type определяет разпознаёт что данный файл надо не отображать, а сохранить. Нет какой то особой «информации для сохранения файла». Обычный ответ. Зачем путать. Особенно новичков.

content type это как раз и есть та информация )) Согласен, путано выразился.

У нас на проекте было так, что на кнопку хоть как надо было нажимать, что бы запустить логику на странице. Вышли из положения так, что отключали через JS на один раз дефолтный обработчик, который показывал окно:
var script = $"var fileInput = document.querySelector('{fileInputSelector}');" +
                   "var handleClick = (evt) =>" +
                   "{evt.preventDefault();};" +
                   "fileInput.addEventListener('click', handleClick, {once: true});";
 this.driver.ExecuteScript(script);

Дальше как в этой статье.

Чтобы firefox не выдавал окна при загрузке, надо просто поправить параметры запуска, вот так я делал.
Соответственно, он автоматом скачивает в нужную мне папку, дальше нужно только проверить наличие этого файла. Правда у меня в ff жуткие задержки иногда, и тесты не проходят, причина не ясна.
С отправкой, да всё как описано, правда в safari у меня лично не заработало.

Вы правы, для фаерфокса можно подготовить профиль. Жаль что такой способ только для фаерфокса и работает.

Ну так chrome, ie, edge, safari по-умолчанию не блочат процесс окнами, это большая часть браузеров)

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.