2015-04-21 4 views
0

У меня проблема с кнопкой просмотра и переключением на диалог с файлом. Я не могу использовать свой контроль пути к файлу и просто отправлять туда свою строку с файловым путем и самим файлом, так как это только для чтения, а на самом деле некоторые из них - это мой путь к файлу ввода.Selenium WebDriver загрузка файла для загрузки C#

Вот мой код

driver.FindElement(By.Id("browseButton")).Click(); 
driver.SwitchTo().ActiveElement().SendKeys(filepath); 

Над кодом заполняет мой контроль за путь к файлу, так как я могу видеть, что на пользовательском интерфейсе. Но мой диалог с открытым файлом все еще открыт, и я не знаю, как его закрыть и отправить мою загрузку.

+0

@Michael Даже если входной контроль файла только для чтения, простым способом используйте JavaScript и измените загрузку файла dom.Пожалуйста, предоставьте html, чтобы помочь вам с этим – Saifur

+0

, поэтому мой контроль для пути загрузки: '' – Michal

ответ

1

Один из многих способов сделать это, чтобы удалить отключить атрибут, а затем использовать типичный селен SendKeys() для достижения этой цели

public void test(string path) 
{ 
    By byId = By.Id("removeAttribute"); 
    const string removeAttribute = @"document.getElementById('browseButton').removeAttribute('disabled');"; 
    ((IJavaScriptExecutor)Driver).ExecuteScript(removeAttribute); 
    driver.FindElement(byId).Clear(); 
    driver.FindElement(byId).SendKeys(path); 
} 
+0

saifur - хотя я согласен с тем, что это решает проблему (и спасибо за хороший пример), я действительно обеспокоен тем, что это полностью нарушает модульное тестирование, поскольку это не то, что произойдет в реальном сценарии * оперативного * с человеком и браузер. Тем не менее, ОП не ссылается на его требование, требующее соответствия требованиям испытаний. надеюсь, что вы видите мою точку зрения ... но хороший ответ на основе доступной информации - +1 –

+0

@jimtollan Полностью согласен. На самом деле Selenium не собирается делать такие вещи. Но, поскольку все мы знаем, что Selenium не может работать с системой управления ОС для обработки загрузки файлов. И это не чище, но, возможно, единственный способ справиться с этим сценарием с селеном – Saifur

1

Загрузка файлов в 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, в котором происходит волшебство.

0
You can use this Auto IT Script to Handle File Upload Option. 

Auto IT Script for File Upload: 

AutoItSetOption("WinTitleMatchMode","2") ; set the select mode to 
Do 
Sleep ("1000") 
until WinExists("File Upload") 
WinWait("File Upload") 
WinActivate("File Upload") 
ControlFocus("File Upload","","Edit1") 
Sleep(2000) 
ControlSetText("File Upload" , "", "Edit1", $CmdLineRaw) 
Sleep(2000) 
ControlClick("File Upload" , "","Button1"); 

Build and Compile the above code and place the EXE in a path and call it when u need it. 

Call this Once you click in the Browse Button. 
    Process p = System.Diagnostics.Process.Start(txt_Browse.Text + "\\File Upload", DocFileName); 
    p.WaitForExit(); 
+0

Могу ли я узнать причину ваунов для его downvoting – Madhu

+0

Спасибо вам, человек! Это бриллиант! Я написал лучшую версию: http://pastebin.com/CDqQ4wdq – Jamesst20