【自動化測試】PC端自動化(二)


**

一、環境安裝

**
1.命令行安裝方法
pip install pywinauto

2.手動安裝方法
安裝包下載鏈接:
pyWin32: python調用windows api的庫
https://sourceforge.net/projects/pywin32/files/pywin32/Build 220/

comtypes: COM接口的調度https://github.com/enthought/comtypes/releases

six: 用來兼容Python2和Python3的庫
https://pypi.org/project/six/

Pillow:可選,用來做屏幕截圖的
https://pypi.org/project/Pillow/2.7.0/

Pywinauto:PC端自動化工具
https://github.com/pywinauto/pywinauto/releases

解壓縮后執行 python setup.py install
注:建議使用第一種命令行安裝,方便。

3.環境檢查
命令行中打開python解釋器,運行以下代碼,windows自帶的記事本會被啟動,若無報錯,則證明pywinauto已安裝成功。

  from pywinauto.application import Application
  app = Application(backend="uia").start("notepad.exe")
  • 1
  • 2

在這里插入圖片描述

二、PC端元素定位工具介紹及判斷backend
1.Backend判斷
Pywinauto中backend有兩種:win32和uia,默認為win32。可使用spy++和Inspect工具判斷backend適合寫哪種。例如:如果使用Inspect的UIA模式,可見的控件和屬性更多的話,backend可選uia,反之,backend可選win32。
在這里插入圖片描述

2.工具介紹

  1. Spy++ (定位元素工具(win32))
  2. Inspect(定位元素工具(uia))
  3. UI Spy (定位元素工具)
  4. Swapy(可簡單生成pywinauto代碼)

三、啟動並創建一個實例對象
1.啟動
start()用於還沒有啟動軟件的情況。timeout為超時參數(可選),若軟件啟動所需的時間較長可選timeout,默認超時時間為5s。
start(self, cmd_line, timeout=app_start_timeout)
示例:
app = Application(backend = ‘uia’).start(r"E:\Office\Office14\EXCEL.exe)

2.連接
connect()用於連接已經啟動的程序。連接一個已經運行的程序有以下幾種方法:
a)process:進程id
app = Application().connect(process=2341)
b)handle:應用程序的窗口句柄
app = Application().connect(handle=0x010f0c)
c)path:進程的執行路徑(GetModuleFileNameEx 模塊會查找進程的每一個路徑並與我們傳入的路徑去做比較)
app = Application().connect(path=“D:\Office14\EXCEL.exe”)

d)參數組合(傳遞給pywinauto.findwindows.find_elements()這個函數)
app = Application().connect(title_re=".*Notepad", class_name=“Notepad”)

注:
應用程序必須先准備就緒,才能使用connect(),當應用程序start()后沒有超時和重連的機制。在pywinauto外再啟動應用程序,需要sleep,等程序start

四、 窗口、對話框及控件元素定位方式
1.window,dialog定位方式
1)基於title定位
a)如何獲取title?
title為窗口的名稱,可使用UISpy一類的定位元素工具去查找。
如圖所示,該對話框中的title為Name屬性值:“替換”
在這里插入圖片描述

b)若使用定位元素工具找不到title怎么辦?
使用print_control_identifiers()方法打印出當前窗口或對話框中的所有title
格式:
app.YourDialog. print_control_identifiers()

示例如圖,demo詳見locate_by_title.py:
在這里插入圖片描述

c)使用title定位方式的寫法
Untitled_notepad = u’無標題 – 記事本’
app. Untitled_notepad.draw_outline(colour = ‘red’) #app.window(best_match=‘Untitled - Notepad’)
注:這種寫法適用於英文系統,英文軟件,其他語言的系統會存在編碼問題,需轉碼再使用。

app[‘無標題 – 記事本’] .draw_outline(colour = ‘red’)
注:適用於除英文外其他語言的系統,不用轉碼

2)top_window()定位
app.top_window() #此方法可返回應用軟件的最頂層窗口(是窗口,不是窗口彈出的對話框)
注:此方法目前沒有經過測試,它會返回應用程序的頂級窗口,但可能不是Z-Order中的頂級窗口。

3)關鍵字傳參
若以上方法不能滿足定位元素的需求,可使用以下列表中的參數傳參定位元素,參數可以組合使用。
示例:
app.window(class_name = ‘Notepad’).draw_outline(colour = ‘red’)

常用參數表:

可傳參數 對應屬性名稱備注
class_name ClassName
class_name_re 正則匹配window Classname
title Name Window窗口名
title_re 正則匹配窗口名
best_match 模糊匹配類似的title
handle 句柄
framework_id FrameworkId(一般情況下FrameworkId不是唯一的)
process ProcessId,進程id(注意:每次啟動后,進程id都會變)
control_id control_id
control_type ControlType()
auto_id AutomationId

2. control定位方式

  1. 基於title定位(同window,dialog中的title定位)
    app[‘your dialog title’][‘your control title’]

    app.dlg.control

  2. 層級定位
    app.window(class_name = ’Notepad’).window(class_name = ‘#32770’)
    app.window(class_name = ‘Notepad’).child_window(class_name = ‘#32770’)

  3. wpath定位
    若元素值為空,或不是唯一的情況下,可使用類似selenium中xpath的定位方式,根據查子元素的序號去定位元素。
    示例:
    app_window = app.window(class_name=‘Qt5QWindowIcon’) #定位登錄窗口
    app_window.children()[1].children()[0].children()[0] .children()[2] #定位用戶名輸入框控件(序號從0開始查)

五、常用方法

1**.調試定位控件**
a)print_control_identifiers(depth = None, filename = None)
以樹形結構打印出所有控件可識別出的標識
depth:打印的深度,缺省時打印最大深度。
filename:將返回的標識存成文件(生成的文件與當前運行的腳本在同一個路徑下)
eg:dlg. print_control_identifiers(filename =’a.txt’)

b)draw_outline(colour =’green’,thickness = 2,
fill = win32defines.BS_NULL, rect = None)
默認為在當前定位到的窗口或控件周圍畫出一條邊界線,方便我們看出定位到了哪個控件
colour:邊界線的顏色,默認為綠
thickness:線的粗細,默認為2
fill:以何種方式填充矩形(沒試過,詳見源碼base_wrapper.py)
rect:根據坐標畫出矩形(默認是在當前定位到的元素上畫出一個矩形)
c) is_dialog 判斷是否為dialog

2. 隱式等待
a) wait(wait_for, timeout = None, retry_interval = None)
wait_for可傳入五種參數, 可以組合傳參,但要以空格隔開:
exists: 窗口變成有效的句柄
visible: 窗口可見,沒有隱藏
enabled: 窗口沒有disable
ready: visible + enable
active: active
timeout:設置超時時間,若在n秒內沒有等到窗口在wait_for中傳入的幾種狀態,則會拋出TimeoutError。
retry_interval:超時后,間隔n秒再次重試。
Dlg.wait(“exists ready”, timeout = 5, retry_interval = 3)

b) wait_not(wait_for_not,timeout = None,retry_interval = None)
等待窗口不處於某種狀態時。參數與wait傳參一致。

3. 輸入框輸入
a)type_keys()
Dlg.control.type_keys(“xxxxx”)
4. 菜單欄
menu_select()
eg:app.window.menu_select(Edit -> Replace)
5. 鼠標點擊
a)click() 點擊Button控件
b)check_by_click() 通過click()方法勾選checkbox
c)uncheck_by_click() 通過click()方法取消勾選checkbox
d)get_check_state() 返回checkbox的勾選狀態(0沒勾選,1勾選,2不定)
e)is_checked(勾選返回true,為勾選返回false,不定返回None)
f)check() 勾選checkbox
g)uncheck() 不勾選checkbox
h)invoke() 點擊(uia mode)
i)toggle () 勾選checkbox(uia mode)
6. 鍵盤操作
“+”:Shift
“^”:Control
“%”:Alt
在這里插入圖片描述

pwinauto中,win32與uia的調用方法不同,定位方式,常用方法有空會后續更新。。。。
轉載自https://blog.csdn.net/weixin_40161673/article/details/83246861


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM