在用selenium进行自动化测试的时候,会碰到上传弹窗的问题,例如要你上传本地文件或者本地图片,例如这种弹窗。
这就是本地上传弹窗。接下来我们就看看如何处理它吧。
当你要上传图片的前端代码是用input时,例如:
就可以使用这种方法。
代码实现:
//点击上传营业执照第一种(只限于input框,直接sendkeys图片路径)
driver.findElement(By.xpath("/html/body/div/div/div/div/div[1]/div/form/div/div[2]/div[4]/div[2]/div[2]/div/div/div/div[1]/div")).sendKeys("C:\\Users\\jolie\\Desktop\\QQ图片2.jpg");
因为本地文件上传是利用系统自身调用的弹层,而Selenium不支持调用操作系统的操作,所以这种情况下,利用Selenium无法完成图片上传,这时,我们选择其他工具实现文件上传。
autoIT3工具介绍:
AutoIT是一个类似脚本语言的软件,利用此软件我们可以方便的实现模拟键盘、鼠标、窗口等操作,实现自动化。利用AutoIT编写合适的脚本,然后将脚本编译成可执行文件,在自动化实现时,直接调用此脚本实现文件上传。
1.首先下载autoIT3这个工具,下载地址:autoIT3下载地址
2.使用
先看看我们主要要使用的三个工具。
AutoIt Window Info
这个工具用来识别Windows控件,在弹出系统上传弹窗的页面上打开该工具,之后拖动Finder tool到需要识别的地方。例如上传框以及确定按钮。
SciTE Script Editor
获取文本框和上传按钮的元素信息后,打开SciTE Script Editor,将以下代码复制粘贴到文本区域。这段代码的用意是首先判断所传参数是否大于1个,之后调用handleUpload函数,函数是先判断进行文件上传的是什么浏览器,之后,根据上一步所采集到的文本框及上传按钮元素属性,实现文件路径的打开“上传”按钮的点击,也就是上传功能的实现。保存生成后缀为.au3的文件。
;first make sure the number of arguments passed into the scripts is more than 1
If $CmdLine[0]<2 Then Exit EndIf ;if parmas num <2 ,then break
;$CmdLine[0] ;参数的数量
;$CmdLine[1] ;第一个参数 (脚本名称后面)
;$CmdLine[2] ;第二个参数
;都是从cmd传入参数
handleUpload($CmdLine[1],$CmdLine[2])
;定义上传函数,有两个参数,第一个是浏览器名字,第二参数是文件路径
Func handleUpload($browser, $uploadfile)
Dim $title ;定义一个title变量
;根据弹窗的title来判断是什么浏览器
If $browser="ie" Then ; 代表IE浏览器
$title="选择要加载的文件"
ElseIf $browser="chrome" Then ; 代表谷歌浏览器
$title="打开"
ElseIf $browser="firefox" Then ; 代表火狐浏览器
$title="文件上传"
EndIf
if WinWait($title,"",4) Then ;等待弹出出现,最大等待时间是4秒
WinActivate($title) ;找到弹出窗口之后,激活当前窗口
ControlSetText($title,"","Edit1",$uploadfile) ;把文件路径放入输入框,此”Edit1“是用FinderTool获 取到的
ControlClick($title,"","Button1") ;点击保存或者打开或者上传按钮,此“Button1”使用FinderTool获取到的
Else
Return False
EndIf
EndFunc
Compile Script To .exe
将生成的.au3文件变异为.exe的可执行文件。
打开Compile Script To .exe,将刚刚生成的.au3文件装换成.exe文件
接下里应该如何在程序中使用我们生成的文件呢?
加入以下一段代码:
//第二种办法,用autoIT3工具
Thread.sleep(4000);
Runtime.getRuntime().exec("D:\\image\\first.exe"+ " " + "chrome" + " " + "D:\\image\\QQ图片2.jpg" );
//三个参数分别是脚本地址(转换之后的),浏览器,你要上传的图片,文件地址
接下里运行就可以了。
虽然autoIT完全可以进行图片的上传,但是太麻烦了。因此,我们用jdk自带的Robot类来实现图片上传。
Robot类主要就是模拟键盘操作,利用复制和黏贴进行文件或者图片的上传。
代码如下:不懂的看注释
//第三种方法,用robot类控制模拟键盘操作
Thread.sleep(1000);
String path = "D:\\image\\QQ图片2.jpg";
//图片或文件的路径
StringSelection stringSelection = new StringSelection(path);
//指定图片的路径,使用相对路径
Toolkit.getDefaultToolkit().getSystemClipboard()
.setContents(stringSelection, null);
//把图片路径复制粘贴到剪切板
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ENTER);
//按下Enter键
robot.keyRelease(KeyEvent.VK_ENTER);
//释放Enter键
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
//按下Ctrl+V
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_V);
//释放Ctrl+V
robot.keyPress(KeyEvent.VK_ENTER);
//再次点击Enter键
robot.keyRelease(KeyEvent.VK_ENTER);
//再次释放Enter键
Thread.sleep(5000);
完成!