前言
上一篇介紹uiautomator的定位方式都是類似這種'new UiSelector().xxx("xxx")',看起非常長,我也記不住,這很不python。於是本篇優化了定位方法,去掉該死的'new UiSelector().'
組合定位
1.一般組合用id,class,text這三個屬性會比較好一點,其次description這個屬性也可以一起兩兩組合
2.id與text屬性組合
# 1.id+text
id_text = 'resourceId("com.baidu.yuedu:id/webbooktitle").text("小說")'
driver.find_element_by_android_uiautomator(id_text).click()
3.class與text屬性組合
sleep(2)
# 2.class+text
class_text = 'className("android.widget.TextView").text("圖書")'
driver.find_element_by_android_uiautomator(class_text).click()
4.其它更多組合,id,class也可以與其它的index,checkable,clickable,password等這些不常用的屬性組合,小編試了下不穩定,所以不推薦
父子定位childSelector
1.有時候不能直接定位某個元素,但是它的父元素很好定位,這時候就先定位父元素,通過父元素找兒子。
舉個例子:你很喜歡一個女生,但是沒她的直接聯系方式。你有她爸的聯系方式,於是你就可以通過先找她爸,再找到她。
# 父子關系childSelector
son = 'resourceId("com.baidu.yuedu:id/rl_tabs").childSelector(text("小說"))'
driver.find_element_by_android_uiautomator(son).click()
兄弟定位fromParent
1.有時候父元素不好定位,但是跟他相鄰的兄弟元素很好定位,這時候就可以通過兄弟元素,找到同一父級元素下的子元素。
舉個例子:你喜歡一個女生,但是沒她的直接聯系方式。你跟她哥哥關系是鐵哥們,於是你就可以通過她哥哥來找到她。
# 兄弟關系fromParent
brother = 'resourceId("com.baidu.yuedu:id/lefttitle").fromParent(text("圖書"))'
driver.find_element_by_android_uiautomator(brother).click()
更多高級技能
上一篇講到text定位有四種方式,那么id,class也是可以正則匹配。我試了下id和class的StartsWith和Contains會報錯,所以不推薦了。
1.text
- text("text文本")
- textContains("包含text文本")
- textStartsWith("以text文本開頭")
- textMatches("正則表達式")
2.className
- className("class屬性")
- classNameMatches("正則表達式")
# classNameMatches(".*xxx$")
classMatches = 'classNameMatches(".*TextView$").text("小說")'
driver.find_element_by_android_uiautomator(classMatches).click()
3.resourceId
- resourceId("id屬性")
- resourceIdMatches("正則表達式")
# resourceIdMatches(".*xxx$")
idmatches = 'resourceIdMatches(".*id/lefttitle$")'
driver.find_element_by_android_uiautomator(idmatches).click()
參考代碼
# coding:utf-8
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
desired_caps = {
'platformName': 'Android',
'deviceName': '127.0.0.1:62001',
'platformVersion': '4.4.2',
'appPackage': 'com.baidu.yuedu',
'appActivity': 'com.baidu.yuedu.splash.SplashActivity',
'noReset': 'true',
'resetKeyboard': 'true',
'unicodeKeyboard': 'true'
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 等主頁面activity出現
driver.wait_activity(".base.ui.MainActivity", 10)
# 1.id+text
id_text = 'resourceId("com.baidu.yuedu:id/webbooktitle").text("小說")'
driver.find_element_by_android_uiautomator(id_text).click()
sleep(2)
# 2.class+text
class_text = 'className("android.widget.TextView").text("圖書")'
driver.find_element_by_android_uiautomator(class_text).click()
sleep(2)
# 父子關系childSelector
son = 'resourceId("com.baidu.yuedu:id/rl_tabs").childSelector(text("小說"))'
driver.find_element_by_android_uiautomator(son).click()
sleep(2)
# 兄弟關系fromParent
brother = 'resourceId("com.baidu.yuedu:id/lefttitle").fromParent(text("圖書"))'
driver.find_element_by_android_uiautomator(brother).click()
sleep(2)
# resourceIdMatches(".*xxx$")
idMatches = 'resourceIdMatches(".*id/lefttitle$")'
driver.find_element_by_android_uiautomator(idMatches).click()
sleep(2)
# classNameMatches(".*xxx$")
classMatches = 'classNameMatches(".*TextView$").text("小說")'
driver.find_element_by_android_uiautomator(classMatches).click()
在學習過程中有遇到疑問的,可以appium+python QQ群交流:330467341