Selenium WebDriver 文件上传浏览按钮 c#
Selenium WebDriver file upload browse button c#
我在使用浏览按钮和切换到文件对话框时遇到问题。我不能使用我的文件路径控件,只是将我的字符串与文件路径和文件本身一起发送到那里,因为它是只读的,实际上一些背后的控制是我的输入文件路径。
这是我的代码
driver.FindElement(By.Id("browseButton")).Click();
driver.SwitchTo().ActiveElement().SendKeys(filepath);
上面的代码填充了我对文件路径的控制,正如我在 UI 上看到的那样。但是我的打开文件对话框仍然打开,我不知道如何关闭它并提交我的上传。
至少可以说,在 Selenium 中上传文件可能很痛苦。真正的问题是它不支持文件上传和下载等对话框。
我在对另一个问题的回答中讨论了这个问题,所以我将 copy/paste 从这里开始我的回答。代码示例实际上应该与您的情况相关,因为您使用的是 C#:
复制自之前对问题 here 的回答:
Selenium Webdriver 并不真正支持这一点。与非浏览器交互 windows(例如本机文件上传对话框和基本身份验证对话框)一直是 WebDriver 讨论板上讨论最多的话题,但该主题几乎没有进展。
在过去,我已经能够解决这个问题,方法是使用 Fiddler2 等工具捕获底层请求,然后发送带有作为字节 blob 附加的指定文件的请求。
如果您需要来自经过身份验证的会话的 cookie,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/Response:
LoginRequest
LoginResponse
上面的代码是在 C# 中,但在 Java 中有等效的基础 类 可以完成您需要它们做的事情来模拟此功能。
所有代码中最重要的部分是 MultiPartForm.SendFile 方法,这是神奇的地方。
实现此目的的众多方法之一是删除禁用属性,然后使用典型的 selenium 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);
}
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();
我在使用浏览按钮和切换到文件对话框时遇到问题。我不能使用我的文件路径控件,只是将我的字符串与文件路径和文件本身一起发送到那里,因为它是只读的,实际上一些背后的控制是我的输入文件路径。
这是我的代码
driver.FindElement(By.Id("browseButton")).Click();
driver.SwitchTo().ActiveElement().SendKeys(filepath);
上面的代码填充了我对文件路径的控制,正如我在 UI 上看到的那样。但是我的打开文件对话框仍然打开,我不知道如何关闭它并提交我的上传。
至少可以说,在 Selenium 中上传文件可能很痛苦。真正的问题是它不支持文件上传和下载等对话框。
我在对另一个问题的回答中讨论了这个问题,所以我将 copy/paste 从这里开始我的回答。代码示例实际上应该与您的情况相关,因为您使用的是 C#:
复制自之前对问题 here 的回答:
Selenium Webdriver 并不真正支持这一点。与非浏览器交互 windows(例如本机文件上传对话框和基本身份验证对话框)一直是 WebDriver 讨论板上讨论最多的话题,但该主题几乎没有进展。
在过去,我已经能够解决这个问题,方法是使用 Fiddler2 等工具捕获底层请求,然后发送带有作为字节 blob 附加的指定文件的请求。
如果您需要来自经过身份验证的会话的 cookie,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/Response: LoginRequest LoginResponse
上面的代码是在 C# 中,但在 Java 中有等效的基础 类 可以完成您需要它们做的事情来模拟此功能。
所有代码中最重要的部分是 MultiPartForm.SendFile 方法,这是神奇的地方。
实现此目的的众多方法之一是删除禁用属性,然后使用典型的 selenium 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);
}
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();