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