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

Не работает загрузка файла на сервер (upload file selenium c#)

csharp
upload
webdriver
selenium
Теги: #<Tag:0x00007fedb72ee8f0> #<Tag:0x00007fedb72ee7b0> #<Tag:0x00007fedb72ee648> #<Tag:0x00007fedb72ee508>

(Ольга Федчун) #1

Добрый день!
Никак не могу победить загрузку файла на сайт. Что бы я ни пробовала, появляется Open file dialog.

Пишу на C# и не могу (или пока не представляю, как) использовать сторонние инструменты типа AutoIt, потому что тесты выполняются на удалённой машине.

Элемент в DOM выглядит так:

Пробовала:

  1. SendKeys:
var driver = CorgiProxy.Driver;
var element = driver.FindElement(By.CssSelector(".x-form-file"));
element.SendKeys("C:\\example.txt");
  1. Дёрнуть скриптом:
var driver = CorgiProxy.Driver;
var script = "document.getElementsByClassName('x-form-file').value='C:\\\\example.txt'";
 ((IJavaScriptExecutor)driver).ExecuteScript(script);

Есть подозрение, что я что-то упускаю. У всего мира всё работает, а у меня нет :slight_smile:
Помогите найти косяк, заранее спасибо!


(Баранов Иван) #2

На java такое у меня совсем недавно работало. А файл по указанному пути точно есть на стенде с браузером?


(Ольга Федчун) #3

Пока что у меня даже локально не работает. По указанному пути файл лежит точно


(Баранов Иван) #4

Т.е. Вы пробуете сделать sendKeys в файловый инпут, но открывается диалог выбора файла.
У вас Windows 10 + IE11, тесты написаны на C#, какая версия Selenium?


(Vladislav Kulasov) #5

“x-form-file” - вы уверенны что он один на странице и его нет на кнопке открытия диалога выбора файла?


(Ольга Федчун) #6

Т.е. Вы пробуете сделать sendKeys в файловый инпут, но открывается диалог выбора файла.
У вас Windows 10 + IE11, тесты написаны на C#, какая версия Selenium?

Всё верно, версия Selenium 3.3


(Ольга Федчун) #7

“x-form-file” - вы уверенны что он один на странице и его нет на кнопке открытия диалога выбора файла?

Уверена, что он один на странице, но что он не расположен на кнопке - нет. Как быть в этой ситуации? Захайдить кнопку через js?


(Yaroslav Pernerovskyy) #8

driver.FindElement(By.CssSelector(“input.x-form-file”));


(Vladislav Kulasov) #9

Я можете больше кода показать?
Еще тут есть вариант что у вас на input повесили скрипт который как раз и отвечает за появление диалога. Т.е. любойе изменение ведет к появлению диалога. Вы можете спросить у ваших программистов.
Вариант отключить скрипт.
Если есть кнопка визуально то посмотрите на ней атрибуты. может вы в нее посылаете если у нее стоит класс x-form-file


(Yaroslav Pernerovskyy) #10

хотя нет, у вас ьам два инпута… надо так:

driver.FindElement(By.CssSelector("input[type=file]"));


(Ольга Федчун) #11

хотя нет, у вас ьам два инпута… надо так:

driver.FindElement(By.CssSelector(“input[type=file]”));

Попробовала ваш вариант:

var driver = CorgiProxy.Driver;
var element = driver.FindElement(By.CssSelector("input[type=file].x-form-file"));
element.SendKeys("C:\\example.txt");

Не полечилось :frowning:


(Ольга Федчун) #12

можете больше кода показать?

Вот тут весь контрол

Еще тут есть вариант что у вас на input повесили скрипт который как раз и отвечает за появление диалога. Т.е. любойе изменение ведет к появлению диалога. Вы можете спросить у ваших программистов.

Да, на инпуте, если я правильно понимаю, висят скрипты на события mouse down, mouse up. Как мне их обойти?

Если есть кнопка визуально то посмотрите на ней атрибуты. может вы в нее посылаете если у нее стоит класс x-form-file

Кнопки, как таковой, не вижу.


(Vladislav Kulasov) #13

А если писать в поле руками, что происходит?


(Ольга Федчун) #14

А если писать в поле руками, что происходит?

Как прям руками неписать, не знаю, но если скрипт выполнить, то визуально ниче не поменяется, просто в консоль придёт ответ:


(Vladislav Kulasov) #15

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


(Yaroslav Pernerovskyy) #16

не надо .x-form-file

driver.FindElement(By.CssSelector("input[type=file]")).SendKeys("C:\\example.txt");


(Dinara Demi) #17

Вам нужно найти все инпуты на странице. Найдите среди них тот, который удовлетворяет селектору, который вам уже написал ysparrow (Yaroslav Pernerovskyy). Попробуйте набрать в консоли браузера такую команду: $x("//input[@type=‘file’]"). Это XPath, чтобы найти нужный инпут.


(Ольга Федчун) #18

Ребята, проблему решила.
Дело было не в селекторе и даже не в том, что на кнопке висели обработчики.
Проблема была в старом IEDriverServer.exe.
Версия IEDriverServer.exe была 3.3 и, видимо, не тянула. Сейчас в сети есть версия 3.8, но мне подходит и 3.4, она содержит в себе какие-то изменения, связанные с Upload’ом.