appium就是封裝android的uiautomator這個框架來的,因此uiautomator的一些定位方法也能夠用android
1.經過text文本定位語法web
new UiSelector().text("text文本")正則表達式
2.文本比較長的時候,能夠用textContains模糊匹配,只要文本包含匹配內容就能夠了。app
new UiSelector().textContains("包含text文本")框架
3.textStartsWith是以某個文本開頭的匹配ui
new UiSelector().textStartsWith("以text文本開頭")spa
4.正則匹配textMatches,這個須要配合正則表達式,就不舉例了。scala
new UiSelector().textMatches("正則表達式")3d
# coding:utf-8 from appium import webdriver 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.text loc_text = 'new UiSelector().text("圖書")' driver.find_element_by_android_uiautomator(loc_text).click() # # 2.textContains # loc_textContains = 'new UiSelector().textContains("圖")' # driver.find_element_by_android_uiautomator(loc_textContains).click() # # 3.textStartsWith # loc_textStart = 'new UiSelector().textStartsWith("圖")' # driver.find_element_by_android_uiautomator(loc_textStart).click()
1.resourceId根by_id同樣code
new UiSelector().resourceId("id")
# resourceId定位 loc_id = 'new UiSelector().resourceId("com.baidu.yuedu:id/webbooktitle")' driver.find_element_by_android_uiautomator(loc_id).click()
1.頁面上的class屬性通常不惟一,多半用在複數定位時候。好比經過class屬性定位'排行'這個按鈕下標就是2。
new UiSelector().className("className")
# className複數定位 loc_class = 'new UiSelector().className("android.widget.TextView")' driver.find_elements_by_android_uiautomator(loc_class)[2].click()
1.因爲這個app的contenet-des屬性都是空的,就不用代碼演示了,跟上面方法同樣。
new UiSelector().description("contenet-des屬性")
# coding:utf-8 from appium import webdriver 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.text loc_text = 'new UiSelector().text("圖書")' driver.find_element_by_android_uiautomator(loc_text).click() # # 2.textContains # loc_textContains = 'new UiSelector().textContains("圖")' # driver.find_element_by_android_uiautomator(loc_textContains).click() # # 3.textStartsWith # loc_textStart = 'new UiSelector().textStartsWith("圖")' # driver.find_element_by_android_uiautomator(loc_textStart).click() sleep(2) # resourceId定位'小說' loc_id = 'new UiSelector().resourceId("com.baidu.yuedu:id/webbooktitle")' driver.find_element_by_android_uiautomator(loc_id).click() sleep(2) # className複數定位 loc_class = 'new UiSelector().className("android.widget.TextView")' driver.find_elements_by_android_uiautomator(loc_class)[2].click()
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等這些不經常使用的屬性組合,小編試了下不穩定,因此不推薦
1.有時候不能直接定位某個元素,可是它的父元素很好定位,這時候就先定位父元素,經過父元素找兒子。
舉個例子:你很喜歡一個女生,可是沒她的直接聯繫方式。你有她爸的聯繫方式,因而你就能夠經過先找她爸,再找到她。
# 父子關係childSelector son = 'resourceId("com.baidu.yuedu:id/rl_tabs").childSelector(text("小說"))' driver.find_element_by_android_uiautomator(son).click()
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
2.className
# classNameMatches(".*xxx$") classMatches = 'classNameMatches(".*TextView$").text("小說")' driver.find_element_by_android_uiautomator(classMatches).click()
3.resourceId
# 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()