客戶端自動(dòng)化測(cè)試解決方案
我們?cè)趯?shí)際的工作中,會(huì)有場(chǎng)景需要做“端到端的自動(dòng)化”,這部分自動(dòng)化實(shí)現(xiàn)成本較高,穩(wěn)定性較差。最近我們部門也涉及到這樣的業(yè)務(wù)場(chǎng)景,同時(shí)我也解決這個(gè)場(chǎng)景下做自動(dòng)化的痛點(diǎn)。下面我們就來給大家講下,我是如何解決這個(gè)問題的。
業(yè)務(wù)場(chǎng)景

?我們會(huì)在平臺(tái)側(cè)進(jìn)行一系列的配置,然后在windows客戶端上安裝我們的客戶端軟件,在進(jìn)行操作,去驗(yàn)證平臺(tái)側(cè)的配置是否符合期望
此時(shí)我們遇到2個(gè)難題
1、如果操作客戶端,我們的客戶端是一個(gè)GUI的客戶端軟件,這部分是最大的難題。
2、如果解決問題1,我們?cè)撊绾芜h(yuǎn)程控制windows去執(zhí)行我們的自動(dòng)化腳本呢?大家知道,遠(yuǎn)程執(zhí)行windows命令比執(zhí)行l(wèi)inux的命令復(fù)雜,更重要的他非常不穩(wěn)定
解決方案
1、先來解決難題2,這里我們是通過這樣的方案去解決的
我們?cè)趙indows客戶端上起了一個(gè)fastAPI框架,我們可以通過測(cè)試框架執(zhí)行web框架的api,在由fastAPI框架根據(jù)不同的接口,去本地執(zhí)行對(duì)應(yīng)的視圖函數(shù),并返回執(zhí)行結(jié)果即可。是不是很巧妙。這部分比較簡(jiǎn)單,我就不展開來說了。
?

?
2、那么還剩下一個(gè)難題,如果控制GUI客戶端呢?
實(shí)際上我們操作客戶端主要也是通過鼠標(biāo)和鍵盤來操作
所以我們采用的pyautogui+openCV方式,這一部分也是這篇博客的主要內(nèi)容。幫助大家實(shí)現(xiàn),如果做采用pyautogui+openCV的方案實(shí)現(xiàn)GUI自動(dòng)化方案
下面開始整體,正常學(xué)習(xí)GUI自動(dòng)化的基礎(chǔ)方案,今天先講下鼠標(biāo)操作和鍵盤操作
pyautogui學(xué)習(xí):鼠標(biāo)操作
1、安裝pyautogui模塊,直接pip安裝即可
?

?
2、實(shí)現(xiàn)鼠標(biāo)操作
這部分我們學(xué)習(xí)如何移動(dòng)鼠標(biāo)。先來介紹下pyautogui對(duì)坐標(biāo)的處理

?
如果我們的屏幕的分辨率是 100*100,那么左上角的坐標(biāo)就是0*0,其他點(diǎn)的坐標(biāo)就和我上圖中的一致
我們可以通過下面的命令獲取當(dāng)前屏幕的分辨率
import
?pyautogui
print
(pyautogui.size())
# Size(width=1280, height=720)
3、移動(dòng)鼠標(biāo)
由前面的知識(shí)我們知道,pyautogui是通過坐標(biāo)來移動(dòng)鼠標(biāo)的,所以移動(dòng)鼠標(biāo)就是通過傳遞不同的坐標(biāo)來進(jìn)行操作
a、移動(dòng)到絕對(duì)位置,duration的意思,在2s內(nèi)完成操作,建議這個(gè)參數(shù)大家要傳,不然會(huì)影響gui操作的穩(wěn)定性
pyautogui.moveTo(
500
,
550
,duration
=
2
)
b、移動(dòng)到相對(duì)位置
pyautogui.moveRel(
-
100
,
-
100
,duration
=
3
)
4、獲取鼠標(biāo)當(dāng)前的坐標(biāo)
pyautogui.moveTo(
500
,
550
,duration
=
2
)
print
(pyautogui.position())
# Point(x=500, y=550)
pyautogui.moveRel(
-
100
,
-
100
,duration
=
3
)
print
(pyautogui.position())
# Point(x=400, y=450)
5、鼠標(biāo)的點(diǎn)擊操作
pyautogui.click(
371
,
700
,button
=
"left"
)???
#點(diǎn)擊左鍵
time.sleep(
1
)
pyautogui.click(
1161
,
1161
,button
=
"left"
)
time.sleep(
1
)
pyautogui.click(
790
,
273
,button
=
"right"
)??
#點(diǎn)擊右鍵
鼠標(biāo)其他不常見的操作
pyautogui.mouseDown(button
=
"left"
)
#按下鼠標(biāo)左鍵
pyautogui.mouseUp(button
=
"right"
)
#松開鼠標(biāo)右鍵
pyautogui.doubleClick()
# 雙擊左鍵
pyautogui.rightClick()
# 雙擊右鍵
pyautogui.middleClick()
# 雙擊中鍵
6、鼠標(biāo)拖動(dòng)
可以操作畫圖的畫筆,或者拖動(dòng)文件
pyautogui.dragRel(
100
,
200
,duration
=
0.3
,button
=
"left"
)
pyautogui.dragTo(
100
,
200
,duration
=
0.3
,button
=
"left"
)
7、鼠標(biāo)滾動(dòng)操作
pyautogui.scroll(
200
)
pyautogui學(xué)習(xí):鍵盤操作
1、鍵盤錄入內(nèi)容
pyautogui.typewrite(
"hello python"
,interval
=
1
)
pyautogui.typewrite(message
=
"abcd"
)
pyautogui.typewrite(message
=
[
"!"
,
"A"
,
"^"
,
"1"
,
"2"
,
"3"
])
message可以傳遞字符串和列表,同樣也會(huì)自動(dòng)處理大寫和特殊字符,同樣我們也建議也傳遞一個(gè)interval參數(shù),意思是輸入每個(gè)字符相隔幾秒鐘
2、特殊鍵該如何按呢
采用press方法
pyautogui.typewrite(message
=
"abcd"
,interval
=
2
)
pyautogui.press(
"enter"
)???
#按下回車鍵
pyautogui.typewrite(message
=
[
"!"
,
"A"
,
"^"
,
"1"
,
"2"
,
"3"
],interval
=
2
)
同樣還有其他的特殊鍵,大家應(yīng)該一看就可以看的出來
esc
shiftleft
shiftright
altleft
altright
ctrlleft
ctrlright
tab
backspace
delete
pageup
pagedown
3、組合鍵該如何按呢?
可以采用下面的方法,先用keydown按下一個(gè)鍵,在按一個(gè)組合鍵,最后在用keyup松開鍵
pyautogui.press(
"enter"
)
pyautogui.typewrite(
"hello python"
,interval
=
0.2
)
pyautogui.press(
"enter"
)
pyautogui.keyDown(
"shift"
)
pyautogui.press(
"5"
)
pyautogui.keyUp(
"shift"
)

?不過我們一般采用另外一個(gè)方法來做,就是熱鍵的方法。pyautogui會(huì)幫我們按下組合鍵,然后按照相反的順序松開鍵