Программно загрузить / добавить файл через Dropzone, например, Selenium
Я пишу тестовый пример Selenium, где одним из шагов является загрузка файла через Dropzone.js.
(Как Selenium может запускать Javascript в браузере, так что если это можно сделать программно в Javascript, это тоже подойдет.)
Я хочу избегать всего, чтобы имитировать открытие окна браузера файлов, выбор файла и т. Д., Поскольку это выходит за рамки возможностей веб-драйвера и становится очень сложным. В псевдокоде я хотел бы сделать что-то вроде этого:
1. Select some Dropzone element
2. Set file path
3. Submit (upload the file)
Существует один вероятный подход, упомянутый в существующем вопросе ( Невозможно загрузить файл с помощью веб-драйвера python selenium на http://www.dropzonejs.com), который использует элемент "dz-hidden-input" (ввод файла DOM).
К сожалению, это не работает (по крайней мере, не в текущей версии Dropzone) - после установки файла в элемент. Dropzone.files все еще пуст и загрузка не происходит.
Посмотрев источник Dropzone, я нашел рабочее решение, расширив вышесказанное:
1. Set file path in the "dz-hidden-input" element
2. Use javascript to retrieve the File object from the element
3. Pass the file to dropzone.addFile(file)
Но меня беспокоит то, что это действительно хак, так как скрытый ввод и.addFile не документированы, и тест в будущем прервется, если Dropzone изменит реализацию и т. Д.
Есть ли лучший / документированный способ сделать это?
(Чтобы уточнить - я пытаюсь загрузить новый файл, а не показывать существующий файл, как указано в FAQ по Dropzone)
1 ответ
Нажмите кнопку "Ввод" -> "Использовать буфер обмена веб-драйвера / Java-робот" -> "Вставить / указать местоположение файла + имя файла"> "Ввести робота".
final String fileName = "textfile.txt";
final String filePath = "\\data\\public\\other\\" + fileName;
zUploadFile (filePath );
public void zUploadFile (String filePath) throws HarnessException {
// Put path to your image in a clipboard
StringSelection ss = new StringSelection(filePath);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
// OR use java robot for entire filepath
Thread.sleep(10000);
// Imitate mouse events like ENTER, CTRL+C, CTRL+V
Robot robot;
try {
robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
} catch (AWTException e) {
e.printStackTrace();
}
}