Android自動化測試實踐:uiautomator2 核心功能與應用指南
uiautomator2
是一個用于Android應用的自動化測試Python庫,支持多設備并行測試操作。它提供了豐富的API來模擬用戶對App的各種操作,如安裝、卸載、啟動、停止以及清除應用數據等。此外,uiautomator2
支持多種設備連接方式,包括USB、模擬器默認連接以及通過WiFi(TCP/IP)連接。
核心功能:
- 設備連接與操作:支持USB和WiFi(TCP/IP)方式連接設備,提供了查看設備列表的命令和示例代碼。
- 應用管理:能夠安裝和卸載應用,啟動、停止以及獲取正在運行的應用列表。
- 節點選擇器:提供多種節點選擇器,如基于文本、類名、描述、元素狀態、包名、資源ID等來定位UI元素。
- 節點操作:支持獲取匹配節點列表、節點存在性判斷、節點計數,以及查找父級節點、子節點和同級元素。
- 事件操作:模擬用戶交互,如點擊、輸入文本、滑動屏幕等。
- 坐標定位:獲取元素坐標并執行坐標點擊。
- 提示信息獲取:能夠獲取系統提示語。
適用場景:
- 自動化測試:為Android應用提供自動化測試解決方案,提高測試效率。
- 應用開發:輔助開發者在開發過程中快速定位和測試UI元素。
- 教育與研究:作為學習和研究Android自動化測試工具的資源。
使用注意:
- 確保設備開啟了開發者選項和USB調試。
- 對于WiFi連接,需要先通過USB連接設備并設置TCP/IP端口,然后通過IP地址和端口號進行連接。
附加工具:
weditor
:一個節點查看工具,幫助用戶更方便地進行節點選擇和測試。
APP的操作
url = "apk下載地址"
d.app_install(url)d.app_uninstall("包名")
d.app_start("包名")
d.app_stop("包名")
d.app_clear("包名")d.app_list_running() #獲取正在運行的列表#獲取正在運行的包名
print(d.app_current())
連接設備
查看設備列表
-
adb devices
-
要使用 uiautomator2 查看設備列表,可以使用以下命令: python -m uiautomator2 init
USB模式
注意:開發者選項,打開USB調試
import uiautomator2 as u2# 注意網絡代理
u2.wait_timeout = 20 # 設置等待時間為20秒
d = u2.connect_usb()
使用設備號連接
device = u2.connect("46d0c494") # usb連接,需要開啟開發者模式,用atx也可以開啟開發中模式,cmd輸入adb devices獲取設備號
模擬器連接
device = u2.connect() # 模擬器默認連接方式
wifi(tcpip )連接
-
USB連接手機,開發者選項,打開USB調試
-
adb tcpip 5555
-
拔掉USB連接
-
adb connect 192.168.120.139:5555 連接設備
-
adb devices 查看設備列表
-
device = u2.connect(“192.168.0.187:5555”) # tcpip同個局域網連接
如果 adb 連接斷開了,可以adb connect 192.168.0.187:5555 再次連接設備,未連接的話,
adb kill-server 重置主機
weditor工具-節點查看
#安裝
pip install weditor==0.6.4 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
#運行
python -m weditor
節點操作
選擇器
多種節點選擇器用于定位UI元素。
- text、textContains、textMatches、textStartsWith用于根據文本內容定位元素;
- className、classNameMatches用于根據類名定位元素;
- description、descriptionContains、descriptionMatches、descriptionStartsWith用于根據元素描述定位元素;
- checkable、checked、clickable、longClickable、scrollable、focused、selected、enabled、focusable用于根據元素狀態定位元素;
- packageName、packageNameMatches用于根據應用包名定位元素;
- resourceId、resourceIdMatches用于根據資源ID定位元素;
- index、instance用于根據元素在頁面中的位置定位元素。
多個匹配
import uiautomator2 as u2# 連接設備
d = u2.connect_usb()# 獲取所有匹配的節點(節點列表)
nodes = d(resourceId="com.ximalaya.ting.android:id/main_tv_name")
# 獲取所有匹配的節點列表de 下標為2的節點
node_3 = d(resourceId="com.ximalaya.ting.android:id/main_tv_name",instance=2)# 判斷節點是否存在
if nodes.exists:# 獲取匹配的節點數量count = nodes.countprint("匹配的節點數量:", count)# 循環獲取節點的text屬性for node in nodes:text = node.info["text"]print("節點的text屬性:", text)
else:print("沒有匹配的節點")
查找父級節點(比較慢)
import uiautomator2 as u2# 連接設備
d = u2.connect_usb()# 獲取節點對象
node = d(resourceId="com.example.app:id/parent_node")# 查找父級節點
parent_node = node.parent
print("父級節點:", parent_node)
查找子節點
import uiautomator2 as u2# 連接設備
d = u2.connect_usb()# 獲取節點對象
node = d(resourceId="com.example.app:id/parent_node")child_nodes_0 = d(resourceId="com.example.app:id/parent_node").child(resourceId="com.example.app:id/child_node")# 查找所有子節點
child_nodes = node.child
print("所有子節點:", child_nodes)# 或者使用 children() 方法
child_nodes = node.children()
print("所有子節點:", child_nodes)
查找同級元素
text_view = my_icon.sibling(className='android.view.View')
text view.click()
查找(上下左右)的元素 (速度慢)
my = d(resourceId='com.example.app:id/button')
my.left().click()
my.right().click()
my.down().click()
my.up().click()
獲取元素坐標
from uiautomator2 import Device# 連接設備
d = Device('設備序列號')# 獲取元素
element = d(resourceId='com.example.app:id/button')# 獲取元素中心坐標
x, y = element.center()
print(f"元素中心坐標為 ({x}, {y})")
事件操作
元素點擊
# 獲取元素
element = d(resourceId='com.example.app:id/button')
element.click()
坐標點擊
d.click(500,500)
百分比點擊
d.click(0.5,0.5)
輸入
node = d(longClickable="true",className="android.widget.EditText")node.send_keys("[炸彈]")
滑動屏幕
坐標系的起點是屏幕左上角(0,0),向右和向下為正坐標系
import uiautomator2 as u2# 獲取屏幕的寬度和高度
screen_width = d.info["displayWidth"]
screen_height = d.info["displayHeight"]
# 計算起始點和終點的坐標
start_x = screen_width // 2
start_y = screen_height - 20 # 起始點的y坐標可以根據需要進行調整
end_x = start_x
end_y = start_y - (218 * 6) # 終點的y坐標可以根據需要進行調整d = u2.connect_usb()# 執行滑動操作
d.swipe(start_x, start_y, end_x, end_y)
獲取提示語
d.totast.get_message()
文檔參考地址
- https://blog.csdn.net/qq_32603969/article/details/121459006
- https://www.jianshu.com/p/38f48390c538
- 比較全面App自動化測試工具Uiautomator2
- python+uiautomator2 實現多設備并行