博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AutoIT:界面与自动化操作结合来简化日常劳动: .Net Reactor验证License,设置License,创建License,截图AutoIt自动化实现。(四)...
阅读量:4674 次
发布时间:2019-06-09

本文共 8761 字,大约阅读时间需要 29 分钟。

在该自动化项目实用过程中,虽然一定程度上提高了工作效率,但是偶尔的不作为,让人不是很爽。我花了一些时间对代码进行了再次优化,执行效率得到了显著提高。

代码优化的主要地方是:set_License那一块儿,常见的问题是:焦点获取不正确,导致send命令把Date或者HID发送到不合适的地方。

优化的途径是:

1. 写一个init方法,当调用该方法的时候,把焦点放到Grid的前列;

2. 写一个collapse方法,当调用该方法的时候,把Grid中展开的所有方法都收缩起来,防止send发送命令到不合适的地方;

3. 加了一个焦点判断。因为有几个控件的control ID是一致的,当实用controlGetText方法的时候,获取的text信息不正确,我加了一个判断,如果不正确,就重新获取焦点。

代码如下:

 #include <ScreenCapture.au3>

#include <GuiConstantsEx.au3>
#include <date.au3>
#include <GuiTab.au3>
Opt(
"WinTitleMatchMode"
)
AutoItSetOption(
"SendKeyDelay"
)
AutoItSetOption(
"WinWaitDelay"
)
;区域截图
Func screen_capture($path)
    
if FileExists($path)= 0 or StringInStr($path,"\")=0
Then
        
MsgBox(0,
"Path Error"
,
"Please input correct Path info!"
)
    
Else
        
$handle = WinGetHandle(
".NET Reactor"
)
        
if $handle=
"" 
then return 0
        
ConsoleWrite(_Now() &
" "
&
"Screen capture win handle: " 
& $handle & @CRLF)
        
WinActivate($handle)
        
$control = ControlGetHandle($handle,
""
,
"[Name:groupBox6]"
)
        
ConsoleWrite(_Now() &
" "
&
"Screen capture Control handle: " 
& $control & @CRLF)
        
;_ScreenCapture_Capture(
"D:\abc.jpg"
, 350,290,900,420)
        
_ScreenCapture_CaptureWnd($path &
"\AutoIt.jpg"
, $control)
    
EndIf
EndFunc
 
;无论焦点在哪儿,都回归到包含 EvaluationType 行
Func init($handle)
    
$text = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
    
ConsoleWrite(_Now()&
" a "
& $text & @CRLF)
    
$text2 = $text
    
While 
StringInStr($text,
"EvaluationType ="
) = 0
        
ConsoleWrite(_Now()&
" "
& $text & @CRLF)
        
ControlSend($handle,
""
,
""
,
"{UP}"
)
        
$text = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
        
If 
$text = $text2
And 
$text2 =
"False" 
Then
            
ControlSend($handle,
""
,
""
,
"{Down}"
)
            
ExitLoop
        
EndIf
    
WEnd
    
ConsoleWrite(_Now()&
" b "
& $text & @CRLF)
EndFunc
 
;无论选项展开了多少次,都让所有的展开项收缩
Func collapse($handle)
    
$text = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
    
ControlSend($handle,
""
,
""
,
"{Down}"
)
    
$text2 = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
    
While 
$text <> $text2
        
If 
StringInStr($text,$text2) <> 0
Then
            
ControlSend($handle,
""
,
""
,
"{up}{enter}{down}"
)
            
$text = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
            
ControlSend($handle,
""
,
""
,
"{Down}"
)
            
$text2 = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
        
Else
            
$text = $text2
            
ControlSend($handle,
""
,
""
,
"{Down}"
)
            
$text2 = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
        
EndIf
    
WEnd
EndFunc
 
 
;设置 Hardware ID
Func set_hardwareID($hardware_id, $date)
    
if StringLen($hardware_id) <> 24 or StringInStr($date,
"-"
)=0 or StringLen($date)<8
Or  
StringLen($date)>10
Then
        
MsgBox(0,
"Create license error"
,
"Please input correct License create info!"
)
    
Else
        
$handle = WinGetHandle(
".NET Reactor"
)
        
if $handle=
"" 
then return 0
        
ConsoleWrite(_Now() &
" "
&
"Set hardware ID Window handle: " 
& $handle & @CRLF)
        
WinActivate($handle)
        
$tab_control = ControlGetHandle($handle,
""
,
"[name:tabControl2]"
)
        
_GUICtrlTab_ClickTab($tab_control, 2)
        
SendKeepActive($handle)
        
ControlSend($handle,
""
,
""
,
"{tab 4}"
)
        
$text = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
        
While 
StringInStr($text,
"RSAKeyValue"
) <>0
            
ControlSend($handle,
""
,
""
,
"{tab 4}"
)
            
$text = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
        
WEnd
 
        
init($handle)
        
collapse($handle)
        
init($handle)
 
        
;输入日期
        
ControlSend($handle,
""
,
""
,
"{down}{enter}{down 2}"
)
        
$text = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
        
If 
StringInStr($text,
"/"
) <>0
Then
            
ControlSetText($handle,
""
,
"[Class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1; Text:False]"
,$date)
            
ControlSend($handle,
""
,
""
,
"{up 2}{enter}{up}"
)
        
Else
            
collapse($handle)
            
init($handle)
        
EndIf
 
        
;输入Hardware ID
        
ControlSend($handle,
""
,
""
,
"{down 2}{enter}{down 2}"
)
        
$text = ControlGetText($handle,
""
,
"[class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1]"
)
        
If 
StringInStr($text,
"-"
) <>0
Then
            
ControlSetText($handle,
""
,
"[Class:WindowsForms10.EDIT.app.0.1f550a4_r15_ad1; Text:False]"
,$hardware_id)
            
ControlSend($handle,
""
,
""
,
"{up 2}{enter}{up 2}"
)
        
Else
            
collapse($handle)
            
init($handle)
        
EndIf
    
EndIf
EndFunc
 
;保存 License
Func save_license($path)
    
if FileExists($path)= 0 or StringInStr($path,"\")=0
Then
        
MsgBox(0,
"Path Error"
,
"Please input correct Path info!"
)
    
Else
        
$handle = WinGetHandle(
".NET Reactor"
)
        
if $handle=
"" 
then return 0
        
ConsoleWrite(_Now() &
" "
&
"Save License win handle: " 
& $handle & @CRLF)
        
WinActivate($handle)
 
        
$control_handle = ControlGetHandle($handle,
""
,
"[Name:button1]"
)
        
ConsoleWrite(_Now() &
" "
&
"Save License Create License button: " 
& $handle & @CRLF)
        
ControlClick($handle,
""
,$control_handle)
 
        
$check = WinWaitActive(
"Save License As.."
)
        
if $check = 0
Then
            
ConsoleWrite(_Now() &
" " 
&
"Save License As pop up window failed" 
& @CRLF)
            
Return 
0
        
EndIf
        
$save_window_handle = WinGetHandle(
"Save License As.."
)
        
ConsoleWrite(_Now() &
" "
&
"Save License popup window handle: " 
& $save_window_handle & @CRLF)
 
        
$save_input_control = ControlGetHandle($save_window_handle,
""
,
"Edit1"
)
        
ConsoleWrite(_Now() &
" "
&
"Save License input field handle: " 
& $save_input_control & @CRLF)
 
        
ControlSetText($save_window_handle,
""
,$save_input_control,$path &
"\SageTouch.License"
)
        
$save_button_handle = ControlGetHandle($save_window_handle,
""
,
"Button1"
)
        
ConsoleWrite(_Now() &
" "
&
"Save License Save button: " 
& $save_button_handle & @CRLF)
 
        
ControlClick($save_window_handle,
""
,$save_button_handle)
        
if WinWait(
"确认另存为"
,
""
,1)<>0
Then
            
$popup_handle = WinGetHandle(
"确认另存为"
)
            
WinWaitActive($popup_handle)
            
ControlClick($popup_handle,
""
,
"Button1"
)
        
EndIf
    
EndIf
    
;获取窗口句柄
EndFunc
 
;检查 License 是否是正确的
Func exam_license($path)
    
If 
FileExists($path &
"\SageTouch.License"
)=0 or StringInStr($path,"\")=0
Then
        
MsgBox(0,
"Exam license"
,
"Can not find license to exam"
)
    
Else
        
$handle = WinGetHandle(
".NET Reactor"
)
        
if $handle=
"" 
then return 0
        
WinActivate($handle)
        
SendKeepActive($handle)
        
$handle2 = ControlGetHandle($handle,
""
,
"[NAME:menuStrip1]"
)
        
if $handle2 =
"" 
then return 0
        
ConsoleWrite(_Now() &
" " 
&
"Get menu handle" 
& $handle2 & @CRLF)
        
ControlSend($handle,
""
,
""
,
"{ALT}{Tab 2}{Enter}{Down}{Enter}"
)
        
$check = WinWaitActive(
"License Examiner"
,
""
, 5)
        
if $check = 0
Then
            
ConsoleWrite(_Now() &
" " 
&
"License Examiner pop up window failed" 
& @CRLF)
            
Return 
0
        
EndIf
        
$license_exam_handle = WinGetHandle(
"License Examiner"
)
        
ConsoleWrite(_Now() &
" "
&
"License examiner window handle: " 
& $license_exam_handle & @CRLF)
 
        
$open_license_handle = ControlGetHandle($license_exam_handle,
""
,
"[Name:button2]"
)
        
ConsoleWrite(_now() &
" Open License button handle: "
&$open_license_handle & @CRLF)
        
ControlClick($license_exam_handle,
""
,$open_license_handle)
 
        
$check = WinWaitActive(
"Please Select License File"
,
""
, 5)
        
if $check = 0
Then
            
ConsoleWrite(_Now() &
" " 
&
"Select License File pop up window failed" 
& @CRLF)
            
Return 
0
        
EndIf
 
        
$select_license_handle = WinGetHandle(
"Please Select License File"
)
        
ConsoleWrite(_Now()&
" "
&
"Select License File window handle: " 
& $select_license_handle & @CRLF)
 
        
$select_license_input_handle = ControlGetHandle($select_license_handle,
""
,
"Edit1"
)
        
$open_button_handle = ControlGetHandle($select_license_handle,
""
,
"Button1"
)
        
ControlSetText($select_license_handle,
""
,$select_license_input_handle,$path &
"\SageTouch.License"
)
        
ControlClick($select_license_handle,
""
,$open_button_handle)
    
EndIf
EndFunc
 
;Create a new GUI
GUICreate(
"Create License"
, 700, 300)
 
GUICtrlCreateLabel(
"Hardware ID"
, 30, 30, 250, 20)
$hardware_id = GUICtrlCreateInput(
"33DD-8F20-FA26-7E2A-CDE6"
, 30, 50, 250, 20)
 
GUICtrlCreateLabel(
"Expire Date"
, 300, 30, 200, 20)
$date = GUICtrlCreateInput(
"2013-10-1"
, 300, 50, 200, 20)
 
 
GUICtrlCreateLabel(
"License File Path"
, 30, 100, 120, 20)
$path = GUICtrlCreateInput(
""
, 30, 120, 470, 20)
 
$exam_License = GUICtrlCreateButton(
"Exam License"
, 30, 170, 120, 20)
$Create_License = GUICtrlCreateButton(
"Create License"
, 180, 170, 120, 20)
$Save_License = GUICtrlCreateButton(
"Save License"
, 330, 170, 120, 20)
$Screen_Capture = GUICtrlCreateButton(
"Screen Capture"
, 480, 170, 120, 20)
 
GUISetState()
While 
1
    
$msg = GUIGetMsg()
    
Select
        
Case 
$msg = $GUI_EVENT_CLOSE
            
Exit
        
Case 
$msg = $Create_License
            
set_hardwareID(GUICtrlRead($hardware_id), GUICtrlRead($date))
        
Case 
$msg = $Screen_Capture
            
screen_capture(GUICtrlRead($path))
        
Case 
$msg = $Save_License
            
save_license(GUICtrlRead($path))
        
Case 
$msg = $exam_License
            
exam_license(GUICtrlRead($path))
    
EndSelect
Wend

通过该段代码的反复修改:

1. 提高了我对controlSend命令的认识,代码的设计关系到该命令的效率,准确性;

2. 加强了我对while循环的掌握;

3. 以后出现反复验证的问题,应该能够参考该代码。

转载于:https://www.cnblogs.com/autotest/p/3406368.html

你可能感兴趣的文章
51nod 1091 线段的重叠(贪心)
查看>>
jQuery Event 模块 源码浅解
查看>>
svn使用笔记
查看>>
vue.js基础知识篇(4):过滤器、class与style的绑定2
查看>>
flex 图片旋转(解决公转和自转问题)
查看>>
函数柯里化浅解
查看>>
C# 生成pdf
查看>>
迅速理解 XML
查看>>
BZOJ 1004: [HNOI2008]Cards [Polya 生成函数DP]
查看>>
笨方法学python(本文为阅读时从此书摘录的笔记) 第四天
查看>>
Interview
查看>>
window.event对象详尽解析
查看>>
如何高效检查一个数组中是否包含某个值?
查看>>
JAVA中如何判断一个输入是数字(小数和整数)还是字符串?
查看>>
【笔记】汇编..寄存器和地址的概述
查看>>
Commons- BeanUtils学习笔记(转)
查看>>
UWP 播放声音文件
查看>>
大学毕业后拉开差距的真正原因
查看>>
记一次成功部署kolla-ansible ocata版本过程
查看>>
hdu3507 Print Article
查看>>