Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Загрузка файлов(window) при помощи Selenium/Selenide во время выполнения тестов на агенте TeamCity

upload
team-city
webdriver
selenide
selenium
Теги: #<Tag:0x00007fedb9b92950> #<Tag:0x00007fedb9b926a8> #<Tag:0x00007fedb9b924c8> #<Tag:0x00007fedb9b92360> #<Tag:0x00007fedb9b92108>

(Sined1993) #1

Добрый день!
Возможно кто-нибудь сталкивался с подобным, тесты загрузки файлов работают локально, но не работают на удаленном агенте(TeamCity)

Суть проблемы:
При попытке загрузить файлы с удаленной машины - тесты падают с ошибкой(Robot) или не загружают файлы(AutoIT)

Что я делаю:
1 вариант

  1. При помощи Селенида кликаю на кнопку, для отображения окна загрузки файла
  2. При помощи Robot(java) указываю путь к файлу

2 вариант

  1. При помощи Селенида кликаю на кнопку, для отображения окна загрузки файла
  2. Про помощи autoIT запускаю exe который делает окно загрузки активным и вбивает путь к файлу

Оба варианта работают локально, но не работают на удалённой машине

Код

AutoIT
WinActivate("Open")
WinWaitActive("Open")
Send("Test.txt")
Send("{ENTER}")

Java:
Путь тестовый, на удаленной машине он другой
Runtime.getRuntime().exec("C:\\Users\\User\\Desktop\\autoIT_Upload.exe");
----------------------------------------------------------------------------------------------------------------
Вариант с Robot:
	public static void uploadFileWindowHandler(String s){
		try {
			Robot robot = new Robot();
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if (Character.isUpperCase(c)) {
				robot.keyPress(KeyEvent.VK_SHIFT);
			}
			robot.keyPress(Character.toUpperCase(c));
			robot.keyRelease(Character.toUpperCase(c));

			if (Character.isUpperCase(c)) {
				robot.keyRelease(KeyEvent.VK_SHIFT);
			}
		}
		robot.keyPress(KeyEvent.VK_ENTER);    // confirm by pressing Enter in the end
		robot.keyRelease(KeyEvent.VK_ENTER);
		robot.delay(5000);
		} catch (AWTException e) {
			e.printStackTrace();
		}

Локально оба варианта работают, при выполнении удалённо:

  1. AutoIT - не загружает файлы
  2. Robot - выдаёт ошибку java.lang.IllegalArgumentException: Invalid key code

Если в момент выполнения тестов - я подключен к машине, на которой они выполняются - тесты не падают
Agent teamcity запущен батником(agent start)


(asolntsev) #2

Привет!
А зачем вы вообще используете Robot и AutoIT?
В Selenide же есть встроенный способ загрузки файлов:

$("input#cv").uploadFile(new File("src/test/resources/cv.pdf"));

или

$("input#cv").uploadFromClasspath("cv.pdf");


(Sined1993) #3

К сожалению на форме не input, а только кнопка с иконкой


(asolntsev) #4

Так не бывает. Где-то должен быть <input type="file">. Надо только его найти. Без него браузер не может в принципе загрузить файлы.


(Vladislav Kulasov) #5

“C:\Users\User\Desktop\autoIT_Upload.exe”)

1.Главное чтоб пользователь под которым вы запускаете тесты был “User”, пользователи не видят папки друг-друга. В общем должен быть доступ.
“я подключен к машине, на которой они выполняются - тесты не падают”
2. похоже что у вас нет рабочего стола. Т.е. ну не может браузер или другое приложение открыться без рабочего стола. Чтоб работало вы должны всегда быть залогированы, настройте автологин и под этим пользователем запускайте тесты


(Sergei Chipiga) #6

А если он динамически создается, кажется такое вполне может быть


(Sined1993) #7
  1. Да, я это вполне понимаю)
  2. Тогда бы не проходили все тесты, разве нет? Вообщем-то тесты гоняются и успешно проходят, трабла появилась именно с вложением файлов

(Vladislav Kulasov) #8

Ну я не знаю по поводу других тестов. но разница в том что
Селениум работает внутри браузера и он не знает ни о чем связанное с другими окнами(формами).
А роботом вы пытаетесь работать с оконом?
" При помощи Robot(java) указываю путь к файлу" а у вас например окно блокировки в этот момент.
А кликает или посылает нажатия он по координатам, окно которое где то там… под экраном блокировки. Фактически работая с окном блокировки.
Ну это как пример… Точно я сказать конечно не могу.
вот правильный подход


(Sined1993) #9

Через js нашел на форме 4 input type = “file”, но при попытке загрузить так:

File file = new File(“C:\test.txt”);
$("#formInner_FILE1").uploadFile(file);
$("#formInner_FILE2").uploadFile(file);
$("#formInner_FILE3").uploadFile(file);
$("#formInner_FILE4").uploadFile(file);

Ничего не вышло :frowning:
Но в любом случае - спасибо за подсказку)


(Sined1993) #10

Как решил проблему в итоге, мб кому-либо будет полезно:
Покопав js понял, что поле с input добавляется после нажатия на кнопку “Загрузить” с “display:none”. После - загрузил файл так как указывал @asolntsev

То есть работало так: нажимаем на кнопку “Загрузить” --> Отображается win окно и добавляется input --> после этого его можно получить и делать с ним, что душе угодно

Проще всего было бы отловить выполняя в консоли: document.querySelectorAll(‘input[type=file]’) до и после нажатия на “Загрузить”(менялось бы кол-во элементов), ну или поковыряв js