Загрузите файл в браузер с помощью Selenium C# без опции NoFileChosen

Я пытаюсь загрузить файл. В моем приложении есть только кнопка "Обзор" и нет места для отправки пути к файлу. Поэтому я не могу использоватьSendKeys.SendWait(@"filepath"); Я пробовал использовать JavaScriptExecutor но возникает ошибка при использовании приведенного ниже кода:

IWebElement upload = _driver.FindElement(By.XPath("//div[starts-with(@class,'addDoc') and contains(text(),'Browse')]"));

string filepath = @"C:/Users/../Amazon vs Walmart.pdf";
String script = "document.upload.value= " + filepath;
((IJavaScriptExecutor)_driver).ExecuteScript(script);

Runtime.evaluate вызвал исключение: SyntaxError: Неожиданный токен:

Почему я получаю исключение?

3 ответа

Решение

Хотя я пытался использовать AutoItX для загрузки файла, и это сработало. Ниже приведен код того же самого - чтобы получить AutoItX, я установил пакет Nugget - AutoItX.DotNet

AutoItX.ControlFocus("Open", "", "Edit1");
AutoItX.ControlSetText("Open", "", "Edit1", filepath);
AutoItX.ControlClick("Open", "", "Button1");

Но все же я хотел бы изучить использование JS.

Взаимодействие с окнами просмотра файлов выходит за рамки того, что может делать веб-драйвер. Когда вы нажимаете кнопку "Обзор", браузер передает вас операционной системе для поиска файла. Javascript не может работать с этими окнами.

SendWait используется как трюк для передачи uri файла в открытое окно и возврата. Если это не сработает, вам нужно будет использовать что-то для взаимодействия с окнами ОС.

Я лично использую InputSimulatorCore для решения подобных проблем при работе с IE, у которого много таких проблем с загрузкой файлов.

Изменить: если вы контролируете изменение приложения на загрузку на основе форм, это позволит вам проводить тестирование в Selenium и является лучшим вариантом. Если нет, вы также можете напрямую отправить сообщение в конечную точку загрузки.

Есть несколько проблем с опубликованным вами кодом. Сначала вы пытаетесь позвонитьExecuteScriptс недопустимым JavaScript. То есть, когда ваши строки объединены, ваш JavaScript выглядит так:

document.upload.value= C:/Users/../Amazon vs Walmart.pdf

Обратите внимание, что строка, которую вы на самом деле пытаетесь установить, не заключена в кавычки. Синтаксически правильный JavaScript будет:

// Note carefully the quotes around the string literal. 
document.upload.value='C:/Users/../Amazon vs Walmart.pdf'

Чтобы получить это, ваш код конкатенации должен выглядеть так:

string script = "document.upload.value='" + filepath + "'";

Вторая проблема заключается в том, что вы пытаетесь вызвать загрузку файла. Предполагая, что загрузка выполняется с использованием стандартных механизмов HTML, это означает, что где-то на странице есть<input type="file">элемент. Он может быть скрыт, но где-то на странице. Чтобы загрузить файл, вы можете использоватьSendKeysдля этого элемента. Вариант загрузки файла - одно из немногих исключений дляSendKeys к правилу, согласно которому элементы, с которыми нужно взаимодействовать, должны быть видны пользователю (по крайней мере, с самыми последними версиями браузеров и драйверов браузеров. Если приложение использует какой-либо нестандартный механизм загрузки, например, чистую реализацию JavaScript, или компонента Flash, то вам нужно будет использовать какой-либо другой метод для связи с этим компонентом.

Другие вопросы по тегам