天天看點

移動測試-Appium移動測試

移動測試

1.概念

1.定義:測試手機程式。

2.測試方面:

  • 功能測試:檢視功能是否正常。
  • 安裝解除安裝測試
  • 更新測試
  • 相容性測試:Android系統版本、廠商二次開發版本、不同的分辨率、不同的網絡。
  • 網絡切換、中斷測試
  • 使用中來電、短信
  • 橫豎屏切換
  • 健壯性:耗電量、流量消耗、崩潰恢複。

2. ADB

1.定義:Android Debug Bridge,既包含ADB服務,也包含與服務對應的Client。

2.作用:通過指令行去操作手機。

adb shell dumpsys window windows | findstr mFocusedApp

3.入門案例:等待5秒後關閉系統設定界面

步驟:打開模拟器系統設定頁面 -> 啟動appium -> 運作 demo01.py

from appium import webdriver
import time
# 連接配接移動裝置所需參數
desired_caps = {}
# 目前要測試的裝置名稱
desired_caps["deviceName"] = "127.0.0.1:62001"
# 系統
desired_caps["platformName"] = "Android"
# 系統版本
desired_caps["platformVersion"] = "7.1"
# adb shell dumpsys window windows | findstr mFocusedApp
# 要啟動的app的名稱(唯一辨別:包名)
desired_caps["appPackage"] = "com.android.settings"
# 要啟動的app的哪個界面
desired_caps["appActivity"] = ".Settings"
# 連接配接手機
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capabilities=desired_caps)
time.sleep(5)
# 關閉app
driver.close_app()
# 釋放資源
driver.quit()
           

3.操作

基礎API

①driver:

close_app()# 關閉打開的應用
quit()# 斷開連接配接
install_app('apk在電腦上的絕對路徑')# 安裝應用
remove_app('應用的包名')# 解除安裝應用
is_app_installed('應用的包名')# 判斷應用是否安裝
push_file(目标位置,base64編碼内容)
pull_file(來源位置)# 傳回值是base64編碼内容
page_source# 擷取界面xml源碼
find_element/find_elements
current_package# 擷取目前操作的應用的包名
current_activity# 擷取目前操作的界面的名稱
           

②element:

text# 擷取元素文本内容
click()# 點選元素對應位置
get_attribute(屬性名稱)# 擷取屬性值
location# 擷取元素左上角的坐标(相對于螢幕左上角)
size# 擷取元素的寬高(傳回字典類型)
           

元素定位

Android SDK提供工具

可用于查找頁面控件和滑鼠位置。

from appium import webdriver
import time
# 連接配接移動裝置所需參數
desired_caps = {}
# 目前要測試的裝置名稱
# adb devices
desired_caps["deviceName"] = "127.0.0.1:62001"
# 系統
desired_caps["platformName"] = "Android"
# 系統版本
# adb shell getprop ro.build.version.release
desired_caps["platformVersion"] = "7.1"
# adb shell dumpsys window windows | findstr mFocusedApp
# 要啟動的app的名稱(唯一辨別:包名)
desired_caps["appPackage"] = "com.android.settings"
# 要啟動的app的哪個界面
desired_caps["appActivity"] = ".Settings"
# 連接配接手機
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capabilities=desired_caps)
# print(driver.page_source) 列印該頁面所有資源
# 點選文本屬性為顯示的元素(注意:不是文本)
driver.find_element_by_xpath("//*[@text='顯示']").click()
time.sleep(3)
# 關閉app
driver.close_app()
# 釋放資源
driver.quit()
           

輸入文本

send_keys("文本内容")
# 新版本不需要輸入以下内容,可直接支援中文。若不支援時,可以在連接配接裝置時加上以下配置
desired_caps['unicodeKeyboard'] = True# unicode設定
desired_caps['resetKeyboard'] = True# 鍵盤設定

clear()# 清除文本内容
           
from appium import webdriver
import time
# 連接配接移動裝置所需參數
desired_caps = {}
# 目前要測試的裝置名稱
# adb devices
desired_caps["deviceName"] = "127.0.0.1:62001"
# 系統
desired_caps["platformName"] = "Android"
# 系統版本
# adb shell getprop ro.build.version.release
desired_caps["platformVersion"] = "7.1"
# adb shell dumpsys window windows | findstr mFocusedApp
# 要啟動的app的名稱(唯一辨別:包名)
desired_caps["appPackage"] = "com.android.settings"
# 要啟動的app的哪個界面
desired_caps["appActivity"] = ".Settings"
# 連接配接手機
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capabilities=desired_caps)
time.sleep(1)

# 點選搜尋框
driver.find_element_by_xpath("//*[@resource-id='com.android.settings:id/search']").click()
time.sleep(1)
driver.find_element_by_xpath("//*[@resource-id='android:id/search_src_text']").send_keys("abc")

# 關閉app
driver.close_app()
# 釋放資源
driver.quit()
           

模拟手勢

滑動:

duration預設600毫秒。滑動存在“慣性”,會根據按下、擡起位置及總時間,滾動不一樣的距離。

滾動:

不需要手動擷取位置,直接傳遞元素。手機的分辨率不會造成影響。

from appium import webdriver
import time
# 連接配接移動裝置所需參數
desired_caps = {}
# 目前要測試的裝置名稱
# adb devices
desired_caps["deviceName"] = "127.0.0.1:62001"
# 系統
desired_caps["platformName"] = "Android"
# 系統版本
# adb shell getprop ro.build.version.release
desired_caps["platformVersion"] = "7.1"
# adb shell dumpsys window windows | findstr mFocusedApp
# 要啟動的app的名稱(唯一辨別:包名)
desired_caps["appPackage"] = "com.android.settings"
# 要啟動的app的哪個界面
desired_caps["appActivity"] = ".Settings"
# 連接配接手機
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capabilities=desired_caps)
time.sleep(1)
# 滑動 driver.swipe(270, 640, 270, 320)
# 滾動
el1 = driver.find_element_by_xpath("//*[@text='通知']")
el2 = driver.find_element_by_xpath("//*[@text='WLAN']")
driver.scroll(el1, el2)
time.sleep(1)
# 關閉app
driver.close_app()
# 釋放資源
driver.quit()
           

拖拽:

按下 -> 等待一定時間 -> 移動 -> 松手

TouchAction:

比較複雜的、連續的觸摸行為,如圖案解鎖螢幕。

建立TouchAction對象,傳遞driver參數 -> 添加動作 -> 執行操作perform()

press(self,el,x,y,pressure)# 按下,el和xy必須傳遞其中之一,pressure是ios專用
long_press(self,el,x,y,duration=1000)
move_to(self,el,x,y)# 移動
wait(self,ms)# 等待
release()# 松手
tap(self,el,x,y,count = 1)#輕敲/點選,count=2可以模拟輕按兩下
           

TouchAction 模拟滑動

from appium import webdriver
import time
from appium.webdriver.common.touch_action import TouchAction
# 連接配接移動裝置所需參數
desired_caps = {}
# 目前要測試的裝置名稱
# adb devices
desired_caps["deviceName"] = "127.0.0.1:62001"
# 系統
desired_caps["platformName"] = "Android"
# 系統版本
# adb shell getprop ro.build.version.release
desired_caps["platformVersion"] = "7.1"
# 要啟動的app的名稱(唯一辨別:包名)
desired_caps["appPackage"] = "com.android.settings"
# 要啟動的app的哪個界面
desired_caps["appActivity"] = ".Settings"
# 連接配接手機
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capabilities=desired_caps)
time.sleep(1)

# 執行個體化TouchAction 此處wait必不可少,wait(0)是使用預設600毫秒
action = TouchAction(driver)
action.press(driver.find_element_by_xpath("//*[@text='通知']")).wait(500).move_to(driver.find_element_by_xpath("//*[@text='WLAN']"))
action.release()
# 執行
action.perform()
time.sleep(1)

# 關閉app
driver.close_app()
# 釋放資源
driver.quit()
           

設定解鎖圖案Z

# 滑動繪制解鎖圖案
from appium import webdriver
import time
from appium.webdriver.common.touch_action import TouchAction
# 連接配接移動裝置所需參數
desired_caps = {}
# 目前要測試的裝置名稱
# adb devices
desired_caps["deviceName"] = "127.0.0.1:62001"
# 系統
desired_caps["platformName"] = "Android"
# 系統版本
# adb shell getprop ro.build.version.release
desired_caps["platformVersion"] = "7.1"
# adb shell dumpsys window windows | findstr mFocusedApp
# 要啟動的app的名稱(唯一辨別:包名)
desired_caps["appPackage"] = "com.android.settings"
# 要啟動的app的哪個界面
desired_caps["appActivity"] = ".Settings"
# 連接配接手機
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capabilities=desired_caps)
time.sleep(1)

# 滑動界面到可以看到安全欄
action = TouchAction(driver)
action.press(driver.find_element_by_xpath("//*[@text='聲音']")).wait(500)
action.move_to(driver.find_element_by_xpath("//*[@text='WLAN']"))
action.release()
action.perform()
time.sleep(1)
# 點選安全欄
driver.find_element_by_xpath("//*[@text='安全']").click()
time.sleep(1)
# 點選螢幕鎖定欄
driver.find_element_by_xpath("//*[@text='螢幕鎖定']").click()
time.sleep(1)
# 點選圖案欄
driver.find_element_by_xpath("//*[@text='圖案']").click()
time.sleep(1)

# 繪制解鎖圖案Z
action.press(x=105, y=450).wait(200)
action.move_to(x=270, y=450).wait(200)
action.move_to(x=435, y=450).wait(200)
action.move_to(x=270, y=615).wait(200)
action.move_to(x=105, y=780).wait(200)
action.move_to(x=270, y=780).wait(200)
action.move_to(x=435, y=780).wait(200)
action.release()
action.perform()

# 關閉app
driver.close_app()
# 釋放資源
driver.quit()
           

driver的其他操作

.device_time# 擷取手機時間
.get_window_size()# 擷取螢幕大小
.network_connection# 擷取手機網絡資訊 1飛行模式 2wifi 4移動資料 6=2+4
.set_network_connection(數字)# 設定手機網絡資訊
.keyevent(按鍵數字)# 點選按鍵
.get_screenshot_as_file/save_screenshot(圖檔路徑)# 截屏
.open_notifications()# 打開通知欄