selenium解决上传文件问题之总结
一、上传文件框是input形式
- 首先定位上传按钮
- 发送要上传的文件
driver.findElement(By.id("XX")).sendKeys("D:\20.jpg");
利用Robot类处理文件上传。
其大致流程可以为:
1、 利用selenium点击web上本地文件的上传按钮;
2、 在弹出的弹框中,文件路径输入框默认的是光标的聚焦,将文件在磁盘上的路径通过拷贝和黏贴的方法写上去。
3、 通过按下回车,默认触发弹框的确定按钮,完成文件上传的功能。
这里以百度首页的利用图片搜索为例:
打开百度首页,搜索按钮左侧有一个照相机的图标,点击可以选择图片搜索,我们通过本地上传图片的过程来模拟文件自动化上传操作。准备条件,在百度图片搜索一个图片,保存到桌面,例如找到一个关于selenium的图片,然后保存在桌面,名称为selenium.jpg。
相关实现代码如下:
import java.awt.Robot; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; import java.awt.event.KeyEvent; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class shangchuang { public static void main(String[] args)throws Exception { WebDriver driver=new FirefoxDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS); driver.get("https://www.baidu.com"); //指定图片路径 StringSelection selection=new StringSelection("C:\Users\你的用户名\Desktop\selenium.jpg"); //把图片路径复制到剪切板 Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null); System.out.println("selection"+selection); //点击照相机这个工具 driver.findElement(By.xpath("//*/span[@class='soutu-btn']")).click(); //点击本地上传图片 driver.findElement(By.xpath("//*/div[@class='upload-wrap']")).click(); //新建一个Robot类的对象 Robot robot=new Robot(); Thread.sleep(1000); //按下Ctrl+V robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_V); //释放Ctrl+V robot.keyRelease(KeyEvent.VK_CONTROL); robot.keyRelease(KeyEvent.VK_V); Thread.sleep(2000); //点击回车 robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER); } }
二、上传文件框不是input形式
- 当上传文件框不是input时,需要借助AutoIT这个工具
- 下载地址:https://www.autoitscript.com/site/autoit/downloads/
- 注意一下,安装过程中32位还是64位,安装后,在开始菜单中会显示这些:
- 常用的三个组件:
- AutoIT Window Info(x64) :用来定位
- SciTE Script Editor :用来写脚本
- Compile Script to .exe(x64):用来转换成exe
下面开始定位上传框:
- 将Finder Tool拖拽到文件名处,如图:
- 记录一下如下内容:
Title=打开,ClassnameNN=Edit1,Class=#32770
注:每个浏览器打开的上传框的title不一样,需注意。
3. 再次定位打开按钮:
- 记录如下内容:
ClassnameNN=Button1 - 打开SciTE Script Editor 开始写脚本:
;ControlFocus("title" ,"text",controlID)定位到打开窗口 ControlFocus("打开","","Edit1") ;等待元素出现,时间为20s WinWait("[CLASS:#32770]","",20) ;设置上传的文件 ControlSetText("打开","","Edit1","C:UsersYBBDesktop1.png") ;点击上传按钮 ControlClick("打开","","Button1");
测试是否成功的方法:
-
在浏览器中测试:
点击上传文件按钮后,弹出选择文件框,运行脚本时,要保证此窗口打开状态,在SciTE Script Editor中点击Tools的GO,即可运行成功。如图:
在cmd中测试:
首先要将SciTE Script Editor中编写的脚本转换成exe文件,就需要用到Compile Script to .exe(x64),打开后如图:
打开cmd,输入如下图, 双引号不要省略:
把脚本代码放进eclipse中,先定位上传文件按钮,
第一种写法: driver.findElement(By.xpath("XXXX")).click(); String[] str = {"C:\Users\YBB\Desktop\upload.exe"}; try{ Runtime.getRuntime().exec(str); }catch(IOException e){ e.printStackTrace(); } 第二种写法比较简便: driver.findElement(By.xpath("XXXX")).click(); Runtime.getRuntime().exec("C:\Users\YBB\Desktop\upload.exe");
执行之后,上传成功!
如果遇到upload.exe不好用,重新保存一次就好了。