python篇-pywinauto使用-持續更新

1- pywinauto 中的uia是什么意思?

pywinauto庫中,uia指的是UI Automation,這是Windows操作系統提供的一種技術框架,用于實現用戶界面(UI)的自動化測試和輔助功能訪問。UI Automation是微軟從Windows Vista開始引入的核心技術,旨在為所有UI元素提供一致的編程接口,無論這些元素是由何種技術(如Win32、WPF、UWP等)實現的。

pywinauto中,通過指定backend="uia",用戶可以選擇使用UI Automation作為底層引擎來與應用程序的UI元素進行交互。這為自動化測試提供了更廣泛的支持,尤其是在處理現代Windows應用(尤其是使用WPF和UWP技術構建的應用)時更為有效。UI Automation后端相比傳統的win32后端,提供了更豐富和高級的元素屬性、控制模式(Control Patterns)以及事件支持,使得自動化腳本可以更加靈活和強大。

使用UI Automation后端,開發者可以更容易地定位和操作UI元素,如獲取元素的屬性、模擬鼠標和鍵盤操作、監聽UI事件等,這對于創建復雜的自動化測試場景尤其有用。

2-pywinauto 中main_window.child_window()方法及參數詳細介紹

pywinauto中,child_window()方法是用于定位父窗口中的一個特定子窗口或控件。這對于自動化測試中準確地找到并操作特定的UI元素至關重要。下面是對child_window()方法及其參數的詳細說明:

基本用法

child_window()方法屬于窗口對象,用于在當前窗口的所有子窗口中搜索符合指定條件的第一個子窗口。基本語法如下:

Python

1parent_window.child_window(arguments)

其中,parent_window是你已經獲取到的窗口對象,arguments是用于篩選子窗口的一系列關鍵字參數。

參數詳解

child_window()方法接受多個關鍵字參數來精確地定位子窗口,常見的參數包括但不限于:

  • title: 字符串,控件的標題或文本。
  • class_name: 字符串,控件的類名。
  • control_type: 字符串,控件的類型(僅在UIA backend下有效)。
  • auto_id: 字符串,控件的自動化ID(AutomationId)。
  • name: 字符串,控件的名稱屬性,可能與標題或自動化ID不同。
  • backend: 字符串,指定后端類型,如?'win32'?或?'uia',默認自動選擇。
  • process: 整數,指定目標窗口所在的進程ID。
  • enabled: 布爾值,是否只查找啟用的控件。
  • visible: 布爾值,是否只查找可見的控件。
  • top_level_only: 布爾值,是否只在頂級窗口中查找。
  • found_index: 整數,當找到多個匹配項時,可以選擇特定索引的匹配項。
  • control_id: 整數,控件的ID(Windows API中的控件ID)。
  • handle: 整數或ctypes.c_void_p,直接指定控件的句柄。
  • regex_title: 正則表達式對象或字符串,用于匹配標題的正則表達式。
  • regex_class_name: 同上,但用于匹配類名的正則表達式。
  • best_match: 字符串,用于best_match()邏輯,嘗試匹配最接近的控件。

示例

假設你想在記事本應用的主窗口中找到名為“文件”(File)的菜單項,可以這樣做:

Python

1from pywinauto import Application
2
3app = Application(backend="uia").start("notepad.exe")
4main_window = app.window(title="無標題 - 記事本")
5
6# 使用class_name和title定位子窗口
7menu_item = main_window.child_window(class_name="MenuItem", title="文件")

注意事項

  • 參數組合:通常,為了精確匹配,你需要結合多個參數一起使用。比如,同時使用class_nametitle可以更準確地定位目標控件。
  • 性能考量:如果條件設置得過于寬泛,可能會導致搜索緩慢或找到錯誤的控件。盡量使用具體的屬性來縮小搜索范圍。
  • 異常處理:如果找不到匹配的子窗口,child_window()會拋出異常。可以使用try-except結構來妥善處理這種情況。

通過靈活運用child_window()方法及其參數,你可以高效地定位并操作UI自動化中的各種元素。

3-child_window() ? ?children() ? descendants()方法介紹

如果要獲取父窗口下的所有直接子窗口(而不只是單個子窗口),可以使用children()方法,它會返回一個包含所有直接子元素的列表。例如:

Python

1all_direct_children = parent_window.children()

而如果你需要遞歸地獲取所有子孫窗口(子窗口以及子窗口的子窗口等),可以使用descendants()方法:

Python

1all_descendants = parent_window.descendants()

總結來說,parent_window.child_window()是用于定位單個滿足特定條件的子窗口,而不是獲取所有子內容。 若要獲取所有子內容,請根據需要使用children()descendants()

4-pywinauto打開程序時,程序啟動的比較慢,或點擊按鈕彈窗比較慢,或者打開新窗口窗口渲染的比較慢,怎么添加合理的等待時間

在使用pywinauto進行自動化操作時,合理地添加等待時間是非常重要的,尤其是在程序啟動慢、按鈕點擊后彈窗延遲或新窗口渲染速度較慢的情況下。這能確保腳本在繼續執行下一步操作前,等待相關的UI元素準備就緒。以下是幾種添加等待時間的方法:

1. 顯式等待(推薦)

使用wait方法是最靈活且推薦的等待方式,它允許你指定等待的條件和超時時間。

等待窗口可見:

Python

app.Window(title="窗口標題").wait("visible", timeout=10)
等待控件可用:

Python

app.Dialog.child_window(title="按鈕標題", control_type="Button").wait("enabled", timeout=20)

2. 靜態等待(time.sleep)

雖然不如顯式等待靈活,但在某些簡單場景下可以使用time.sleep來簡單地暫停腳本執行。

Python

import time
time.sleep(5)  # 等待5秒

3. 動態等待

對于某些不確定何時完成的操作,可以在循環中結合檢查條件和短暫停頓來實現動態等待。

Python

import timetimeout = 30  # 總超時時間
interval = 1  # 檢查間隔start_time = time.time()
while time.time() - start_time < timeout:if app.Window(title="窗口標題").exists():breaktime.sleep(interval)
else:raise TimeoutError("窗口未在指定時間內出現")

4. 使用backend的特性

某些后端(如uia)提供了更高級的等待邏輯,例如在啟動應用程序時可以利用Application().start(..., timeout=...)來指定啟動超時時間。

5-pywinauto 打開的app有多個不同的窗口時,怎么定位具體的某個窗口

pywinauto中,如果一個應用程序打開了多個不同的窗口,要定位到具體的某個窗口,你可以根據窗口的特征來精確篩選。以下是一些常用的篩選方法:

1. 根據窗口標題(Title)

窗口標題通常是區分不同窗口最直觀的屬性。你可以使用窗口標題的精確文本或正則表達式來定位窗口。

Python

specific_window = app.window(title="窗口的精確標題")
# 或者使用正則表達式來模糊匹配
specific_window = app.window(title_re="窗口標題的一部分.*")

2. 結合類名(Class Name)

如果多個窗口的標題相似,但類名不同,你可以結合類名一起篩選。

Python

specific_window = app.window(title="窗口標題", class_name="窗口類名")

3. 控件類型(Control Type)和自動化ID(Automation ID)

在使用UIA后端時,如果窗口內有特定類型的控件或者控件具有唯一的Automation ID,也可以作為定位依據。

Python

# 假設窗口內有特定的控件類型或ID
specific_window = app.window(control_type="Window", automation_id="特定的自動化ID")

4. 使用子窗口或后代窗口

如果需要定位的窗口是另一個窗口的子窗口或后代,可以先定位到父窗口,再通過child_window()descendants()方法找到目標窗口。

Python

parent_window = app.window(title="父窗口標題")
specific_child_window = parent_window.child_window(title="子窗口標題")
# 或者遍歷所有后代窗口找到匹配的
specific_descendant_window = parent_window.descendants(title="后代窗口標題")[0]  # 注意這會返回一個列表

5. 通過句柄(Handle)

如果你已經知道了窗口的句柄,可以直接通過句柄連接到窗口。

Python

from pywinauto.windows import win32functionshandle = win32functions.FindWindowEx(None, None, "窗口類名", "窗口標題")
specific_window = app.window(handle=handle)

注意事項

  • 在使用wait方法確保窗口已經加載和可見,特別是在定位動態彈出的窗口時,這可以避免因窗口未準備好而導致的錯誤。
  • 當有多個窗口匹配相同的篩選條件時,考慮使用更具體的篩選條件或結合多個屬性來定位。
  • 如果窗口是在不同進程中創建的,可能需要使用Application.connect()方法來單獨連接到那個窗口。

6-pywinauto 中element_info 和BaseWrapper的用法

pywinauto中,element_infoBaseWrapper是兩個核心概念,它們在自動化測試和界面操作中扮演著重要角色。

element_info (pywinauto.element_info.ElementInfo)

element_info是一個底層的、面向元素信息的抽象類,它提供了對UI元素屬性的訪問和描述,但不直接支持操作。它是一個輕量級的包裝,用于存儲和傳遞關于UI元素的信息,如類名、標題、位置等,而不涉及實際的UI操作。element_info是所有控件信息的基礎,無論控件是通過哪個后端(如win32, uia)來識別的。

當你使用pywinauto的方法(如child_window())來定位一個元素時,實際上就是在創建或查找一個element_info對象。element_info對象可以被用來創建更高級的包裝對象,如BaseWrapper

BaseWrapper (pywinauto.base_wrapper.BaseWrapper)

BaseWrapper是基于element_info的更高層次的包裝,它不僅包含了元素的信息,還提供了對元素進行操作的方法,如點擊、發送文本、獲取屬性等。當你需要與UI元素進行交互時,比如點擊一個按鈕或填寫一個文本框,你應該使用BaseWrapper對象。

BaseWrapperelement_info的直接擴展,它將底層的元素信息轉換為可操作的對象。這意味著,你可以通過BaseWrapper直接執行如.click(), .set_text(), .texts(), .exists()等操作,使得自動化腳本編寫更為直觀和便利。

使用示例

假設你要操作一個按鈕,可以按照以下步驟:

Python

from pywinauto import Applicationapp = Application().start("your_app.exe")
main_win = app.window(title="Main Window Title")# 使用child_window()方法找到一個按鈕,得到的是一個BaseWrapper實例
button = main_win.child_window(title="Click Me", control_type="Button")# 然后,你可以直接調用BaseWrapper的方法來操作這個按鈕
button.click()

在這個過程中,雖然沒有直接使用element_info,但實際上child_window()內部處理了從element_infoBaseWrapper的轉換,讓你能夠直接與UI元素進行交互。

7-pywinauto 的BaseWrapper類還有哪些方法,詳細說明

根據搜索到的內容總結如下

pywinautoBaseWrapper類提供了許多方法來操作和查詢UI元素。這些方法覆蓋了從基本的屬性訪問到復雜的UI交互,下面是BaseWrapper類中一些常用方法的概覽和簡要說明:

常用屬性和方法

  1. .window_text(): 獲取控件的文本內容。
  2. .texts(): 返回一個包含控件所有文本內容的列表,適用于包含多行文本的控件。
  3. .class_name(): 返回控件的類名。
  4. .control_type(): 使用UIA后端時,返回控件的類型。
  5. .enabled(): 檢查控件是否啟用。
  6. .visible(): 檢查控件是否可見。
  7. .rectangle(): 獲取控件的矩形區域,包括坐標和大小。
  8. .set_focus(): 將焦點設置到控件上。
  9. .click_input(): 模擬鼠標點擊控件。
  10. .double_click_input(): 雙擊控件。
  11. .right_click_input(): 右鍵點擊控件。
  12. .drag_drop(target): 拖拽控件到指定的目標。
  13. .type_keys(keys, with_spaces=True, set_foreground=True): 向控件發送鍵盤輸入。
  14. .set_text(text): 設置文本控件的內容。
  15. .texts(): 獲取控件的所有文本內容,適用于可能有多行文本的控件。

控件定位和操作擴展

  1. .child_window(**kwargs): 在當前控件的子控件中查找并返回匹配條件的BaseWrapper對象。
  2. .descendants(**kwargs): 返回當前控件的所有子孫控件的列表,這些控件滿足給定的篩選條件。
  3. .parent(): 返回當前控件的直接父控件的BaseWrapper對象。
  4. .top_parent(): 返回當前控件的最頂級父控件的BaseWrapper對象。

屬性獲取與設置

  • .get_properties(): 獲取控件的所有屬性信息。
  • .set_property(name, value): 設置控件的屬性值。

圖像操作

  • .capture_as_image(): 截取控件的圖像,返回一個PIL圖像對象。

其他

  • .wait('exists', timeout=timedelta(seconds=5)): 等待控件存在,直到超時。
  • .wait('visible', timeout=timedelta(seconds=5)): 等待控件變得可見。
  • .wait_not('visible', timeout=timedelta(seconds=5)): 等待控件不再可見。

以上只列出了部分方法,實際上BaseWrapper類包含更多功能,涵蓋了大多數自動化測試和UI操作的需求。具體的使用方法和參數細節,建議參考pywinauto的官方文檔或直接查看源代碼注釋,以獲取最全面和最新的信息。

  • 嘗試顯式類型轉換:如果適用,可以嘗試將找到的元素轉換為具體的控件類型,然后調用?.click_input()?方法。

Python

from pywinauto.controls.win32_controls import ButtonWrapperbutton = ButtonWrapper(element)
button.click_input()

如果以上方法都不能解決問題,建議查閱 pywinauto 的官方文檔或訪問其GitHub頁面查看是否有相關的問題報告或更新日志。同時,確保你的Python環境是最新的,并考慮升級 pywinauto 到最新穩定版。

8-pywinauto 都可以轉換成什么控件類型Wrapper

pywinauto 提供了一系列針對不同控件類型的Wrapper類,這些類封裝了對特定類型控件的操作方法,使得自動化操作更加直觀和方便。以下是部分常用的控件類型及其對應的Wrapper類:

  1. Button - ButtonWrapper

    • 用于操作按鈕,支持點擊等操作。
  2. Edit - EditWrapper

    • 用于編輯框,支持文本的設置、獲取等操作。
  3. ComboBox - ComboBoxWrapper

    • 用于組合框(下拉列表),支持選擇項、獲取選項列表等。
  4. ListBox - ListBoxWrapper

    • 用于列表框,支持選擇項、獲取項列表等。
  5. CheckBox - CheckBoxWrapper

    • 用于復選框,支持勾選、取消勾選及狀態檢查。
  6. RadioButton - RadioButtonWrapper

    • 用于單選按鈕,支持選擇及狀態檢查。
  7. Menu - MenuWrapper

    • 用于菜單項,支持展開菜單、選擇菜單項等。
  8. TreeView - TreeViewWrapper

    • 用于樹狀視圖控件,支持節點的展開、選擇等。
  9. TabItem - TabWrapper

    • 用于選項卡控件中的單個選項卡。
  10. Dialog - DialogWrapper

    • 對話框窗口的特殊處理,雖然也是窗口,但可能包含特定于對話框的操作方法。
  11. Window - WindowWrapper

    • 通用窗口類,幾乎所有窗口都可以用這個類來操作,但針對特定控件類型使用特定的Wrapper會更方便。

請注意,直接將element_info轉換為特定的Wrapper類(如從element_infoButtonWrapper)并不總是直接支持,通常你不需要手動進行這樣的轉換。當你通過正確的篩選條件使用child_window()等方法時,pywinauto會自動為你提供最適合的Wrapper實例。如果需要更具體的控件操作,可以通過訪問BaseWrapper實例的屬性或方法來實現,因為大多數Wrapper類都是從BaseWrapper繼承而來,已經包含了基礎的交互方法。

在實際使用中,直接利用child_window()方法根據控件的屬性(如標題、類名、控制類型等)來定位并操作控件即可,大多數情況下無需關心底層的Wrapper類轉換。如果需要更高級或特定的功能,查閱pywinauto的文檔或源碼,了解特定Wrapper類的使用方法會更有幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14312.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14312.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14312.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024年電工杯高校數學建模競賽(B題) 建模解析| 大學生平衡膳食食譜的優化設計 |小鹿學長帶隊指引全代碼文章與思路

我是鹿鹿學長&#xff0c;就讀于上海交通大學&#xff0c;截至目前已經幫200人完成了建模與思路的構建的處理了&#xff5e; 本篇文章是鹿鹿學長經過深度思考&#xff0c;獨辟蹊徑&#xff0c;實現綜合建模。獨創復雜系統視角&#xff0c;幫助你解決電工杯的難關呀。 本題&…

面試八股之MySQL篇5——主從同步原理篇

&#x1f308;hello&#xff0c;你好鴨&#xff0c;我是Ethan&#xff0c;一名不斷學習的碼農&#xff0c;很高興你能來閱讀。 ??目前博客主要更新Java系列、項目案例、計算機必學四件套等。 &#x1f3c3;人生之義&#xff0c;在于追求&#xff0c;不在成敗&#xff0c;勤通…

IP地址的風險畫像及其應用

在現代互聯網環境中&#xff0c;IP地址不僅是設備在網絡中的唯一標識符&#xff0c;還是分析網絡安全和風險管理的重要工具。IP地址的風險畫像通過分析IP地址的行為和相關數據&#xff0c;揭示潛在的安全威脅&#xff0c;為企業和組織提供有效的風險管理方案。本文將探討IP地址…

齊業成工程行業數字化預算費控方案:編制、執行、數據分析全過程閉環管理

工程建設企業具備項目周期長、業務復雜的特點&#xff0c;預算費控涉及內部管理、項目、客戶、收支等&#xff0c;賬目多、且難控。 在工程企業日常預算費控過程中存在著諸多挑戰&#xff1a; ? 數據核對難&#xff1a;涉及數據多&#xff0c;需多部門協同填寫&#xff0c;需…

人工智能的陰暗面:犯罪分子如何利用 AI 進行欺詐

在當今數字化時代&#xff0c;人工智能&#xff08;AI&#xff09;正迅速成為推動各行各業生產力和創新的關鍵力量&#xff0c;而一些不法分子也開始探索如何將這些先進的工具用于他們自己的非法目的。從網絡釣魚到深度偽造&#xff0c;再到人肉搜索、越獄服務和身份驗證系統的…

【動態維護樹的直徑】【HBCPC2023】I. Colorful Tree

題目 https://codeforces.com/gym/105139/problem/I 思路 其實相當于是分別求黑色點和白色點所構成的樹的直徑。 當兩個連通塊連在了一起&#xff0c;假設它們的直徑是 ( u 1 , v 1 ) &#xff0c; ( u 2 , v 2 ) (u_1,v_1)&#xff0c;(u_2,v_2) (u1?,v1?)&#xff0c;(u…

【程序填空】三維點坐標平移(增量運算符重載)

題目描述 定義一個三維點Point類&#xff0c;利用友元函數重載""和"--"運算符&#xff0c;并區分這兩種運算符的前置和后置運算。 表示x\y\z坐標都1&#xff0c;--表示x\y\z坐標都-1 請完成以下程序填空 輸入 只有一行輸入&#xff0c;輸入三個整數&a…

Linux運維工程師基礎面試題整理(二)

Linux運維工程師基礎面試題整理(二) 1. 如何配置Linux網絡?請說出3種以上方法?2. 如何查詢某個目錄下的每個文件大小?3. 如何診斷ping不通服務器?4.在Linux中,如何讓一個命令在后臺運行?5. 如何查看Linux系統日志?6. 如何查看磁盤空間情況?7. 如何在Linux中查看和管理…

一個開源的工具類輪子是怎么造出來的

心路歷程 為什么要做 在22年9月的某一天&#xff0c;在公司開需求評審時&#xff0c;接到了一個給PDF、圖片添加水印的需求。做為一個剛工作的CURD程序員&#xff0c;在遇到這些問題時&#xff0c;第一反應是去github上找找有沒有類似的開源框架。但是&#xff0c;出乎我意料…

2024年 電工杯 (B題)大學生數學建模挑戰賽 | 大學生平衡膳食食譜的優化設計 | 數學建模完整代碼解析

DeepVisionary 每日深度學習前沿科技推送&頂會論文&數學建模與科技信息前沿資訊分享&#xff0c;與你一起了解前沿科技知識&#xff01; 本次DeepVisionary帶來的是電工杯的詳細解讀&#xff1a; 完整內容可以在文章末尾全文免費領取&閱讀&#xff01; 問題1&…

快手二面準備【面試準備】

快手二面準備【面試準備】 前言版權快手二面準備秋招一面中的問題實習一面中的問題計算機網絡和操作系統論壇項目登錄注冊ThreadLocal代替session存儲用戶秒殺項目登錄注冊->阿里驗證碼->rpcsession為什么改為token實現&#xff0c;redis存儲用戶信息由binlog的用法->…

Python魔法學院:PySpider篇——網絡世界的探險與征服

Hi&#xff0c;我是阿佑&#xff0c;迎來到Python魔法學院&#xff0c;今天阿佑要帶大家學習的是PySpider篇——一門讓你在網絡世界中探險與征服的魔法課程。從環境搭建到高級功能應用&#xff0c;再到性能優化&#xff0c;每一個章節都是成為數據大師的必經之路&#xff01; 文…

為什么拼命賺錢:窮怕了

我內心深處比較自卑。 從小在農村長大&#xff0c;爸不管媽不愛。 這么說大家沒感覺&#xff0c;從小什么都干&#xff0c;六歲開始做飯&#xff0c;每次開學都會全員大掃除&#xff0c;站在那里腳踩泥土地、眼神呆滯、雙手無處安放、眼神都不敢直視的小伙子就是我&#xff0…

VS Code中使用 Anaconda 環境

在 Visual Studio Code (VS Code) 中使用 Anaconda 環境進行 Python 開發&#xff0c;可以充分利用 Anaconda 提供的包管理和虛擬環境功能&#xff0c;同時享受 VS Code 提供的強大開發工具和調試功能。以下是詳細步驟&#xff1a; 1. 安裝 Visual Studio Code 和 Anaconda 首…

JavaScript Window對象

一、BOM&#xff08;瀏覽器對象模型&#xff09; window對象是一個全局對象&#xff0c;也可以說是JavaScript中的頂級對象。 像document、alert()、console.log()這些都是window的屬性&#xff0c;基本BOM的屬性和方法都是window的。 所有通過var定義在全局作用域中的變量、…

GitLab的原理及應用詳解(四)

本系列文章簡介&#xff1a; 隨著軟件開發的不斷進步和發展&#xff0c;版本控制系統成為了現代軟件開發過程中不可或缺的一部分。而GitLab作為其中一種流行的版本控制工具&#xff0c;在軟件開發領域享有廣泛的應用。GitLab不僅提供了強大的版本控制功能&#xff0c;還集成了項…

四川古力科技抖音小店,創新科技點亮購物新體驗

在這個數字化浪潮洶涌的時代&#xff0c;四川古力科技以其前瞻性的戰略眼光和創新能力&#xff0c;閃耀于抖音小店這片電商新藍海&#xff0c;開啟了未來購物的新紀元。作為一家集技術研發、產品創新、市場營銷于一體的科技型企業&#xff0c;古力科技不僅為消費者帶來了前所未…

idea中顯示git的Local Changes

1. 第一打開idea中的Settings文件 2. 找到Version Contro中的commint 3. 取消勾選應用即可 4. 本地提交就會顯示出來

ruoyi出現的那些bug

1、 npm install --registryhttps://registry.npm.taobao.org/element-ui request to https://registry.npm.taobao.org/element-ui failed, reason: certificate has expired 路徑錯誤 ? npm install https://registry.npmmirror.com 2、自定義模塊401 {"msg"…

Google Earth Engine(GEE)深度學習入門教程-Python數據讀入篇

Python數據讀入篇 前置條件&#xff1a; GEE預處理影像導出保存為tfrecord的數據包&#xff0c;并下載到本地tensorflow的深度學習環境 本篇文章的目的主要是把Tfrecord格式的數據加載為tf可使用的數據集格式 設定超參數 首先需要設定導出時的波段名稱和數據格式&#xff…