1. 程式人生 > 實用技巧 >Appium之常用API

Appium之常用API

Appium常用API解析

1、current_activity:獲取當前頁面的activity名,比如com.taobao.tao.TBMainActivity 或 com.taobao.browser.BrowserActivity

如判斷當前頁面是否為收藏夾:

if driver.current_activity == "com.taobao.weex.WXActivity":
    pass

2、page_source:返回頁面的樹形結構原始碼

如通過斷言判斷是否進入某個頁面(該頁面包含特定內容資訊)

content = driver.page_source
try:
    
assert "我的淘寶" in content except Exception as e: raise e

3、contexts:返回當前會話的上下文(可以用來識別native和H5混合頁面)

如在native和html5混合頁面測試時,需要在native層和html5層切換,則首先需要得到context層的名稱:

print(driver.contexts)

結果輸出:
['NATIVE_APP', 'WEBVIEW_com.codoon.gps']

然後使用driver.switch_to.context("NATIVE_APP"),就可以切換到native層了

4、find_element_by_xxx:查詢當前頁面的一個元素

ele = driver.find_element_by_name("foo")

還可以使用如下:
ele = driver.find_element(by="name", value="foo")

5、find_elements_by_xxx:查詢當前頁面的多個元素

eles = driver.find_elements_by_name("foo")

還可以使用如下:
eles = driver.find_elements(by="name", value="foo")

6、click():點選(在移動端的時候,會有200~300ms的延遲)

driver.find_element(by="
xpath", value="//slhsjh").click()

7、tap():在特定位置上輕擊,並保持一定的時間(可以減少click在移動端的延遲,提高了效能)

函式原型:tap(positions: List[Tuple[int, int]], duration: Optional[int] = None)

driver.tap([(100, 20), (100, 60), (100, 100)], 500)

click和tap都能實現單擊的效果。其區別在於click是作用於driverelement的例項化物件,而tap是對螢幕上的座標位置進行點選。前者對元素的位置變化並不敏感,而後者是針對具體的畫素座標點選,受解析度和元素位置影響較大。

8、send_keys():呼叫裝置的系統輸入法鍵盤,輸入文字內容

driver.find_element(by="xpath", value="//slhsjh").send_keys("Test")

9、swipe()、flick():滑動,從[start_x, start_y]劃到[end_x, end_y]的過程。

區別:swipe比flick多了一個duration引數,有了這個引數就可以自定義從start到end動作的作用時間duration(單位為ms),以達到快速滑動或者慢速滑動的效果。

函式原型:

swipe(start_x: int, start_y: int, end_x: int, end_y: int, duration: int = 0)
flick(start_x: int, start_y: int, end_x: int, end_y: int)

driver.swipe(100, 100, 100, 400, 500)
driver.flick(100, 100, 100, 400)

TouchAction類

TouchAction是APPium中封裝的一個方法,主要是都手勢控制的一些操作:點選、短按、長按、移動操作。

匯入模組:from appium.webdriver.common.touch_action import TouchAction

TouchAction(driver):獲取的是TouchAction物件

TouchAction物件的操作方法

release()和perform()方法一般跟新增的動作後面。

(1)release():通過將指標離開螢幕(釋放指標)來結束動作

(2)perform():通過向伺服器傳送命令來執行動作

from appium.webdriver.common.touch_action import TouchAction

方法1:tap(element=None, x=None, y=None, count=1) ''' 模擬手勢觸控元素或座標點。 (1)element:要點選的元素 (2)x/y:移動到的螢幕座標點,預設為空 ''' 方法2:press(el=None, x=None, y=None, pressure=None) ''' 模擬手勢短按元素或座標。 (1)el:要點選的元素 (2)x/y:移動到的螢幕座標點,預設為空 (3)pressure:壓力; [iOS只]按作為強制觸控 ''' 方法3:long_press(el=None, x=None, y=None, duration=1000) ''' 模擬手勢長按元素或座標點,持續duration時間。 (1)el:要點選的元素 (2)x/y:移動到的螢幕座標點,預設為空 (3)duration:持續按壓時間,單位為ms ''' 方法4:wait(ms=0) """ 模擬動作後的等待的時間。 """ 方法5:move_to(el=None, x=None, y=None) ''' 模擬從一個點移動到指定元素或指定點。 (1)el: 移動到的元素,預設為空 (2)x/y:移動到的螢幕座標點,預設為空 ''' 方法6:release() ''' 通過將指標離開螢幕(釋放指標)來結束動作。 ''' 方法7:perform() ''' 通過向伺服器傳送命令來執行動作。 ''' 例如: from appium import webdriver from appium.webdriver.common.touch_action import TouchAction ele = driver.find_element_by_xpath("//test") TouchAction(driver).tap(element=ele).release().perform() TouchAction(driver).tap(x=920, y=950).release().perform() TouchAction(driver).press(el=ele).release().perform() TouchAction(driver).long_press(el=ele).perform() TouchAction(driver).wait(100) TouchAction(driver).move_to(el=ele).release().perform()

MultiTouch類

MultiTouch類主要用於多點觸控操作,可用於對介面執行放大、縮小操作。

匯入模組:from appium.webdriver.common.multi_action import MultiAction

MultiAction(driver, element=None):獲取的是MultiAction物件
driver:操作的裝置
element:操作的元素,預設為None

1. MultiAction物件的操作方法

1.1、新增TouchAction物件到MultiAction物件

(1)add(*touch_actions)

touch_actions:1個或多個TouchAction物件(描述一個手指要執行的一系列動作)

1.2、執行儲存在物件中的所有動作

(1)perform()

當perform執行被呼叫時,新增到多點觸控的所有觸控動作都被髮送到appium,並執行,就像它們同時發生一樣。appium首先執行所有觸控動作的第一個事件,然後執行第二個......。

# 初始化MultiAction物件
MultiActionObject = MultiAction(driver)
# 向MultiAction物件中新增動作
touchAction1 = TouchAction(driver).press(x=100, y=200)
touchAction2 = TouchAction(driver).press(x=100, y=300)
MultiActionObject.add(touchAction1, touchAction2)
# 執行操作
MultiActionObject.perform()

元素事件類API

(1)reset():重置應用(類似刪除應用資料) 如通過driver.reset()來模擬實現首次登入app時出現的引導頁需求:
driver.reset()

(2)is_app_installed():檢查裝置上是否已安裝app,引數為package_name(appPackage)。返回True表示已安裝,False表示未安裝。

如判斷是否已安裝淘寶app:

if driver.is_app_installed("com.taobao.taobao"):
    '''引數為package_name(appPackage)'''
    pass
else:
    pass

(3)install_app():安裝特定路徑的app;引數為app的本地或遠端路徑。 如若檢測到未安裝淘寶app,則安裝該app:
if driver.is_app_installed("com.taobao.taobao"):
    '''引數為package_name(appPackage)'''
    pass
else:
    driver.install_app(r"E:\AndroidTest\base.apk")

(4)remove_app():在裝置上移除特定的app,引數為package_name(appPackage)。 如測試舊版本相容用例時,需要先解除安裝新版本,再安裝舊版本:
driver.remove_app("com.taobao.taobao_new")
driver.install_app("com.taobao.taobao_old")

(5)launch_app():在裝置上啟動desired capabilities中指定的app。
driver.launch_app()

(6)close_app():在裝置上停止執行desired capabilities中指定的app。
driver.close_app()

(7)start_activity():在測試任務期間啟動新的app活動,引數為appPackage和appActivity。

driver.start_activity('com.tencent.mobileqq','com.tencent.mobileqq.activity.SplashActivity')
print(driver.current_activity)

(8)wait_activity():隱式等待某個activity出現,引數分別為目標activity、超時時間、檢測間隔(單位均為s)。

(類似於webdriver的WebDriverWait,且是Android特有的方法)

如在後續操作需要在當前activity為主頁的前提下:
driver.wait_activity("homepage.activity", 15, 1)
pass

其它API (1)get_screenshot_as_file():截圖並儲存在特定路徑,引數為圖片路徑和圖片名稱。
driver.get_screenshot_as_file('/Screenshots/foo.png')

(2)get_attribute():獲取已知元素控制元件的屬性值,引數為控制元件。
driver.find_element_by_xpath("//test").get_property("checkable")

driver.find_element_by_xpath("//test").get_property("text")

(3)background_app():將 app 置於後臺,把當前應用放到後臺去,引數為後臺執行的時間,單位為s。

driver.background_app(5)

(4)pull_file():從裝置中提取檔案。
driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')

如在手機號註冊時需要獲取手機驗證碼,此時的實現方式是用另一個apk提取到驗證碼存在手機記憶體中,再用pull_file獲取到驗證碼內容,使得appium可以將正確的驗證碼填入。

(5)push_file():推送檔案到裝置中去

driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')```

(6)keyevent()、press_keycode():按鍵事件,向裝置傳送按鍵編碼,引數為按鍵編碼。(Android特有的方法)
driver.keyevent(66)         # 回車鍵
driver.press_keycode(3)     # Home鍵

(7)hide_keyboard():收起鍵盤

driver.hide_keyboard()

(8)open_notifications():開啟通知欄(僅Android特有)

driver.open_notifications()

(9)shake():模擬裝置搖晃

driver.shake()

參考:https://www.jianshu.com/p/0e852c58609f

參考:https://www.cnblogs.com/7chentest/p/6396551.html