前言
與Web自動(dòng)化測(cè)試一樣足绅,app自動(dòng)化測(cè)試過(guò)程中最重要一個(gè)環(huán)節(jié)就是元素定位糠溜,只有準(zhǔn)確定位到了元素才能進(jìn)行相關(guān)元素的操作岭辣。appium繼承了selenium的定位方法鼻听,并在其基礎(chǔ)上進(jìn)行了擴(kuò)展财著,以適應(yīng)移動(dò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)
# 操作某一個(gè)控件
list[0].click() # 點(diǎn)擊第一個(gè)控件
list[-1].click() # 點(diǎn)擊最后一個(gè)控件
XPath 定位
xpath定位是一種路徑定位方式亿卤,主要是依賴于元素絕對(duì)路徑或者相關(guān)屬性來(lái)定位愤兵,但是絕對(duì)路徑xpath執(zhí)行效率比較低(特別是元素路徑比較深的時(shí)候),一般使用比較少排吴。通常使用xpath相對(duì)路徑和屬性定位秆乳。
xpath定位語(yǔ)法
xpath方法如下:
# 絕對(duì)定位
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
")
# 相對(duì)定位
driver.find_element_by_xpath('//android.widget.EditText[@text="請(qǐng)輸入用戶名"]')
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 定位有一點(diǎn)不一樣的是,selenium xpath是通過(guò)元素標(biāo)簽一層一層往下找钻哩,而appium xpath定位是通過(guò)class屬性來(lái)代替標(biāo)簽名屹堰。
層級(jí)定位
層級(jí)定位是先找到該元素的有對(duì)應(yīng)屬性的父元素節(jié)點(diǎn),然后基于父元素進(jìn)行元素定位街氢。
層級(jí)定位方法如下:
# 先定位它的父級(jí)
root_element=driver.find_element_by_id('com.tal.kaoyan:id/activity_register_parentlayout')
# 然后通過(guò)父級(jí)定位它的子級(jí)
root_element.find_element_by_class_name('android.widget.ImageView').click()
Accessibility id 定位
該方法屬于appium擴(kuò)展的定位方法扯键, 它的核心是找到控件的contentDescription屬性。
- 在Android中珊肃,content-desc屬性對(duì)應(yīng)AccessibilityId定位方式荣刑,如果這個(gè)屬性不為空則推薦使用馅笙。
- 在iOS中,label和name屬性都對(duì)應(yīng)AccessibilityId定位方式厉亏,如果有則推薦使用董习。
accessibility id定位方法如下:
driver.find_element_by_accessibility_id("天貓超市").click()
Android uiautomator 定位
該方法屬于appium的擴(kuò)展方法,并且只支持Android平臺(tái)叶堆。支持元素全部屬性定位.定位原理是通過(guò)android 自帶的android uiautomator的類庫(kù)去查找元素阱飘。 Appium元素定位方法其實(shí)也是基于Uiautomator來(lái)進(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("請(qǐng)輸入用戶名")')
# 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("小說(shuō)")'
driver.find_element_by_android_uiautomator(id_text).click()
# 滾動(dòng)到指定位置
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 點(diǎn)擊
- send_keys 輸入
- get_attribute 獲取某個(gè)屬性
- page_source 頁(yè)面所有元素