Загрузка файлов в Selenium может быть болью, если не сказать больше. Реальная проблема связана с тем, что она не поддерживает диалоговые окна, такие как загрузка и загрузка файлов.
Я перехожу к этому в ответ на другой вопрос, поэтому я просто скопирую/вставлю свой ответ оттуда здесь. Примеры кода должны быть на самом деле актуальна в вашем случае, так как вы используете C#:
Скопировано из предыдущего ответа на вопрос: here
Селен WebDriver действительно не поддерживает это. Взаимодействие с окнами без браузера (например, диалоговые окна загрузки файлов и основные диалоговые окна) было предметом много дискуссий на доске объявлений WebDriver, но прогресс по этому вопросу практически не был достигнут.
В прошлом я мог обойти это, взяв базовый запрос с помощью инструмента, такого как Fiddler2, а затем просто отправил запрос с указанным файлом, прикрепленным в виде байтового блоба.
Если вам нужны куки-файлы из аутентифицированного сеанса, WebDriver.magage(). GetCookies() должен помочь вам в этом аспекте.
Редактировать: У меня есть код для этого где-то, что сработало, я посмотрю, смогу ли я получить то, что вы можете использовать.
public RosterPage UploadRosterFile(String filePath){
Face().Log("Importing Roster...");
LoginRequest login = new LoginRequest();
login.username = Prefs.EmailLogin;
login.password = Prefs.PasswordLogin;
login.rememberMe = false;
login.forward = "";
login.schoolId = "";
//Set up request data
String url = "http://www.foo.bar.com" + "/ManageRoster/UploadRoster";
String javaScript = "return $('#seasons li.selected') .attr('data-season-id');";
String seasonId = (String)((IJavaScriptExecutor)Driver().GetBaseDriver()).ExecuteScript(javaScript);
javaScript = "return Foo.Bar.data.selectedTeamId;";
String teamId = (String)((IJavaScriptExecutor)Driver().GetBaseDriver()).ExecuteScript(javaScript);
//Send Request and parse the response into the new Driver URL
MultipartForm form = new MultipartForm(url);
form.SetField("teamId", teamId);
form.SetField("seasonId", seasonId);
form.SendFile(filePath,LoginRequest.sendLoginRequest(login));
String response = form.ResponseText.ToString();
String newURL = StaticBaseTestObjs.RemoveStringSubString("http://www.foo.bar.com" + response.Split('"')[1].Split('"')[0],"amp;");
Face().Log("Navigating to URL: "+ newURL);
Driver().GoTo(new Uri(newURL));
return this;
}
Где MultiPartForm является: MultiPartForm
И LoginRequest/Ответ: LoginRequest LoginResponse
Код выше в C#, но есть эквивалентные базовые классы в Java, которые будут делать то, что вы им нужно сделать, чтобы имитировать эту функциональность.
Самой важной частью всего этого кода является метод MultiPartForm.SendFile, в котором происходит волшебство.
@Michael Даже если входной контроль файла только для чтения, простым способом используйте JavaScript и измените загрузку файла dom.Пожалуйста, предоставьте html, чтобы помочь вам с этим – Saifur
, поэтому мой контроль для пути загрузки: '' – Michal