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

webdriver
autoit
java
framework
Теги: #<Tag:0x00007fedc00d9a98> #<Tag:0x00007fedc00d9868> #<Tag:0x00007fedc00d9700> #<Tag:0x00007fedc00d9520>

(Slim Bim) #1

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

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

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

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

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

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

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


Использование "python-uinput" для автоматического тестирования
(vmaximv) #2

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


(Oleg V) #3
File file = new File("C:/path/to/file");

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

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

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


(Slim Bim) #4

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

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

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

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


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


(vmaximv) #5

Тайпайть нужно в <input type='file'>. Тайпать в баттон как минимум странно.
Либо так : http://automated-testing.info/t/zagruzka-fajla-v-hidden-input-c-pomoshhyu-webdriver/4429

Либо AutoIt или Robot.


(Slim Bim) #6

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


#7

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


(Slim Bim) #8

Пример скрипта 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();
	}
}

пример кода.


#9

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


(Oleg V) #10

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


(Slim Bim) #11

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


(Oleg V) #12

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


(Slim Bim) #13

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


(Slim Bim) #14

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


(Oleg V) #15

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


(Slim Bim) #19

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

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);
	}

(Sergey Korol) #20

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


(Slim Bim) #21

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


(Slim Bim) #22

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

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


(Sergey Korol) #23

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

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

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