appium+python自動化32-android_uiautomator定位進階版


前言

上一篇介紹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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM