Selenium WebDriver如何将文件上传到浏览器?

39

我是一名 JavaScript/Java 开发者,一直在尝试弄清 Selenium Webdriver 自动化框架如何从文件系统上传文件。通过 JavaScript 设置文件输入是不可能的,因为这是一种安全违规行为。但是 WebDriver 一些命令似乎可以实现文件上传:

driver.setFileDetector(new LocalFileDetector());
WebElement upload = driver.findElement(By.id("myfile"));
upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");
driver.findElement(By.id("submit")).click();

所以他们是通过发送键来设置值的?我不明白。我已经查看了这里找到的源代码:http://code.google.com/p/selenium/source/checkout,但仍然找不到他们在哪里实现这个功能。

编辑:我的问题不是如何在Selenium中实现这一点,而是Selenium开发人员是如何做到这一点的?他们是如何绕过JavaScript中的安全限制的?他们是如何上传文件的?


我的第一个猜测是按钮元素有一个“值”,而sendKeys会将字符添加到该值中? - djangofan
6个回答

20
很好的问题...他们编写了一个HTTP代理来解决Javascript的安全限制。使用这个代理可以绕过“同主机源”策略的许多限制,其中浏览器不允许Javascript调用除当前页面所在的服务器之外的任何东西。
此外,WebDriver使用在操作系统级别触发事件的替代方法。由于这些“本机事件”不是由浏览器生成的,因此这种方法可避开对合成事件施加的安全限制,并且由于它们是特定于操作系统的,一旦它们在特定平台上运作良好的一个浏览器中工作,就相对容易地在另一个浏览器中重用代码。
上面的大部分内容都引用自以下内容,请阅读下面的参考资料以获取有关Selenium内部的更多详细信息。
参考资料:http://www.aosabook.org/en/selenium.html

3
上传Windows文件的HTML代码如下:
<input id="fileField" type="file" onchange="document.getElementById('textfield').value=this.value" name="position">   

<input type="submit" value="导入">

您可以使用以下代码完成上传Windows文件。它可以成功工作,而且代码不包括点击上传操作。
driver.FileDetector = new LocalFileDetector();
FindElement(By.Id("fileField")).SendKeys(@"C:\Users\admin\Desktop\ProfessionCodes.txt"); FindElement(By.CssSelector("input[type='submit']")).Click();

3
我已经使用Selenium Webdriver和AutoIt上传了Facebook上的照片。
以下是步骤: 第一步: 在Eclipse代码中,上传照片的部分如下所示:

Uploading a Photo

WebElement Upload = Firefox.findElement(By.cssSelector("input[id^='u_']"));
Upload.click();

第二步

下载并安装AutoIt:http://www.autoitscript.com/site/autoit/downloads/(下载ZIP文件)

第三步

在记事本中编写以下代码,并将其保存为PhotoUpload.au3

WinWaitActive("File Upload")
Send("D:\Photo0116.jpg")   
Send("{ENTER}")

第四步: 右键点击该.au3文件并编译。

第五步: 在脚本文件中添加以下代码:

try {
    String[] commands = new String[]{};
    // Location of the autoit executable
    commands = new String[] {"D:\\My softwares\\install software\\selenium\\UploadPhoto3.exe"};
    Runtime.getRuntime().exec(commands);
}       
catch (IOException e) {}

步骤 6: 运行脚本 (PhotoUpload.java)

步骤 7: 照片上传成功。


你能否提供一些编码和用户界面的截图吗? - Emmanuel Angelo.R

0
  //assuming driver is a healthy WebDriver instance
    WebElement fileInput = driver.findElement(By.name("uploadfile"));
   fileInput.sendKeys("C:/path/to/file.jpg");

或者

 driver.findElement(By.id("inputFile")).sendKeys("C:/path/to/file.jpg");

你试试这个,然后告诉我


非常抱歉,我的问题表达不是很清晰。我已经补充说明了。我想知道 Selenium 的开发人员是如何实现你所描述的功能的。 - justspamjustin

-1

这帮助我进行文件上传,

代码:

 public class FileUpload {
        @Test
        public void test() {
            WebDriver driver = new FirefoxDriver();
            driver.get("http://www.freepdfconvert.com/pdf-word");
            driver.findElement(By.id("clientUpload")).click();
            driver.switchTo()
                    .activeElement()
                    .sendKeys(
                            "/home/likewise-open/GLOBAL/123/Documents/filename.txt");
            driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
            driver.findElement(By.id("convertButton"));
            /*
             * driver.switchTo().activeElement()
             * .sendKeys("selenium_2_testing_tools.pdf"); ;
             */
         {
                driver.wait(30000);
            } catch (Exception er) {
                System.out.println(er);
            }

        }
    }

-1
在某些情况下,特别是在Java中,您需要创建一个文件对象并将absolutePath()传递给驱动程序,如下所示:
File file = new File(sampleFile);
driver.findElement(By.id("<Your input tag with type of File>")).sendKeys(file.getAbsolutePath());

样本文件是一个指向需要上传的文件的字符串。这在Firefox和Chrome中对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接