Загрузите файл в браузер с помощью 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, то вам нужно будет использовать какой-либо другой метод для связи с этим компонентом.