与文件下载对应的文件上传弹出框,同样也是非常不好处理的。下面介绍如何使用AutoIT解决这个问题。
AutoIT对于弹出框的处理原理其实都是一样的,只要能获取到窗口的句柄或者controlID就能搞定所有的操作了。而获取这些东西其实对于AutoIT而言是非常简单的。比如句柄,可以通过winList把所有的窗体的title名称和对应的句柄都列出来,根据title来找到窗体的句柄。controlID比较难获取,但是可以用AutoIT中的AdvancedMode替代(有点类似于QTP的描述性编程)。
下面以51testing个人头像设置为例,说明如何实现上传的自动化测试。
进入51testing个人博客的管理页面后,选择“空间设置”,选择上传图片。
现在编写如下脚本:
$FileName=IniRead ( "config.ini", "ToolConfig", "FileName", "test.JPG" )
While 1
WinWaitActive("选择要上载的文件,通过: u.51testing.com","")
If WinExists("选择要上载的文件,通过: u.51testing.com") Then
ControlGetFocus("选择要上载的文件,通过: u.51testing.com")
ControlFocus ( "选择要上载的文件,通过: u.51testing.com", "", "" )
ControlFocus ( "选择要上载的文件,通过: u.51testing.com", "", "[CLASS:ComboBox; INSTANCE:1]" )
ControlSend("选择要上载的文件,通过: u.51testing.com", "", "[CLASS:ComboBox; INSTANCE:1]","桌面")
$y=ControlClick ( "选择要上载的文件,通过: u.51testing.com", "", "[CLASS:ComboBox; INSTANCE:1]")
Sleep(2000)
ControlFocus ( "选择要上载的文件,通过: u.51testing.com", "", "[CLASS:Edit; INSTANCE:1]" )
Send($FileName)
Sleep(2000)
$y=ControlClick ( "选择要上载的文件,通过: u.51testing.com", "打开", "[class:Button;instance:2]")
ExitLoop
EndIf
Wend
说明:
(1)类似于“[CLASS:ComboBox; INSTANCE:1]”这样的东西,就是AutoIT的AdvancedMode,一些情况下是可以替代controlID的。
(2)不同于下载文件,这里做了一点改进,就是模拟用户去选择上传路径。
ControlFocus ( "选择要上载的文件,通过: u.51testing.com", "", "[CLASS:ComboBox; INSTANCE:1]" )
ControlSend("选择要上载的文件,通过: u.51testing.com", "", "[CLASS:ComboBox; INSTANCE:1]","桌面")
$y=ControlClick ( "选择要上载的文件,通过: u.51testing.com", "", "[CLASS:ComboBox; INSTANCE:1]")
首先是把焦点移到ComboBox下拉框上,然后发送“选择桌面”指令。发送完成之后并不会选择到“桌面”,仅仅是在ComboBox中输入了“桌面”文字。此时需要使用ControlClick去点击一下,才能真正进入到这个路径。
(3)同样的,我也把这个脚本编译成了exe。可以在自己的博客管理中尝试一下。首先运行这个exe,然后点击“选择照片”等待脚本处理了。
FileUpload..zip(280 KB)