38

我是一名 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 中的安全限制的?他们如何上传文件?

4

6 回答 6

20

好问题伙计...他们编写了一个 HTTP 代理来解决 Javascript 安全限制。使用此代理可以绕过“相同主机来源”策略的许多限制,其中浏览器不允许 Javascript 调用除提供当前页面的服务器之外的任何内容。

此外,WebDriver 使用在操作系统级别触发事件的替代方法。由于这些“本机事件”不是由浏览器生成的,这种方法绕过了对合成事件的安全限制,并且由于它们是特定于操作系统的,一旦它们在特定平台上为一个浏览器工作,在另一个浏览器中重用代码是相对的简单的。

上面的大部分内容都是从下面引用的..请阅读以下参考以获取有关 Selenium 内部的更多详细信息

http://www.aosabook.org/en/selenium.html

于 2012-12-20T06:57:02.357 回答
3

我已经使用 Selenium Webdriver 和 AutoIt 在 Facebook 上上传了照片

步骤如下

步骤1

关于 Eclipse 代码 Upto(上传照片)如下:

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

第2步

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

第 3 步

在记事本中编写如下代码并保存为PhotoUpload.au3

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

第 4 步:右键单击此 .au3 文件并编译它。

第 5 步:在脚本文件中添加代码,如下所示:

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步:照片上传成功。

于 2013-09-03T12:05:35.903 回答
3

上传windowns文件功能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();
于 2013-07-31T08:17:14.930 回答
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");

试试这个,让我知道

于 2012-12-20T04:04:32.957 回答
-1

在某些情况下,特别是使用 Java,您需要创建一个 File 对象并将 absolutePath() 传递给驱动程序,如下所示:

File file = new File(sampleFile);
driver.findElement(By.id("<Your input tag with type of File>")).sendKeys(file.getAbsolutePath());

示例文件是一个字符串,指向需要上传的文件。这适用于 Firefox 和 Chrome。

于 2013-03-04T18:52:50.727 回答
-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);
            }

        }
    }
于 2014-04-15T06:37:44.607 回答