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

Загрузка файла в hidden input c помощью webdriver


(Maxibello) #1

Всем привет.
У меня есть такой элемент:

<input width="320" height="240" title="Кликните для выбора изображения" id="ArticleForm_previewImage" style="display: none;" name="ArticleForm[previewImage]" type="file">

Можно ли автоматизировать процесс загрузки файла с помощью WebDriver?


Upload file или вечные проблемы с загрузкой файла на сервис
(Mykhailo Poliarush) #2

Так как Вы наверное уже поняли, в общем нельзя работать с hidden полями, но можно делать всякие хаки, в виде исполнения javascript.
Например, можно сделать поле видимое сначала, а потом вызвать webdriver команды.


(Надежда Бурнашева) #3

browser.ExecuteJS(“document.getElementById(‘myfile2’).style.display = “block””);
Где-то так можно сделать видимым. Потом уже можно работать с этим элементом через WebDriver


(Maxibello) #4

Всем спасибо, получилось)


(Mykhailo Poliarush) #5

Ну тогда, пожалуйста, приложите работающий код для тех кто тоже столкнется с такой же проблемой и зайдет в эту тему. Спасибо!


(Maxibello) #6

Как-то так:

driver.execute_script("document.getElementById('file-input-id').style.display = 'inline'");
element = driver.find_element_by_id("file-input-id")
element.send_keys("myfile.txt")

(Дмитрий Бобков) #7

Допишу подобную ситуацию из практики. Есть инпут, не содержащий в явном виде style="display: none;, однако, его все равно прячут от глаз юзера, путем указания в стилях position:absolute;top:-100%;opacity:0;
собственно, тем же джаваскриптэкзекьютером делем ему позицию релэтив, топ 0, и опасити 100 - и элемент виден и с ним можно работать.

кривовато и костыльно, - мне не нравится. Но работает

String script="b=document.getElementsByTagName('input')[1];\n" +
                "b.style.position=\"relative\";\n" +
                "b.style.top=\"0\";\n" +
                "b.style.width=\"200px\";\n" +
                "b.style.height=\"20px\";\n" +
                "b.style.opacity=100;";

((JavascriptExecutor)driver).executeScript(script);