t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f7499259f08> #<Tag:0x00007f7499259e40> #<Tag:0x00007f7499259d50> #<Tag:0x00007f7499259c88>

Добрый день!
Никак не могу победить загрузку файла на сайт. Что бы я ни пробовала, появляется 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:
Помогите найти косяк, заранее спасибо!

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

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

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

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

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

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

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

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

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

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

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

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

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

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:

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

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

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

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

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

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

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

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

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

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

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

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

1 Симпатия

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

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

1 Симпатия