**:
三、視窗操作
注意:視窗標題和視窗文字引數總是對大小寫敏感的。
1、等待視窗系列命令/函式
ahk和au3都提供了用法類似的一組視窗等待命令/函式:winwait/winwaitactive/winwaitclose。
它們分別用於等待視窗出現、等待視窗被啟用、等待視窗被關閉。由於這些命令/函式的引數類似,現僅以winwait為例說明。
ahk:
winwait [, 視窗標題, 視窗文字, 超時時間, 排除標題, 排除文字]
au3:
winwait ( "視窗標題" [, "視窗文字" [, 超時時間]] )
winwait 的作用是在目標視窗出現之前不再執行後面的所有語句。
假設我們要執行記事本程式,並在其視窗出現時提示使用者:
【示例 3.1.1 】
ahk:
run notepad
winwait, 無標題- 記事本
msgbox 記事本視窗已被開啟!
au3:
run("notepad")
winwait("無標題- 記事本")
msgbox(0, "", "記事本視窗已被開啟!")
2、啟用視窗相關命令/函式
讓目標視窗成為活動視窗的辦法就是啟用它,可用的命令/函式是winactivate:
ahk:
winactivate [,視窗標題, 視窗文字, 排除標題, 排除文字]
au3:
winactivate ( "視窗標題" [, "視窗文字"] )
3、關閉視窗
關閉視窗有兩種方式,一種是正常的關閉視窗(winclose),另一種則是強行關閉視窗(winkill):
ahk:
winclose/winkill [,視窗標題, 視窗文字, 超時時間,, 排除標題, 排除文字]
au3:
winclose/winkill ( "視窗標題" [, "視窗文字"] )
現在我們已經可以實現乙個比較簡單的功能了,比如我們可以開啟系統屬性視窗並等待其出現,視窗出現後啟用它,接著等待3秒再關閉它:
【示例 3.1.2 】
ahk:
run, sysdm.cpl
winwait, 系統屬性
winactivate, 系統屬性
winwaitactive, 系統屬性
sleep, 3000
winclose, 系統屬性
winwaitclose, 系統屬性
au3:
run("control sysdm.cpl")
winwait("系統屬性")
winactivate("系統屬性")
winwaitactive("系統屬性")
sleep(3000)
winclose("系統屬性")
winwaitclose("系統屬性")
4、更準確的標識視窗的方法(主要針對ahk指令碼)
程式在執行時起碼會有乙個程序,如果能獲得這個程序id就能在一定程度上保證對視窗的準確標識。另外,每個視窗都有定義視窗類名(class,比如說記事本視窗的類名就是notepad),所以我們可以以此排除與目標視窗不同的其它視窗類。其實,我們還有乙個更準確的方法:
每個視窗(包括控制項在內)都被windows指派了乙個可區別於其它視窗的唯一的識別符號(id),我們稱之為視窗控制代碼(hwnd)。
直接給定視窗標題來表示視窗的乙個缺點就是無法保證在指令碼執行的過程中始終以該視窗為操作目標,因為在這個過程中很有可能會有其它「同名」視窗(或者說滿足匹配條件的視窗)出現,而如果我們使用這個識別符號來表示視窗自然就能保證命令/函式的操作視窗總是同乙個視窗了。
我們先來了解一下獲得視窗控制代碼的命令/函式:
ahk:
winget[, 輸出變數, id, 視窗標題, 視窗文字, 排除標題, 排除文字]
au3:
wingethandle ( "視窗標題" [, "視窗文字"] )
其中winget獲得的視窗id將通過「輸出變數」返回,而wingethandle的返回值就是獲得的視窗id。
我們在進行自動化操作時是要先執行某個程式,如何獲得這個程式成功執行後顯示的視窗控制代碼?乙個比較保險的辦法是先獲得這個程式的程序id,然後根據這個程序id獲得它的視窗控制代碼,ahk支援使用程序id作為視窗標題使用;但au3不支援這樣使用,只能先獲得該視窗的類名再根據該類名來獲得視窗控制代碼(不夠保險):
【示例 3.1.3 】
ahk:
run, notepad, , , thispid
winwait, ahk_pid %thispid%
;這裡的ahk_pid表明跟在後面的變數是程序id
winget, thisid, id, ahk_pid %thispid%
;thisid將儲存獲得的視窗控制代碼
au3:
opt("wintitlematchmode", 4)
run("notepad")
$handle = wingethandle("classname=notepad")
現在暫且先忘記了au3吧,因為它的視窗函式一般都不支援使用視窗控制代碼作為(視窗標題)引數。
至於如何在ahk中使用視窗控制代碼,簡單的說,凡是有「視窗標題」引數的命令就可以用視窗控制代碼來代替,比如:
【示例 3.1.4 】
ahk:
run, notepad, , , thispid
;先獲得執行的記事本程式的程序id
winwait, 無標題- 記事本ahk_pid %thispid%
;等待該程序視窗的出現
winget, thishwnd, id, 無標題- 記事本ahk_pid %thispid%
;獲得視窗控制代碼
winactivate, ahk_id %thishwnd%
;這裡的ahk_id表明跟在後面的變數是視窗控制代碼
winwaitactive, ahk_id %thishwnd%
sleep, 3000
winclose, ahk_id %thishwnd%
winwaitclose, ahk_id %thishwnd%
自動化測試入門
降低成本 節省人力時間 是推動ci 持續整合 devops 軟體開發人員,it運維技術 準確性和可靠性 模擬人工難以實現的測試手段 增強產品快速持續迭代發布的能力 衡量測試標準。手工測試 較強的異常處理能力,通過人為的邏輯判斷當前步驟是否正確,測試有一定的步驟跳躍性,能夠步步跟蹤,細緻定位問題。自動...
robotframework自動化系列 登陸操作
robotframework對於程式設計能力比較弱的測試人員而言,真的是雪中送炭!我們可以使用robotframework根據之前完成的測試用例,一步步完善自動化測試。在整個測試過程而言,最常見的就是登陸 新增 修改 刪除 查詢等操作,其他的操作都是在這個基礎上進行演練。這裡就先簡單說明一下登陸的操...
自動化測試系列(一) 自動化測試體系概述
當今激烈的商業競爭中,企業中的服務和產品需要更快速的版本迭代和高質量的軟體交付,同時減少完成專案所需的成本和時間,不少企業引入了devops概念來提公升軟體研發交付效率。devops是開發和運營的結合,代表著一種文化和實踐,強調了軟體開發人員 dev 和資訊科技 it 運營與維護 o m 專業人員 ...