之前有一段時(shí)間學(xué)習(xí)過appium框架,這次趁機(jī)借著已報(bào)名參加的線上課程,重新認(rèn)識(shí)了一遍appium框架,總能從中收獲一點(diǎn)意外的小驚喜
我們都知道,appium的核心其實(shí)就是一個(gè)web服務(wù)器,它提供了一套R(shí)EST的接口。它收到客戶端的連接、監(jiān)控命令,之后在移動(dòng)設(shè)備上執(zhí)行這些命令,最后把執(zhí)行結(jié)果放在HTTP響應(yīng)中返回給客戶端。基于上述原理,appium框架提供了一系列的API供調(diào)用,可用python3 -m pydoc -b命令在本地打開API文檔
? ?appium API 整體大致可歸納為:

整體大致情況
- 控件定位
- find_element_by_id(self, id_)
通過元素的id定位,返回含有該屬性的元素,在android上 app上即resource id - find_elements_by_id(self, id_)
通過元素的id定位,返回含有該屬性的所有元素
用法
driver. find_element_by_id(“id”)
driver. find_elements_by_id(“id”)
其中一個(gè)區(qū)別需要注意:
找不到元素時(shí),find_element_*會(huì)拋出異常,而find_elements_*不會(huì),以下其他定位方式同理
- find_element_by_name(self, name)
通過元素Name定位,返回含有該屬性的元素,對(duì)于android,即text屬性 - find_elements_by_name(self, name)
通過元素Name定位(元素的名稱屬性text),含有該屬性的所有元素
用法
driver. find_element_by_name(“name”)
driver. find_elements_by_name(“name”)
- find_element_by_xpath(self, xpath)
通過Xpath定位,返回含有該屬性的元素 - find_elements_by_xpath(self, xpath)
通過Xpath定位,返回含有該屬性的所有元素
用法
driver. find_element_by_name(“Xpath”)
driver. find_elements_by_name(“Xpath”)
- find_element_by_class_name(self,class_name)
通過元素class name屬性定位,返回包含該屬性的元素 - find_elements_by_class_name(self,class_name)
通過元素class name屬性定位,返回包含該屬性的所有元素
用法
driver. find_element_by_class_name(“android.widget.LinearLayout”)
driver. find_elements_by_class_name(“android.widget.LinearLayout”)
- find_element_by_accessibility_id(self,accessibility_id)
- find_elements_by_accessibility_id(self,accessibility_id)
通過accessibility id定位,在android app上相當(dāng)于content-description字段,而在ios app 上accessibility identifier字段
用法
driver.find_element_by_accessibility_id()
該字段存在的意義主要是為了一些有殘障的人士準(zhǔn)備的,方便他們使用程序
- find_element_by_android_uiautomator(self,uiautomator)
根據(jù)UIautomator定位元素,僅android - find_elements_by_android_uiautomator(self,uiautomator)
用法
driver.find_element_by_android_uiautomator('.elements()[1].cells()[2]')
driver.find_element_by_android_uiautomator('**new UiSelector()**.text("Custom View")').click() #根據(jù)text屬性定位,并點(diǎn)擊
text屬性的方法
driver.find_element_by_android_uiautomator('new UiSelector().textContains("View")').click() #textContains
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("Custom")').click() #textStartsWith
driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^Custom.*")').click() #textMatches
- find_element_by_ios_uiautomation(self,uia_string)
- find_elements_by_ios_uiautomation(self,uia_string)
在iOS中通過uiautomation找到一個(gè)元素
用法
driver.find_element_by_ios_uiautomation('.elements()[1] .cells()[2]')
- 動(dòng)作操作
- click(self) 點(diǎn)擊
用法
element.click()
- send_keys(self, *value)
在元素中模擬輸入(開啟appium自帶的輸入法并配置了appium輸入法后,即unicodeKeyboard、resetKeyboard,可以輸入中英文)
用法
element.send_keys(“測試”)
- clear(self) 清除輸入的內(nèi)容
用法
element.clear()
- swipe(self, start_x, start_y, end_x, end_y, duration=None) 滑動(dòng)
主要用于緩慢滑動(dòng),從(start_x, start_y)點(diǎn)滑動(dòng)到(end_x, end_y)點(diǎn),可以自定義duration【毫秒】滑動(dòng)時(shí)間
用法
driver.swipe(100,100,100,400)
- flick(self, start_x, start_y, end_x, end_y) 快速滑動(dòng)
主要用于快速滑動(dòng),無duration,如View切換,按?。╯tart_x, start_y)點(diǎn)后快速滑動(dòng)至(end_x, end_y)點(diǎn)
用法
driver.flick(100,100,100,400)
- shake(self) 搖一搖 (待嘗試使用)
用法
driver.shake()
- lock(self, seconds) 鎖屏,ios僅有 (待嘗試使用)
鎖屏一段時(shí)間 , iOS專有
用法
driver.lock()
- scroll(self, origin_el, destination_el) 滾動(dòng)
從元素origin_el滾動(dòng)至元素destination_el,只有iOS可以使用
用法
driver.scroll(el1,el2)
- drag_and_drop(self, origin_el, destination_el) 拖放
將元素origin_el拖到目標(biāo)元素destination_el
用法
driver.drag_and_drop(el1,el2)
- zoom(self, element=None, percent=200, steps=50) 放大
在元素上執(zhí)行放大
用法
driver.zoom(element)#默認(rèn)分成50步完成,放大量為200%
- pinch(self, element=None, percent=200, steps=50) 縮小
在元素上執(zhí)行縮小
用法
driver. pinch (element)
- tap(self, positions, duration=None) 點(diǎn)擊
模擬手指點(diǎn)擊(最多五個(gè)手指),可設(shè)置按住時(shí)間長度(單位毫秒),positions參數(shù)為單位為元組的列表,如[(x1,y1),(x2,y2)]
用法
driver.tap([(300,500)],10)
- keyevent(self, keycode, metastate=None) 發(fā)送按鍵碼
發(fā)送按鍵碼(安卓僅有),常見的有:- KEYCODE_HOME (按鍵Home) : 3
- KEYCODE_MENU (菜單鍵) : 82
- KEYCODE_BACK (返回鍵) : 4`
用法
driver.keyevent(4) #返回
-
獲取設(shè)備及控件相關(guān)信息
- get_window_size (self, windowHandle='current')
獲取當(dāng)前設(shè)備的寬、高
- get_window_size (self, windowHandle='current')
用法
width=driver.get_window_size()['width']
height=driver.get_window_size()['height']
- location
獲取元素的左上角坐標(biāo)
用法
x=element.location['x']
y=element.location['y']
- size
獲取元素的寬、高
用法
width=element.size['width']
height=element.size['height']
- current_activity
獲取設(shè)備當(dāng)前的activity值
用法
driver.current_activity
- context (平時(shí)暫時(shí)沒用到,待研究)
獲取當(dāng)前會(huì)話的當(dāng)前上下文
用法
driver.context
- app_strings(self, language=None, string_file=None)
對(duì)于Android,獲取app的strings.xml文件內(nèi)容,ios待試
driver.app_strings()
- 其他操作
- wait_activity(self, activity, timeout, interval=1) 等待指定activity的出現(xiàn)
等待指定activity的出現(xiàn),返回true or false,默認(rèn)是輪詢間隔是1s,需要值得注意的是這里的參數(shù)是current_activity打印出來的值,即不包含包名
用法
driver.wait_activity(activity,timeout,interval)
- quit(self) 退出
退出腳本運(yùn)行,并關(guān)閉每個(gè)相關(guān)的窗口連接
用法
driver.quit()
- background_app(self, seconds) 后臺(tái)運(yùn)行
把a(bǔ)pp放置于后臺(tái)運(yùn)行,設(shè)置時(shí)間seconds,單位s,相當(dāng)于一段時(shí)間后重啟app,而不是home將app放置后臺(tái)
用法
driver.background_app(3)
- save_screenshot(self, filename) 截圖
截圖,filename參數(shù)為路徑,包含文件名稱
用法
driver.save_screenshot('/Screenshots/foo.png')
結(jié)語
? ?以上各種方法僅代表個(gè)人在日常測試中經(jīng)常使用或者嘗試去用的方法,實(shí)際上,appium 提供的API還有很多,以后遇到再繼續(xù)說。另外,在編寫自動(dòng)化腳本的時(shí)候通常會(huì)對(duì)原始的方法進(jìn)行一定程度的封裝