在使用Selenium进行自动化过程中,如果遇到如下弹出窗口,Selenium不能直接进行处理,需要借助其他工具实现,其中Autoit是常见的处理方式。
Autoit是一款小巧的工具,常用在自动化部署和测试当中。以下代码为处理安全对话框的代码,兼容windows 7和windows 10。
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Key_Lock_128px_1178033_easyicon.net.ico
#AutoIt3Wrapper_Compression=3
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
Dim$inputnum=$CmdLine[0]
If$inputnum==2Then
Dim$account=$CmdLine[1]
Dim$password=$CmdLine[2]
ConsoleWrite("Input parameter: "&$account&" "&$password&@CRLF)
Else
Dim$account="admin"
Dim$password="password"
ConsoleWrite("Use default parameter: "&$account&" "&$password&@CRLF)
EndIf
DimConst$tip00="Search Windows"
DimConst$tip01="Get Windows: "
DimConst$tip02="Windows Version: "
DimConst$tip03="User Name: "
DimConst$tip04="Password: "
DimConst$tip05="Press OK"
DimConst$tip06="Finishing"
DimConst$tip07="Finished"
DimConst$tip11="Input Info"
DimConst$tip21="Finishing"
DimConst$delay=2*1000
Dim$ret=0
Dim$dialogTitle=""
Dim$dialogTitleCN1="Windows 安全性"
Dim$dialogTitleEN1="Windows Security"
ProgressOn("Operation on Windows Security",$tip00,"",10,10)
ProgressSet(10)
IfWinExists($dialogTitleCN1)==1Then
WinActivate($dialogTitleCN1)
WinWaitActive($dialogTitleCN1,"",120);
$dialogTitle=$dialogTitleCN1;
ElseIfWinExists($dialogTitleEN1)==1Then
WinActivate($dialogTitleEN1)
WinWaitActive($dialogTitleEN1,"",120);
$dialogTitle=$dialogTitleEN1;
Else
$ret=$ret+1
$dialogTitle="Not Found Windows"
EndIf
Sleep($delay)
ConsoleWrite($tip01&$dialogTitle&@CRLF)
ProgressSet(20,$tip01&$dialogTitle)
Sleep($delay)
ConsoleWrite($tip02&@OSVersion&@CRLF)
ProgressSet(30,$tip02&@OSVersion)
Sleep($delay)
If@OSVersion=="WIN_10"Then
ProgressSet(40,$tip03&$account,$tip11)
ConsoleWrite($tip03&$account&@CRLF)
#Send("admin{TAB}")
ifControlSend($dialogTitle,"","",$account&"{TAB}")<>1Then
$ret=$ret+2
ConsoleWrite("Input User name error"&@CRLF)
ProgressSet(50,"Input User name error",$tip11)
EndIf
sleep($delay)
ProgressSet(60,$tip04&$password,$tip11)
ConsoleWrite($tip04&$password&@CRLF)
#Send("password")
IfControlSend($dialogTitle,"","",$password)<>1Then
$ret=$ret+4
ConsoleWrite("Input password error"&@CRLF)
ProgressSet(70,"Input password error",$tip11)
EndIf
sleep($delay)
ProgressSet(80,$tip05,$tip11)
ConsoleWrite($tip05&@CRLF)
#Send("{ENTER}")
IfControlSend($dialogTitle,"","","{ENTER}")<>1Then
$ret=$ret+8
ConsoleWrite("Input ENTER error"&@CRLF)
ProgressSet(85,"Input ENTER error",$tip11)
EndIf
Sleep($delay)
Else
ProgressSet(40,$tip03&$account,$tip11)
ConsoleWrite($tip03&$account&@CRLF)
ifControlSetText($dialogTitle,"","Edit1",$account)<>1Then
$ret=$ret+2
ConsoleWrite("Input User name error"&@CRLF)
ProgressSet(50,"Input User name error",$tip11)
EndIf
Sleep($delay)
ProgressSet(60,$tip04&$password,$tip11)
ConsoleWrite($tip04&$password&@CRLF)
IfControlSetText($dialogTitle,"","Edit2",$password)<>1Then
$ret=$ret+4
ConsoleWrite("Input password error"&@CRLF)
ProgressSet(70,"Input password error",$tip11)
EndIf
sleep($delay)
ProgressSet(80,$tip05,$tip11)
ConsoleWrite($tip05&@CRLF)
IfControlClick($dialogTitle,"","Button2")<>1Then
$ret=$ret+8
ConsoleWrite("Press OK button error"&@CRLF)
ProgressSet(85,"Press OK button error",$tip11)
EndIf
Sleep($delay)
EndIf
ProgressSet(90,$tip06,$tip21)
ConsoleWrite($tip06&@CRLF)
Sleep($delay)
ProgressSet(100,$tip07,$tip21)
ConsoleWrite($tip07&@CRLF)
Sleep($delay)
ProgressOff()
ConsoleWrite("Exit code: "&$ret&@CRLF)
Exit($ret)
代码解释:
#AutoIt3Wrapper_Change2CUI=y: 指定编译为CMD。
$CmdLine[1]和CmdLine[2] 代表命令行的第一个参数和第二参数。
ConsoleWrite(): 写信息到控制台。
ProgressOn(),ProgressSet(),ProgressOff(): 弹出进度条视窗函数,直观显示当前的进度。
@OSVersion: 系统版本,这里用来区分win7和win10。
WinExists($dialogTitleCN1): 判断窗口是否存在,支持多语言窗口操作。
WinActivate($dialogTitleCN1): 激活窗口
ControlSend($dialogTitle, "", "", $account & "{TAB}"): 发送值到指定窗口,win10下找不到输入框属性,使用TAB切换输入框。
ControlSetText($dialogTitle,"","Edit1",$account):发送值到指定输入框。
ControlClick($dialogTitle,"","Button2"): 点击指定按钮。
以上代码使用autoit编译为exe后,在python中调用即可实现安全对话框的操作。
调用格式如下:
******.exe username password