使用selenium上传文件

如何使用selenium webdriver通过窗口提示从本地上传文件?

我想执行以下操作:

  1. 单击窗口上的“浏览”选项
  2. 从窗口提示符转到保存文件的本地位置
  3. 选择文件并单击“打开”以上载文件。

您是否尝试在正确的文件输入控件上使用input()

 WebElement fileInput = driver.findElement(By.id("some id")); fileInput.sendKeys("C:/path/to/file.extension"); 

我已经使用以下三种不同的方式在selenium webdriver中上传文件。

  1. 第一个简单的例子就是找到元素并在其中键入文档的绝对路径。 但我们需要确保HTML字段是输入类型。 Ex:

这是简单的代码:

  WebElement element = driver.findElement(By.name("uploadsubmit")); element.sendKeys("D:/file.txt"); driver.findElement(By.name("uploadSubmit")); String validateText = driver.findElement(By.id("message")).getText(); Assert.assertEquals("File uploaded successfully", validateText); 
  1. 第二种情况是使用Robot类上传,用于(生成本机系统输入事件)控制鼠标和键盘。

  2. 另一种选择是使用’AutoIt’(开源工具)。

您可以找到以上三个示例: – 使用Selenium Webdriver进行文件上载

Selenium Webdriver并不真正支持这一点。 与非浏览器窗口(例如本机文件上载对话框和基本身份validation对话框)的交互一直是WebDriver讨论板上讨论的主题,但在这个主题上几乎没有进展。

在过去,我已经能够通过使用Fiddler2等工具捕获底层请求来解决这个问题,然后只需将指定文件附加为字节blob发送请求。

如果您需要来自经过身份validation的会话的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中有相同的基类可以完成模拟此function所需的操作。

所有代码中最重要的部分是MultiPartForm.SendFile方法,这是魔术发生的地方。