Комментарии 17
Очень часто вместо ввода пути к файлу в элемент .//input[@type='file']
загрузка происходит при помощи JS. На элемент другого типа вешается событие при срабатывании которого открывается системное окно, а затем скрипт загружает файл на сервер. Какой в этом случае верный способ загрузить файл без изменения кода страницы или поиска нужного скрипта? На каждой странице может быть свой скрипт.
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);
Робот вставляет в то окно, которое в данный момент в фокусе. А это сложно контролировать. Если тесты не в докере конечно.
А в хедлес режиме ваше решение как себя ведёт?
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 у меня лично не заработало.
Единственно верный способ загружать и скачивать файлы в Selenium тестах