Appium是如何選擇、操作元素的呢?
appium自動化 ------ 選擇界面 元素
操作元素 ------- ① 點擊
② 輸入字符
③ 拖拽
④ 獲取頁面元素的各種屬性
根據appium獲取的數據進行分析和處理
如何查看界面元素呢?
用到工具 在Androidsdk目錄下 tools ->bin ->uiautomatorviewer.bat 雙擊打開
選擇APP頁面元素的三種方式:
選擇元素的代碼
與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)
.....
