1. 程式人生 > >移動端自動化測試-AppiumApi接口詳解

移動端自動化測試-AppiumApi接口詳解

als data- sub mobile 存在 ont 定位 坐標 idg

Appium 初始化配置信息(Desired Capabilities),Desired Capabilities實際上就是一個字典,它主要用於向Appium Server提供初始化配置參數,如:想要測試的系統是Android還是IOS,測試哪款軟件,軟件的入口是哪裏等。

這種服務關鍵字在網上很多,百度搜一下就有一大堆了。

定位Android的appPackage與appActivity-Windows操作系統方法

通過監控adb操作日誌來找到appPackage與appActivity,CMD下輸入adb logcat | findstr Start,強制停止被測試軟件,再次打開,觀察logcat。

技術分享圖片

斜杠之前為appPackage,斜杠之後為appActivity。從此想抓那個App,就抓那個App。(logcat的日誌較多,要找點擊時第一個Start proc的日誌。)

這種查看日誌的方式比較不方便,日誌一多起來,眼睛一亂什麽也找不到了。所以可以使用SDK中的aapt進行抓取

SDK中下載最新的build-tools,通過aapt dump badging xxx.apk命令來查appPackage與appActivity。

包名:

技術分享圖片

入口:

技術分享圖片

下列代碼可以打開手機QQ:

from appium import webdriver

des = {
       resetKeyboard
: True, platformVersion: 6.0.1, noReset: True, # 不將app初始化 appActivity: com.tencent.mobileqq.activity.SplashActivity, # ‘appActivity‘: ‘.BrowserActivity‘, appPackage: com.tencent.mobileqq, # ‘appPackage‘: ‘com.android.browser‘, unicodeKeyboard
: True, deviceName: 1afd95f92, platformName: Android} # print(des) driver = webdriver.Remote(http://127.0.0.1:4723/wd/hub, des)

獲取元素系列

# Android對應content-desc IOS對應accessibility identifier
# content-desc是給殘障人士定義的特殊字段
driver.find_element_by_accessibility_id(content-desc)
 
# ID定位於selenium不同,可能存在重復的問題。
# appium-desktop抓取元素時如果出現有id,則可以直接用。
# resource-id可能出現重復,需要具體看下有多少個。
driver.find_element_by_id(resource-id)
 
# 對應class字段,有可能存在多個相同class。
# 多個相同class,每次獲取只取第一個遇到的元素。
driver.find_element_by_class_name(class)
 
# Xpath路徑定位,與Web的Xpath定位在有一點點區別
# Native App的定位以class為基準,主要用到參數有text、resource-id、index
driver.find_element_by_xpath(//android.widget.EditText[@text="手機號"])
 
# 這個在運行時,調用的是Android自帶的UI框架UiAutomator的Api
# 介紹幾個簡單常用的,text、className、resource-id
# text
# 匹配全部text文字
driver.find_element_by_android_uiautomator(new UiSelector().text("手機號"))
# 包含text文字
driver.find_element_by_android_uiautomator(new UiSelector().textContains("機"))
# 以text什麽開始
driver.find_element_by_android_uiautomator(new UiSelector().textStartsWith("手"))
# 正則匹配text
driver.find_element_by_android_uiautomator(new UiSelector().textMatches("^手.*"))
 
# className
driver.find_elements_by_android_uiautomator(new UiSelector().className("android.widget.TextView"))
# classNameMatches
driver.find_elements_by_android_uiautomator(new UiSelector().classNameMatches("^android.widget.*"))
 
# resource-id、resourceIdMatches
driver.find_element_by_android_uiautomator(new UiSelector().resourceId("com.syqy.wecash:id/et_content"))
 
# description
driver.find_element_by_android_uiautomator(new UiSelector().description("S 日歷"))
# descriptionStartsWith
driver.find_element_by_android_uiautomator(new UiSelector().descriptionStartsWith("日歷"))
# descriptionMatches
driver.find_element_by_android_uiautomator(new UiSelector().descriptionMatches(".*歷$"))
 
# Native App 暫不能使用
driver.find_element_by_tag_name(‘‘)
 
# Native App 暫不能使用
driver.find_element_by_partial_link_text(‘‘)
 
# Native App 暫不能使用
driver.find_element_by_link_text(‘‘)
 
# Native App 暫不能使用
driver.find_element_by_css_selector(‘‘)
滑動操作與拖拽操作
# 滾動處理
# elementObj1 目標滾動元素,elementObj2 起始滾動元素
# 底層通過action操作,與web ui相反,origin_el為目標元素,destination_el為起始元素
# 通過模擬手勢可以看出 從下面的元素移動到上面的元素
# action.press(origin_el).move_to(destination_el).release().perform()
# web elementObj1為要移動的元素 elementObj2為移動到某個元素
# action.click(elementObj1).move_to_element(elementObj2).release().perform()
driver.scroll(elementObj1, elementObj2)
 
#通過坐標實現滑屏操作
# 從手機的左上角開始,橫坐標為x軸,縱坐標為y
# 分辨率不同,坐標不相同,所以需要根據屏幕的大小做比例運算
driver.swipe(start_x, start_y, end_x, end_y,duration=None)
 
# 拖拽
# elementObj1源元素,elementObj2目標元素
# 通過long_press實現
driver.drag_and_drop(elementObj1, elementObj2)
 
 
# 多點觸控 模擬手指點擊
# tap模擬按住坐標多少秒,[(x,y)] 多個坐標則寫多個元祖。參數2為按住多少秒。ms(毫秒)為單位
driver.tap([(x, y)], 5000)

操作APP

# 返回是否安裝了對應包名的App True 或者 False
driver.is_app_installed(com.syqy.wecash)
 
# 關閉初始化信息中的App
driver.close_app()
 
# 啟動初始化信息中的App
driver.launch_app()
 
# 安裝app 參數為軟件的絕對路徑
driver.install_app(rC:\Users\bjhouyafan\Desktop\tester\appUi\wecash.apk)
 
# 卸載app 參數接收appPackageName
driver.remove_app(com.syqy.wecash)
 
# 獲取當前打開的app名
driver.current_activity
 
# 啟動某一個包的,某一個入口
# 參數接受appPackage,appActivity
# 可以省略多個步驟直接到達指定測試的位置
driver.start_activity(com.android.browser,.BrowserActivity)
 
# 每隔0.5秒判斷一次當前的app名稱是否是activityName
# WebDriverWait
driver.wait_activity(activityName, 5, 0.5)
 
# 將啟動的app退出到後臺,多少秒後在切回app
driver.background_app(m)
 
# 清除應用數據緩存,相當於卸載重裝
driver.reset() 

NATIVE_APP 與 WEBVIEW 上下文操作

# 返回當前session中的app類型
driver.current_context
 
# 返回當前app的類型
# WEBVIEW 或 WEBVIEW
# 底層實際調用current_context
driver.context
 
# 獲取app所有的類型
# 有WEBVIEW的則以list的形式展示兩個
driver.contexts
 
# app類型切換 參數接收app類型
# appium對selenium的switch_to的擴展
# 增加了MobileSwitchTo,繼承了selenium的switch_to
driver.switch_to.context(context)

KeyCode操作

# 隱藏鍵盤
driver.hide_keyboard()
 
# 發送按鍵碼,僅按一下,與press_keycode相同
# 可接收str或int的code碼
driver.keyevent(3)
 
# 發送按鍵碼,僅按一下,可接收str或int的code碼
driver.press_keycode(24)
 
# 發送一個長按的按鍵碼,接收參數必須是int的code碼
driver.long_press_keycode(25) 

網絡

# 返回當前手機的網絡狀態
driver.network_connection
 
# 導入
from appium.webdriver.connectiontype import ConnectionType
 
# WIFI
ConnectionType.WIFI_ONLY
 
# 數據流量
ConnectionType.DATA_ONLY
 
# 飛行模式
ConnectionType.AIRPLANE_MODE
 
# 無網絡模式
ConnectionType.NO_CONNECTION
 
# 全部都打開
ConnectionType.ALL_NETWORK_ON
 
# 設置 網絡
driver.set_network_connection(ConnectionType.AIRPLANE_MODE)

操作輸入法

# 返回Android上可用的輸入法
driver.available_ime_engines
 
# 返回當前輸入法的包名
driver.active_ime_engine
 
# 是否啟動了輸入法 True or False
driver.is_ime_active()
 
# 切換輸入法 參數接收available_ime_engines中任意一個輸入法包名
driver.activate_ime_engine(driver.available_ime_engines[0])
 
# 關閉當前輸入法
driver.deactivate_ime_engine() 

其他

# 鎖定手機多少秒 僅IOS
driver.lock()
 
# 搖手機
driver.shake()
 
# 打開通知欄 僅Android
driver.open_notifications()
 
# 獲取連接手機的當前時間
driver.device_time
 
# 開啟或關閉手機定位服務
driver.toggle_location_services()

移動端自動化測試-AppiumApi接口詳解