Upload file или вечные проблемы с загрузкой файла на сервис

Всем доброе время суток.

Я работаю с веб-сервисом. Фреймворк на Java.
Так вот, у меня вечно проблема - с загрузкой файла на сервис.

Сколько я всего перечитал и переделал уже, и всё равно проблемы. Всё что пишут driver.findElement(By,id(uploadButton)).sendKeys(pathToFile) вообще не срабатывает. Использовал и AutoIt, и Robot.

А проблема всегда в том, что скрипт открывает диалоговое окно и:

  1. Или не прописывает путь к файлу.
  2. Или просто потом не нажимает на кнопку.

Буду благодарен за совет.
Спасибо за внимание.
С уважением, Александр.

Связные темы:

А зачем вы тайпаете в баттон?

File file = new File("C:/path/to/file");

driver.findElement(By.id(browseButton)).sendKeys(file.getAbsolutePath());  

driver.findElement(By.id(uploadButton)).click;    

Так работает?

File file = new File(“C:/path/to/file”);

driver.findElement(By.id(browseButton)).sendKeys(file.getAbsolutePath());

driver.findElement(By.id(uploadButton)).click;

Спасибо, но так не получается.

вот кусок приложения, после него всплывает обычное диалоговое окно:

Тайпайть нужно в <input type='file'>. Тайпать в баттон как минимум странно.
Либо так : Загрузка файла в hidden input c помощью webdriver

Либо AutoIt или Robot.

1 лайк

Хорошо, спасибо за совет. Буду всё пробовать.

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

Пример скрипта AutolT:
;ожидание пока окно станет активным
Local $handle = WinWaitActive("[CLASS:#32770]", “”);

;мигание окна, просто чтобы убедиться в правильности его выбора
;можно удалить - занимает лишнее время
WinFlash($handle);

;заполнение поля диалога параметром, переданным из командной строки
ControlSetText($handle, “”, “Edit1”, $CmdLine[1]);

;ENTER - подтверждение (можно вместо этого нажать на кнопку)
Send("{ENTER}");

public void attachVideoByFile2() throws InterruptedException, AWTException {
	fileUploadButton.click();
		File file = new File("testFiles/new.mp4");
	setUploadedFile(file.getAbsolutePath());

public void setUploadedFile(String filePath) {

	File autoIt = new File("testFiles/upload_file.exe");

	try {
		// запуск exe с передачей пути к загружаемому файлу
		// в качестве параметра
		Process p = Runtime.getRuntime().exec(
				autoIt.getAbsolutePath() + " " + filePath);
		// ожидание выполнения запроса
		p.waitFor();
	} catch (IOException e) {
		e.printStackTrace();
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}

пример кода.

Выглядит нормально. И оно таки мигает, тое сть AutoIT выполняется?

Напишите пожалуйста, какие у Вас ошибки появляются

Всё выполняется. но сейчас просто не жмёт на “Open” в диалоговом окне.

В примере кода два метода один как я понял для AutoIt.
напишите ошибку, которая выдается вашим IDE при запуске 1го метода и 2го.
Абсолютный путь правильно прописан?
fileUploadButton - напишите локатор

Большое спасибо всем за помощь.
Проблема пока решилась банальным sleep на 500 мс.
Это мой первый вопрос на сайтах, и очень приятно что всегда есть люди, которые с терпением и понимание выслушают и помогут.

Спасибо всем огромное за помощь.
Проблема решилась банальным sleep на 500.
Но снова начинает проявляться (((
Это мой первый вопрос на сайтах, о мне очень приятно, что есть всегда люди которые помогут, выслушают, и всё это терпеливо.
Спасибо ; )

Минуточку :smile:
а код решения покажите

Спасибо ещё раз всем за помощь.
В итоге мне помогло такое решение, может кому и когда будет полезно.

public static void setClipboardData(String string) {
	StringSelection stringSelection = new StringSelection(string);
	Toolkit.getDefaultToolkit().getSystemClipboard()
			.setContents(stringSelection, null);
}

public void uploadFile() throws InterruptedException, AWTException {
		File file = new File("pathToFile");
		//
		uploadButton.click();
		//
		setClipboardData(file.getAbsolutePath());
		//
		Robot robot = new Robot();
		robot.delay(1000);
		robot.keyPress(KeyEvent.VK_CONTROL);
		robot.delay(300);
		robot.keyPress(KeyEvent.VK_V);
		robot.delay(300);
		robot.keyRelease(KeyEvent.VK_V);
		robot.delay(300);
		robot.keyRelease(KeyEvent.VK_CONTROL);
		robot.delay(300);
		robot.keyPress(KeyEvent.VK_ENTER);
		robot.delay(300);
		robot.keyRelease(KeyEvent.VK_ENTER);
		robot.delay(300);
	}
2 лайка

Только учтите, что робот будет работать только локально. Для удаленного запуска вам придется писать свою клиент-серверную часть, или использовать какие-нибудь готовые решения, умеющие выполнять команды на удаленной ВМ. В качестве альтернативы можно еще использовать Sikuli для работы с модальными окнами.

1 лайк

Спасибо большое за совет. Обязательно учту.

Учёл, вот хороший пример для ознакомления.
[Automate File Upload using Selenium WebDriver and Sikuli][1]
[1]: - YouTube

Для скринов лучше использовать Sikuli IDE.

Все равно есть одно но: Sikuli хорошо заточен под работу на локальной машине, но удаленное управление пока еще на стадии разработки. В новом SikuliX 2014 заимплементили remote server, но он пока еще очень сырой, с ограниченным набором функций. Для себя лично я пока нахожу его мало полезным.

Когда-то наткнулся на вот такой самописный Sikuli клиент-сервер. Даже успешно применял его на одном из проектов. Но из-за специфики архитектуры и давности написания, поддерживать его не так уж и просто. Он использует питоновский интерпритатор с клиент-сервером и оберткой, написанной на java.

После выхода нового SikuliX 2014, я задался целью его внедрения в уже существующий клиент-серверный код. Но вот незадача вышла: новый сикули полностью написан на java, а клиент-серверная платформа, используемая в выше приведенном источнике, уже устарела. Посему, если кто-то вдруг захочет применять новый сикули с полным функциональным набором удаленно, то проще будет написать свою клиент-серверную часть и обернуть нужные SikuliX API, например, в REST формат (пока разработчики не выпустят полнофункциональный Remote Sikuli).

1 лайк