使用selenium上传文件

时间:2015-03-25 13:20:38

标签: java selenium selenium-webdriver upload webdriver

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

我想执行以下操作:

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

  1. 只是找到元素并在其中键入文档的绝对路径的第一个简单情况。但我们需要确保HTML字段是输入类型。 Ex:<input type="file" name="uploadsubmit">
  2. 以下是简单的代码:

        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'(开源工具)。

    3. 您可以找到以上三个示例: - File Uploads with Selenium Webdriver

答案 2 :(得分:0)

Selenium Webdriver并不支持这一点。与非浏览器窗口交互(例如本机文件上载对话框和基本身份验证对话框)一直是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方法,这就是魔术发生的地方。