appium下android_uiautomator定位

前言

appium就是封裝android的uiautomator這個框架來的,因此uiautomator的一些定位方法也能夠用android

text

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()

resourceId

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()

className

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() 

description

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等這些不經常使用的屬性組合,小編試了下不穩定,因此不推薦

父子定位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()
相關文章
相關標籤/搜索