(官方网站http://www.autoitscript.com/site/ )
(中文文档:http://www.jb51.net/shouce/autoit/)
在selenium自动化中需要使用它!!
在浏览器中,上传和下载文件时,调用的是windows api,无法使用selenium webdriver驱动,只能使用第三方工具进行模拟操作。另外,对于浏览器中的ActiveX控件等,同样只能使用第三方工具进行操作。
另外需要注意,使用了AutoIt,就不能使用Selenium的RemoteWebDriver的特性了,也就是分布式执行的相关操作了。因为所有的Autoit的脚本其实都是运行在本地的,所以如果你需要让Selenium继续可以在不同的机器上运行,使用Jenkins操作。
AutoIt
被设计用来在Windows GUI(用户界面)中进行自动操作。通过它可以组合使用模拟键击、鼠标移动和窗口/控件操作等来实现自动化任务,而这是其它语言所无法做到或尚无可靠方法实现的(比如VBScript和SendKeys)。
Au3脚本,也就是AutoIt3 Windows自动安装脚本语言
AutoIt运行时读取一个指定的脚本文件,完成如下的一系列操作:
AutoIt的.au3脚本文件编可译成独立运行的程序。这样就可以使得编译后的程序在没有安装AutoIt(或者说没有AutoIt3.exe这个解释程序)的机器上运行。
AutoIt 脚本程序可通过命令行调用,当我们传递命令行参数到脚本中的时候会有特殊的变量来保存相关数据。
$CmdLine
保存命令行参数。
@ScriptName 脚本名称。注意:脚本文件名不算进参数
$CmdLine[0] 保存着命令行中参数的个数(不包括脚本文件名)
$CmdLine[1] 是第 1 个参数
$CmdLine[2] 则是第 2 个参数
...
我们常用 $CmdLine[$CmdLine[0]]
来表示最后一个参数...
如果某个参数中包含有空格字符则必须用英文“双引号”把这个参数围住。已编译的脚本的也是以同样的方式接收命令行参数的。
脚本文件名
保存着完整的未被拆分的命令行语句
AutoIt3.exe myscript.au3 参数xxx "一个字符串型参数"
脚本得到的参数:
$CmdLine[0] 等价于... 2 表示参数个数为2
$CmdLine[1] 等价于... 参数1 表示参数1
$CmdLine[2] 等价于...这是一个字符串型参数 表示参数2
@ScriptName 等价于... myscript.au3 脚本名称
$CmdLineRaw 等价于... myscript.au3 参数xxx "一个字符串型参数"
AutoIt 的大部分窗口函数都有窗口标题和文本参数。AutoIt 支持四种“窗口匹配”模式。若要更改此模式可通过函数 AutoItSetOption 修改 WinTitleMatchMode 属性即可。
Opt("WinDetectHiddenText", 0) ;0=不检测, 1=检测
Opt("WinSearchChildren", 1) ;0=不搜索, 1=搜索子窗口
Opt("WinTextMatchMode", 1) ;1=完全匹配, 2=快速匹配
Opt("WinTitleMatchMode", 1) ;1=开头, 2=子串, 3=完全, 4=高级
Opt("WinWaitDelay", 250) ;250 毫秒
AutoItSetOption("WinTitleMatchMode", 2)
WinWaitActive
函数的功能是使脚本暂停执行并一直等到指定窗口出现且激活为止。
WinWaitActive ( "窗口标题", ["窗口文本"], [超时时间] )
AutoIt 中的变量可用来存储窗口句柄(HWND)。所谓窗口句柄是指 Windows 自动分配给每个新创建的窗口的特殊值。窗口句柄可用来代替窗口标题参数。使用窗口句柄来代替窗口标题的好处是能够更加精确地识别窗口,比如说有时候我们会同时打开同一应用程序的多个副本,这些窗口具有完全相同的窗口标题和窗口文本,这时就可以利用窗口句柄的唯一性来准确识别窗口了。另外,当使用窗口句柄代替窗口标题参数时,窗口文本参数将被完全忽略。
$handle = WinGetHandle("无标题 - 记事本", "")
WinClose($handle)
我们在窗口上能看到的东西大多都是以下控件的一种:按钮、列表框、文本编辑框、静态文本等。(注意: AutoIt 仅支持标准的 Microsoft 控件)
运行 AutoIt Window Info 之后您可以试着把鼠标移动到自己感兴趣的窗口上,在 Window Info 的窗口就会显示当前鼠标经过的控件的信息。这些信息包括:
控件 ID(Control ID):Windows指定给每个控件的数值型标识符(实际上就是整数值)。
通常这是用来识别控件的最好的方法。
类别名(ClassNameNN):每个标准的 Microsoft 控件都具有“类别名”,在 AutoIt 中还把它
跟该控件的“实例”组合起来,并称为“ClassNameNN”。当控件ID不适用的时候就可以考虑使用这个
方法(这种情况通常发生在静态文本控件上)。
文本(Text):控件上的文本信息,可以用这些文本代替“ClassNameNN”来识别控件,但是如果有
多个控件的文本都相同的话可就有麻烦了。
控件句柄(Control Handle (HWND)):如果要获得某个控件的句柄则可使 ControlGetHandle
函数。控件句柄是Windows赋予控件的(独一无二的)标识符。每个被创建的控件都具有不同的句柄。
向指定控件发送鼠标点击命令:
ControlClick ( "窗口标题", "窗口文本", 控件ID [, 按钮] [, 点击次数]] )
修改指定控件的文本:
ControlSetText ( "窗口标题", "窗口文本", 控件ID, "新文本" )
向激活窗口发送模拟键击操作:
Send ( "按键" [, 标志] )
[可选参数] 更改程序处理“按键”的方式:
标志 = 0 (默认)按键中含有的特殊字符替换,^:Ctrl, !:Alt, +:Shift, #:Win(徽标键)
标志 = 1,按键将按原样发送。
向指定控件发送命令:
ControlCommand( "窗口标题", "窗口文本", 控件ID, "命令", "选项" )
打开一个记事本,增加内容并保存:
Run("notepad.exe")
AutoItSetOption("WinTitleMatchMode", 2)
WinWaitActive("记事本")
Send("This is some text.")
WinClose("记事本")
WinWait("","保存(&S)")
;
; 建议提供更精确的指令
;
Send("!S")
WinWait("另存为")
;
;下面的两条命令为:用alt+N,进入输入文本框,然后传递保存路径,可以用下面命令替换。
;ControlSetText("","","[CLASS:Edit; INSTANCE:1]","d:\new2a.txt")
;
Send("!N");
Send("d:\new2.txt");
;需要处理如果在路径底下已经存在的情况
Send("!S")
更新,将指令精确化:
Run("notepad.exe");
AutoItSetOption("WinTitleMatchMode", 2);
WinWaitActive("记事本");
Send("This is some text.");
WinClose("记事本");
WinWaitActive("记事本","保存(&S)");
ControlClick("", "","[CLASS:Button; INSTANCE:1]");
WinWaitActive("另存为");
ControlSetText("","","[CLASS:Edit; INSTANCE:1]","d:\new2ab.txt");
ControlClick("", "","[CLASS:Button; INSTANCE:1]");
WinWaitActive("确认另存为","",2);
If WinExists("确认另存为") Then
ControlClick("确认另存为","","[CLASS:Button; INSTANCE:1]");
EndIf
再次更新,修改为函数调用:
;用于保存文件
Func _DownloadFile($file)
AutoItSetOption("WinTitleMatchMode", 2);
WinWaitActive("另存为")
ControlSetText("","","[CLASS:Edit; INSTANCE:1]",$file);
ControlClick("", "","[CLASS:Button; INSTANCE:1]");
WinWaitActive("确认另存为","",2);
;如果该路径下存在文件,则替换
If WinExists("确认另存为") Then
ControlClick("确认另存为","","[CLASS:Button; INSTANCE:1]");
EndIf
EndFunc
Run("notepad.exe");
AutoItSetOption("WinTitleMatchMode", 2);
WinWaitActive("记事本");
Send("This is some text.");
WinClose("记事本");
WinWaitActive("记事本","保存(&S)");
ControlClick("", "","[CLASS:Button; INSTANCE:1]");
_DownloadFile("d:\new2ab.txt")