Appium是如何選擇、操做元素的呢?css
appium自動化 ------ 選擇界面 元素python
操做元素 ------- ① 點擊android
② 輸入字符web
③ 拖拽session
④ 獲取頁面元素的各類屬性app
根據appium獲取的數據進行分析和處理工具
如何查看界面元素呢?測試
用到工具 在Androidsdk目錄下 tools ->bin ->uiautomatorviewer.bat 雙擊打開ui
選擇APP頁面元素的三種方式:spa
選擇元素的代碼
與selenium基本相同
* find_element_by_xxx 符合條件的第一個元素,找不到拋出異常
* find_elements_by_xxx 符合條件的全部元素的列表,找不到返回空列表
* 經過webDriver 查找範圍是整個界面樹形結構
* 經過webelement 查找範圍是該節點的子節點
選擇元素的方法
① 根據ID ------ driver.find_element_id('xxxx')
② 根據class name -------- driver.find_element_by_class_name("android.widget.TextView")
class屬性決定了界面元素的類型
若是咱們要查找的是某種類型的界面元素,並且這種類型的界面元素在當前界面中只有一個
③ 根據accessibility id ------ driver.find_element_by_accessibility_id('unique name')
content-desc屬性是用來描述該元素的做用
若是要查詢的界面元素的content-desc屬性,在當前頁面中惟一就用它
不過,通常開發人員不喜歡填寫它。
④ 根據xpath
在appium中,咱們無法使用css,由於css是web專用的。appium支持xpath來定位元素。
舉例: driver.find_element_by_xpath('//ele/ele2[@attr="a1"]')
xpath = "//*[@resource-id='io.manong.developerdaily:id/tab_bar_container']//android.widget.TextView[3]"
xpath = "//*[@resource-id='io.manong.developerdaily:id/tab_bar_container']//android.widget.TextView[@text='發現']"
eles = driver.find_element_by_xpath(xpath)[2]
注意:在xpath中表示下標是從1開始的,而在python中表示下標是從0開始的。
每一個節點對應class屬性 相對不成熟,不少時候是正確的語法也不能找出元素來
定位元素時遇到過的坑: 常常報EOF錯誤,幾種解決辦法
- 關掉appium server ,而後再次打開uiautomatorviewer.bat
- 電腦上不能有手機助手,有的話都關掉
- 重啓手機,從新鏈接 adb devices
- 刪除測試包,從新下載,重啓uiautomatorviewer
Inspetor定位:
由於用UIAutomator viewer工具不能實時定位元素,能夠在appium server 界面上點擊放大鏡,填寫相應的name value,而後start session一下,
就能夠實現圖形與元素實時定位。固然Inspetor還能夠驗證xpath表達式。
經過Inspactor中的Attach to Session就能夠知道是什麼設備。
如何查看session id 能夠在代碼中加入 print(driver.session_id)
tap方法:與click方法相似,都是點擊界面。
區別是:tap方法是針對座標定位;而click方法是點擊方法。
tap方法適用場景:在選擇不到元素的狀況下,咱們就能夠經過座標來實現定位。
driver.find_element_by_class_name('...') # 等待界面出現
driver.tap([918,413], 4556) # 有兩個參數 元素位置和點擊持續時間(ms)
==若是是不一樣分辨率的手機,用座標定位就很不許確。能夠將不一樣分辨率的對應元素座標通通寫在配置文件裏,而後調用。
config.py文件裏這樣寫:
coordinates = {
'1080p':{
'首頁_+' : (548, 1839),
'登陸頁 _郵箱圖標' :(147, 1802),
'登陸頁_郵箱地址' :(264, 370),
'登陸頁_郵箱密碼' :(264, 570),
‘登陸頁_登陸按鈕’ :(264, 780)
},
'720p':{
'首頁_+' : (640, 1250),
.......
},
'2k':{
.......
}
}
cfg_phone_resolution = '1080p'
調用的時候,先導包 如 :from appium_code.configs import coordinates,cfg_phone_resolution
而後須要用到時,如:coordinate = coordinates['1080p']
driver.tap([coordinate['首頁_+']], 300)
.....