在该自动化项目实用过程中,虽然一定程度上提高了工作效率,但是偶尔的不作为,让人不是很爽。我花了一些时间对代码进行了再次优化,执行效率得到了显著提高。
代码优化的主要地方是: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. 以后出现反复验证的问题,应该能够参考该代码。