前面總結了7種定位方法,今天在介紹一種uiautomator方法,其實appium就是基於uiautomator框架實現的,讓我們一起看下uiautomator有哪些定位方法可以使用
uiautomator是什麼UIAutomator是android的自動化測試框架,也是Android-Sdk中一個查看頁面組件元素工具
uiautomator定位方法前面介紹了常規的定位方法,這裡uiautomator又提供了3種常用的定位方法,這次我們主要通過uiautomator方法進行介紹,定位的話依舊拿淘寶來做實戰
通過Text方法# text(「text文本」)
text = 'text("註冊/登錄")'
driver.find_element_by_android_uiautomator(text).click()
# 文本比較長,可以使用textContains模糊查詢定位 textContains('text文本')
text1 = 'textContains("請輸入手機號碼")'
driver.find_element_by_android_uiautomator(text1).send_keys("123456")
# textStartsWith("以text文本開頭")
text2 = 'textStartsWith("請輸入驗證碼")'
driver.find_element_by_android_uiautomator(text2).send_keys("12234")
運行結果:
由於用的是模擬器可能有點卡頓。抱歉哈
代碼結果:
from appium import webdriver
import time
desired_caps = {
'platformName': 'Android', # 測試版本
'deviceName': 'emulator-5554', # 設備名
'platformVersion': '5.1.1', # 系統版本
"appPackage": "com.taobao.taobao", # app包名
"appActivity": "com.taobao.tao.welcome.Welcome", # 啟動launch Activity
"noReset": True, # 不清空數據
"unicodeKeyboard": True, # 使用Unicode編碼方式發送字符串
"resetKeyboard": True, # 鍵盤隱藏起來
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
time.sleep(4)
text = 'text("註冊/登錄")'
driver.find_element_by_android_uiautomator(text).click()
time.sleep(5)
text1 = 'textContains("請輸入手機號碼")'
driver.find_element_by_android_uiautomator(text1).send_keys("123456")
time.sleep(5)
text2 = 'textStartsWith("請輸入驗證碼")'
driver.find_element_by_android_uiautomator(text2).send_keys("12234")
這個方法和appium定位方法一樣都是通過Class屬性進行定位
# 通過class定位登錄按鈕
className = 'className("android.widget.Button")'
driver.find_element_by_android_uiautomator(className).click()
通過uiautomator工具找到註冊/登錄按鈕的Class屬性
resourceld 和appium中的id一樣。
# 通過resourceId定位輸入框
id = 'resourceId("com.taobao.taobao:id/aliuser_login_mobile_et")'
driver.find_element_by_android_uiautomator(id).send_keys("123456")
同意的方法通過uiautomator找到搜索框的id
id和class定位執行結果:
代碼結果:
# coding:utf-8
from appium import webdriver
import time
desired_caps = {
'platformName': 'Android', # 測試版本
'deviceName': 'emulator-5554', # 設備名
'platformVersion': '5.1.1', # 系統版本
"appPackage": "com.taobao.taobao", # app包名
"appActivity": "com.taobao.tao.welcome.Welcome", # 啟動launch Activity
"noReset": True, # 不清空數據
"unicodeKeyboard": True, # 使用Unicode編碼方式發送字符串
"resetKeyboard": True, # 鍵盤隱藏起來
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
time.sleep(6)
# 通過class定位登錄按鈕
className = 'className("android.widget.Button")'
driver.find_element_by_android_uiautomator(className).click()
time.sleep(5)
# 通過resourceId定位輸入框
id = 'resourceId("com.taobao.taobao:id/aliuser_login_mobile_et")'
driver.find_element_by_android_uiautomator(id).send_keys("123456")
上面寫了一些單獨的定位方法,其實uiautomator還支持組合定位元素,意思就是支持id和text或者text和className等,這樣的定位更加準確,具體的繼續往下看吧
組合定位# 1、id和text方法組合
# 通過text+ClassName組合 (resourceId(屬性).text(屬性))
classText = 'className("android.widget.Button").text("註冊/登錄")'
driver.find_element_by_android_uiautomator(classText).click()
# 2、class和text方法組合
# 通過text+ID組合 (resourceId(屬性).text(屬性))
IdText = 'resourceId("com.taobao.taobao:id/aliuser_login_mobile_et").text("請輸入手機號碼")'
driver.find_element_by_android_uiautomator(IdText).send_keys("123456")
執行結果:
# coding:utf-8
from appium import webdriver
import time
desired_caps = {
'platformName': 'Android', # 測試版本
'deviceName': 'emulator-5554', # 設備名
'platformVersion': '5.1.1', # 系統版本
"appPackage": "com.taobao.taobao", # app包名
"appActivity": "com.taobao.tao.welcome.Welcome", # 啟動launch Activity
"noReset": True, # 不清空數據
"unicodeKeyboard": True, # 使用Unicode編碼方式發送字符串
"resetKeyboard": True, # 鍵盤隱藏起來
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
time.sleep(6)
classText = 'className("android.widget.Button").text("註冊/登錄")'
driver.find_element_by_android_uiautomator(classText).click()
time.sleep(5)
# 通過text+ID組合
IdText = 'resourceId("com.taobao.taobao:id/aliuser_login_mobile_et").text("請輸入手機號碼")'
driver.find_element_by_android_uiautomator(IdText).send_keys("123456")
定位的時候我們也可以通過父級找到子級定位
格式:
# 通過父子定位
(父親屬性).childSelector(定位屬性)
# 通過父子定位
fuzi = 'resourceId("com.taobao.taobao:id/home_searchbar").childSelector(className("android.widget.EditText"))'
driver.find_element_by_android_uiautomator(fuzi).click()
定位也可以通過兄弟之間的完成定位
格式:
# 通過兄弟定位
(兄弟屬性).fromParent(定位屬性)
# 通過兄弟元素定位
xiongdi = 'resourceId("com.taobao.taobao:id/photoBtn").fromParent(className("android.widget.EditText"))'
driver.find_element_by_android_uiautomator(xiongdi).send_keys(u"牛仔褲")
完成代碼:
# coding:utf-8
from appium import webdriver
import time
desired_caps = {
'platformName': 'Android', # 測試版本
'deviceName': 'emulator-5554', # 設備名
'platformVersion': '5.1.1', # 系統版本
"appPackage": "com.taobao.taobao", # app包名
"appActivity": "com.taobao.tao.welcome.Welcome", # 啟動launch Activity
"noReset": True, # 不清空數據
"unicodeKeyboard": True, # 使用Unicode編碼方式發送字符串
"resetKeyboard": True, # 鍵盤隱藏起來
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
time.sleep(6)
# 通過父子定位
fuzi = 'resourceId("com.taobao.taobao:id/home_searchbar").childSelector(className("android.widget.EditText"))'
driver.find_element_by_android_uiautomator(fuzi).click()
time.sleep(6)
# 通過兄弟定位
xiongdi = 'resourceId("com.taobao.taobao:id/photoBtn").fromParent(className("android.widget.EditText"))'
driver.find_element_by_android_uiautomator(xiongdi).send_keys(u"牛仔褲")
結果:
這個地方沒有設置appium的鍵盤所有導致的是亂碼的。
元素定位方面方法非常的多,喜歡那種我們用哪種,哪種簡單我們就用那種