selenium webdriver没有提供直接的文件上传功能,但是在使用的web项目中常常需要对文件进行上传。在一般的上传中,是需要点击上传按钮,打开本地的window窗口,但是selenium 是无法直接操作window系统自带的相关控件。
以下提供两种关于文件上传的方法。
普通上传:普通的附件上传是将本地文件的路径作为一个值放在input 标签中,通过form 表单将这个值提交给服务器。可以通过sendKeys("文件路径")直接上传。
插件上传:一般是指基于Flash、JavaScript 或Ajax 等技术所实现的上传功能。
演示HTML代码片段
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件上传实例 - 菜鸟教程</title> </head> <body> <h1>文件上传实例 - 菜鸟教程</h1> <form method="post" action="/TomcatTest/UploadServlet" enctype="multipart/form-data"> 选择一个文件: <input type="file" name="uploadFile" /> <br /> <br /> <input type="submit" value="上传" /> </form> </body> </html>
以下是普通上传java代码片段。
public class FileUpload { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe"); ChromeOptions Options = new ChromeOptions(); Options.addArguments("user-data-dir=C:\Users\happy\AppData\Local\Google\Chrome\User Data"); WebDriver driver = new ChromeDriver(Options); driver.manage().window().maximize(); File file = new File("C:\Users\happy\Desktop\FileUpload.html"); // 用java来实现文件读取功 driver.get(file.getAbsolutePath()); driver.findElement(By.name("uploadFile")).sendKeys("C:\Users\happy\Desktop\FileUpload.html"); // 获取文件上传文半框位置,传入文件上传地址。 driver.close(); driver.quit(); } }
通过这种方法上传,就避免了操作Windows 控件的步骤。如果能找到上传的input 标签,那么基本上就可以通过sendKeys()。
插件上传,可以使用AutoIt 实现上传 编写脚本 来实现。AutoIt 的安装以及使用需要参考AutoIt 使用手册等相关文档。selenium 通过AutoIt 来操作window窗口的操作实质是通过java代码来调用AutoIt 生成的脚本.exe文件。
通过Java调用的exe 程序并不在Java 的可控范围内。换句话说,exe 执行多长时间,执行是否出错,Java 程序都无法得知。
以下是在AutoIt 编辑器中编辑的操作文件上传窗口的代码。
ControlFocus("打开","","Edit1") ;识别windows窗口 WinWait("[CLASS:#32770]","",10) ;窗口等待十秒 ControlSetText("打开", "", "Edit1", "C:UsershappyDesktopFileUpload.html") ;想输入框中输入需要上传的地址 Sleep(2000) ControlClick("打开", "","Button1"); ;点击[打开】按钮
以下是java代码
public static void main(String[] args) throws InterruptedException { System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe"); ChromeOptions Options = new ChromeOptions(); Options.addArguments("user-data-dir=C:\Users\happy\AppData\Local\Google\Chrome\User Data"); WebDriver driver = new ChromeDriver(Options); driver.manage().window().maximize(); File file = new File("C:\Users\happy\Desktop\FileUpload.html"); // 用java来实现文件读取功 driver.get(file.getAbsolutePath()); driver.findElement(By.name("uploadFile")).click(); // 点击选择文件按钮 Thread.sleep(3000); // 设置等待3秒 Runtime exe = Runtime.getRuntime(); // Java 的Runtime 模块的getruntime.exec()方法可以调用exe 程序并执行。 try { String str = "E://upload.exe"; exe.exec(str); // 运行指定位置的.exe文件 } catch (IOException e) { System.out.println("Error to run the exe"); e.printStackTrace(); } driver.close(); driver.quit(); }