前言
與Web自動化測試一樣,app自動化測試過程中最重要一個環(huán)節(jié)就是元素定位,只有準(zhǔn)確定位到了元素才能進(jìn)行相關(guān)元素的操作。appium繼承了selenium的定位方法,并在其基礎(chǔ)上進(jìn)行了擴(kuò)展,以適應(yīng)移動端控件的定位。
id 定位
id定位是使用控件的resource-id進(jìn)行定位的,如下圖所示:

resourec-id定位方法如下:
driver.find_element_by_id("com.xueqiu.android:id/button_icon")
Class Name 定位
Class Name 定位是使用控件的class屬性進(jìn)行定位的,如下圖所示:

class 定位方法如下:
driver.find_element_by_class_name("android.widget.ImageView")
由于class屬性的重復(fù)性很高,不一定能準(zhǔn)確的定位到想要的控件,我們可以先定位一組控件,再進(jìn)一步篩選。
# 先定位一組控件
list = driver.find_elements_by_class_name("android.widget.ImageView")
# 循環(huán)遍歷所有控件
for i in list:
print(i)
# 操作某一個控件
list[0].click() # 點擊第一個控件
list[-1].click() # 點擊最后一個控件
XPath 定位
xpath定位是一種路徑定位方式,主要是依賴于元素絕對路徑或者相關(guān)屬性來定位,但是絕對路徑xpath執(zhí)行效率比較低(特別是元素路徑比較深的時候),一般使用比較少。通常使用xpath相對路徑和屬性定位。
xpath定位語法

xpath方法如下:
# 絕對定位
driver.find_element_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.wid\
get.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/androi\
d.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.view.ViewGroup/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.Relati\
veLayout[1]/android.widget.FrameLayout/android.widget.ImageView
")
# 相對定位
driver.find_element_by_xpath('//android.widget.EditText[@text="請輸入用戶名"]')
driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="3"]')
# contains函數(shù)定位(支持模糊匹配)
driver.find_element_by_xpath(//*[contains(@resource-id, 'user_profile_icon') and contains(@class, 'Image')])
# 屬性組合定位
//*[@text='基金' and contains(@resource-id, 'button')]
//*[@text='基金' and @index='1']
# list定位
(//*[@text='基金'])[1]
# 父子關(guān)系定位
//[contains(@resource-id, 'buttons_container')]//[@text='基金']
appium xpath定位與selenium xpath 定位有一點不一樣的是,selenium xpath是通過元素標(biāo)簽一層一層往下找,而appium xpath定位是通過class屬性來代替標(biāo)簽名。
層級定位
層級定位是先找到該元素的有對應(yīng)屬性的父元素節(jié)點,然后基于父元素進(jìn)行元素定位。
層級定位方法如下:
# 先定位它的父級
root_element=driver.find_element_by_id('com.tal.kaoyan:id/activity_register_parentlayout')
# 然后通過父級定位它的子級
root_element.find_element_by_class_name('android.widget.ImageView').click()
Accessibility id 定位
該方法屬于appium擴(kuò)展的定位方法, 它的核心是找到控件的contentDescription屬性。
- 在Android中,content-desc屬性對應(yīng)AccessibilityId定位方式,如果這個屬性不為空則推薦使用。
- 在iOS中,label和name屬性都對應(yīng)AccessibilityId定位方式,如果有則推薦使用。
accessibility id定位方法如下:
driver.find_element_by_accessibility_id("天貓超市").click()
Android uiautomator 定位
該方法屬于appium的擴(kuò)展方法,并且只支持Android平臺。支持元素全部屬性定位.定位原理是通過android 自帶的android uiautomator的類庫去查找元素。 Appium元素定位方法其實也是基于Uiautomator來進(jìn)行封裝的。
Android uiautomator 定位方法如下:
# id 定位
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.tal.kaoyan:id/login_email_edittext")')
# text定位
driver.find_element_by_android_uiautomator('new UiSelector().text("請輸入用戶名")')
# class name定位
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')
#組合定位id+text
id_text = 'new UiSelector().resourceId("com.baidu.yuedu:id/webbooktitle").text("小說")'
driver.find_element_by_android_uiautomator(id_text).click()
# 滾動到指定位置
self.driver.find_element_by_android_uiautomator('new UiScrollable('
'new UiSelector().scrollable(true).instance(0))'
'.scrollIntoView('
'new UiSelector().text("Views").instance(0));').click()
常用api
- click 點擊
- send_keys 輸入
- get_attribute 獲取某個屬性
- page_source 頁面所有元素