Python-uiautomator2學習3--基本操作及應用

前言

本次我們將會學習 uiautomator2 的一些基本操作,並通過這些基本操作,完成對手機裏的應用進行簡單的自動化操作。

常見基本操作

連接手機

import uiautomator2 as u2

# USB方式,需確保能夠通過 adb 命令獲取到手機設備序列號(如 c01bcd5d )
d = u2.connect('c01bcd5d')

# Wifi方式,需確保當前設備的IP(如192.168.1.12),和電腦處於同一網絡下
d = u2.connect('192.168.1.12')

# 可以不帶參數,此時會從環境變量中取設備IP或序列號,如果環境變量爲空,則使用 connect_usb() 
d = u2.connect()

設備信息

  • 獲取設備基本信息
d.info
  • 獲取詳細設備信息
d.device_info
  • 獲取設備屏幕大小
d.window_size()
  • 獲取設備序列號
d.serial
  • 獲取設備局域網IP
d.wlan_ip

應用管理

  • 啓動應用
# 啓動app
d.app_start("com.sec.android.app.popupcalculator")

# 通過指定 app activity 的方式啓動app
d.app_start("com.netease.cloudmusic", ".activity.LoadingActivity")

# 先執行關閉app操作,再重新啓動app
d.app_start("com.netease.cloudmusic", ".activity.LoadingActivity", stop=True)
  • 停止應用
# 停止單個應用
d.app_stop("com.netease.cloudmusic")

# 停止所有應用
d.app_stop_all()

# 停止除了某個應用外的其他應用
d.app_stop_all(excludes=['com.netease.cloudmusic'])
  • 清除應用數據
d.app_clear("com.netease.cloudmusic")
  • 顯示正在運行的應用
d.app_current()
  • 獲取所有正在運行的應用
d.app_list_running()
  • 獲取應用信息
d.app_info("com.sec.android.app.popupcalculator")

屏幕相關操作

  • 打開屏幕
d.screen_on()
  • 關閉屏幕
d.screen_off()
  • 獲取屏幕狀態
d.info.get('screenOn')
  • 單擊
# 根據座標點擊
d.click(x, y)

# 根據定位的元素對象點擊
d(resourceId="com.sec.android.app.popupcalculator:id/bt_equal").click()
d(text="=").click()
d(description="等於").click()
d(className="android.widget.EditText").click()
d.xpath('//*[@resource-id="com.sec.android.app.popupcalculator:id/bt_equal"]').click()
  • 雙擊
d.double_click(x, y)
  • 長按
d.long_click(x, y)
  • 滑動
# fx/fy爲起始座標,tx/ty爲目標座標
d.swipe(fx, fy, tx, ty)

# fx/fy爲起始座標,tx/ty爲目標座標,在1.0s內進行滑動
d.swipe(fx, fy, tx, ty, duration=1.0)

# 屏幕上滑/下滑/左滑/右滑
d.swipe_ext("up")
d.swipe_ext("down")
d.swipe_ext("left")
d.swipe_ext("right")

# scale爲滑動百分比,默認0.9,,滑動距離爲屏幕寬度的90%
d.swipe_ext("up", scale=0.9)
  • 截屏
# 直接保存截圖
d.screenshot("C:\\Users\\wintest\Desktop\\home.jpg")

# 先獲取 PIL.Image 格式圖像,再進行保存
image = d.screenshot()
image.save("C:\\Users\\wintest\Desktop\\home.jpg")
  • 獲取 dump 圖層結構信息
d.dump_hierarchy()
  • 打開通知窗口
d.open_notification()
  • 打開快速設置窗口
d.open_quick_settings()

UI對象操作

  • 判斷UI對象是否存在
# UI對象存在返回 True ,否則返回 False 
d(resourceId="com.sec.android.app.popupcalculator:id/bt_equal").exists
d(text="=").exists
d(description="等於").exists
d(className="android.widget.EditText").exists
d.xpath('//*[@resource-id="com.sec.android.app.popupcalculator:id/bt_equal"]').exists

# 也可以是下面這樣,存在返回 True ,否則返回 False 
d.exists(resourceId="com.sec.android.app.popupcalculator:id/bt_equal")
d.exists(text="=")
d.exists(description="等於")
d.exists(className="android.widget.EditText")
  • 獲取UI對象信息
d(resourceId="com.sec.android.app.popupcalculator:id/bt_equal").info
d(text="=").info
d(description="等於").info
d(className="android.widget.EditText").info
d.xpath('//*[@resource-id="com.sec.android.app.popupcalculator:id/bt_equal"]').info

全局設置

  • 默認等待超時時間
# 方式一
d.implicitly_wait(10.0)

# 方式二
d.settings["wait_timeout"] = 10.0

鍵盤操作

  • 輸入框操作
# 設置輸入框文本
d(text="XXX").set_text("xxxx")

# 獲取輸入框文本
d(text="XXX").get_text()

# 清空輸入框文本
d(text="XXX").clear_text()
  • 啓用FastInputIME輸入法
d.set_fastinput_ime(True)
  • adb廣播輸入文本
d.send_keys("XXX")
  • 模擬輸入法的搜索功能
d.send_action("search")
  • 關閉FastInputIME輸入法,切換爲平常使用的輸入法
d.set_fastinput_ime(False)
  • 獲取當前的輸入法
d.current_ime()

更多更詳細的操作及介紹,大家可以前往 Github 進行學習:https://github.com/openatx/uiautomator2

編寫測試腳本

這裏針對手機計算器進行簡單的自動化模擬測試。

import uiautomator2 as u2
import time

d = u2.connect("192.168.1.12")

# 啓動計算器
d.app_start("com.sec.android.app.popupcalculator")

# 模擬 1+2=3
d(resourceId="com.sec.android.app.popupcalculator:id/bt_01").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_add").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_02").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_equal").click()
time.sleep(2)

# 點擊清除按鈕
d(resourceId="com.sec.android.app.popupcalculator:id/bt_clear").click()

# 模擬 20*35=700
d(resourceId="com.sec.android.app.popupcalculator:id/bt_02").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_00").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_mul").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_03").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_05").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_equal").click()
time.sleep(2)

# 點擊清除按鈕
d(resourceId="com.sec.android.app.popupcalculator:id/bt_clear").click()

# 模擬 1200-100=1100
d(resourceId="com.sec.android.app.popupcalculator:id/bt_01").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_02").click()
d.double_click(0.38, 0.95)  # 數字0的座標
d(resourceId="com.sec.android.app.popupcalculator:id/bt_sub").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_01").click()
d.double_click(0.38, 0.95)  # 數字0的座標
d(resourceId="com.sec.android.app.popupcalculator:id/bt_equal").click()
time.sleep(2)

# 點擊清除按鈕
d(resourceId="com.sec.android.app.popupcalculator:id/bt_clear").click()

# 模擬 96/24=4
d(resourceId="com.sec.android.app.popupcalculator:id/bt_09").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_06").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_div").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_02").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_04").click()
d(resourceId="com.sec.android.app.popupcalculator:id/bt_equal").click()
time.sleep(2)

# 點擊歷史記錄
d(resourceId="com.sec.android.app.popupcalculator:id/history_button").click()
# 滑動歷史記錄
d.swipe(0.35, 0.6, 0.35, 0.9, duration=2.0)
# 清除歷史記錄
d(resourceId="com.sec.android.app.popupcalculator:id/clear_btn").click()
time.sleep(2)

# 關閉計算器
d.app_stop("com.sec.android.app.popupcalculator")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章