Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как похендлить Upload pop up в Google Chrome (Selenium тести)


(Taras) #1

Есть сайт где можно аплодить файли для подальшей обработки.
Есть функционал upload файла. Пока файл заплодиться итд - ето я все сделал и похендлил с помощью guava - вейтери работают на ура - все ок.
Но все же возникла, казалось б тревиальная проблема Selenium тестов - как похендлить upload pop up для загрузки файла. Путь к файлу имееться для каждого теста.
Вот вкриншот места, от куда откриваеться етот поп апчик:


После того как откриваеться нативное окно я его успешно хендлю с помощью Java Robot, но только для Firefox, так как Firefox всегда при любих обстоятельствах ставит фокус курсора вот сюда:

по етому я делаю так:

private void typeInModal(String characters) throws AWTException, InterruptedException {
    StringSelection stringSelection = new StringSelection(characters);
    		Toolkit.getDefaultToolkit().getSystemClipboard()
    				.setContents(stringSelection, null);
                Robot robot = new Robot();
    		//wait for modal opening
    		Thread.sleep(1000);
                robot.keyPress(KeyEvent.VK_CONTROL);
    		robot.keyPress(KeyEvent.VK_V);
    		robot.keyRelease(KeyEvent.VK_CONTROL);
    		robot.keyRelease(KeyEvent.VK_V);
    		
    		//wait for paste operation
    		Thread.sleep(1000);
    		
    		robot.keyPress(KeyEvent.VK_ENTER);
}

Но такой воркераунд не работает на Google Chrome, а все потому что Chrome не ставит фокус курсора сразу на текстбокс где имя файла отображаеться. Я пробовал двигать мишку в левий верхний угол и делать клик сюда:

Один раз после клика миши в ету область(красний прямоугольник на рисунке) фокус ставиться в текстбокс и курсор доступен, а один раз не ставиться, работает рандомно. Соотвественно стабильно для FF, отстойно для Chrome.

Что можна сделать для Chrome ?

Ввести текст в html -е не получиться так как ето не стандартний browse. После uploada - я вижу в нетворке request - но так как у меня нет никакой АРІ-шки у меня нету ни документаціии по етому реквесту, ни токена, которий ему нужен.
На форме есть еще функция drag & drop файла - может как то ето похендлить можно ???


(Sergey Korol) #2

SikuliX прекрасно решает все эти проблемы: и ввод текста в native OS dialog, и drag and drop файла в нужную область.


(Taras) #3

та Sikuli у меня подключен в фреймворке и воркераунд для Page Objecta даже написан…но ето image recognition - ето только на крайний случай, или ето и есть тот крайний случай ?)))


(Sergey Korol) #4

Ни для кого не секрет, что есть вещи, которые Selenium делать не умеет. В вашем случае, вы уже итак слепили workaround через Robot, который, к слову, не будет работать ремоутно. Если у вас уже есть поддержка Sikuli, то какая проблема вынести upload, как частный случай? При одинаковых разрешениях и цветовых гаммах Sikuli будет прекрасно распознавать вашу 1 несчастную картинку на любом однотипном окружении + 2 на drag & drop. :wink:


(barancev) #5

как в Selenium ‘прицепить’ файл к невидимому полю ввода


(Taras) #6

что имееться в виду по “невидими полем ввода” ?


(Ray Romanov) #7

В принципе я так и делаю в Codeception:
$I->pressKey(’#filename_input’, $pathToImage . ‘Jellyfish.jpg’);


(Sergey Korol) #8

Это если есть input с аттрибутом по типу hidden. Идея в том, что если сделать его видимым, то можно отправить путь стандартными средствами selenium’a. Но проблема в том, что аплоадеры далеко не всегда представлены в виде инпутов.


(barancev) #9

Там прямо в статье рассказано, как делают эти невидимые файловые поля, и зачем их делают. Они, конечно, не hidden, просто прозрачные.


(Сергей Блохин) #10

https://github.com/atinfo/at.info-knowledge-base/tree/master/functional%20test%20automation/webdriver/file%20upload — вроде уже обсуждалось как-то. =)


(Taras) #11

ето самий тривиальний вариент, когда browse кнопка содержит текстбокс для ввода пути, если ви посмотрите на скриншоти которие я заатачил - там совсем другая картина