元素定位
與Web自動化測試一樣,app自動化測試過程中最重要一個環節就是元素定位,只有準確定位到了元素才能進行相關元素的操作,如輸入、點擊、拖拽、滑動等。appium提供了許多元素定位的方法,如id定位、name定位、class定位、層級定位等等.... 接下來將會給大家來實踐運用這些定位技巧。
元素定位方式
- id
- name
- class
- List定位
- 相對定位
- Xpath定位
- H5頁面元素定位
- Uiautomator定位
id定位
日常生活中身邊可能存在相同名字的人,但是每個人的身份證號碼是唯一的,在app界面元素中也可以使用id值來區分不同的元素,然後進行定位操作。Appium中可以使用 find_element_by_id() 方法來進行id定位。
測試場景
- 安裝考研幫kaoyan3.1.0.apk
- 點擊升級頁面取消按鈕
- 點擊引導頁面的跳過按鈕
kyb_cancel_skip.py
from appium import webdriver
desired_caps = {
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:21503",
"app": r"D:\python\App自動化appium(python語言版)\Appium python2018最新資料\appium教程相關軟件\第四章軟件\App\kaoyan3.1.0.apk",
"appPackage": "com.tal.kaoyan",
"appActivity": "com.tal.kaoyan.ui.activity.SplashActivity"
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.implicitly_wait(5)
driver.find_element_by_id('android:id/button2').click()
driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
name定位
根據name進行定位,對於android來說,就是text屬性
用法
from find_element.capability import *
driver.find_element_by_name('請輸入用戶名').send_keys('自學網2017')
driver.find_element_by_name('登錄').click()
說明:由於text穩定性不是很好,所以appium 1.5開始廢棄了該方法。
classname定位
classname定位是根據元素類型來進行定位,但是實際情況中很多元素的classname都是相同的,
如上例中登錄頁面中的用戶名和密碼都是clasName屬性值都是:“android.widget.EditText” 因此只能定位第一個元素也就是用戶名,而密碼輸入框就需要使用其他方式來定位,這樣其實很雞肋.一般情況下如果有id就不必使用classname定位。
by_classname.py
from find_element.capability import driver
driver.find_element_by_class_name('android.widget.EditText').send_keys('自學網2018')
driver.find_element_by_class_name('android.widget.EditText').send_keys('zxw2018')
driver.find_element_by_class_name('android.widget.Button').click()
相對定位
相對定位是先找到該元素的有對應屬性的父元素節點,然後基於父元素進行元素定位。
測試案例
不使用id元素定位方式,在新用戶註冊界面點擊添加頭像按鈕。
代碼實現
by_relative.py
from find_element.capability import driver
driver.find_element_by_id('com.tal.kaoyan:id/login_register_text').click()
root_element=driver.find_element_by_id('com.tal.kaoyan:id/activity_register_parentlayout') #父節點
root_element.find_element_by_class_name('android.widget.ImageView').click()
xpath定位
xpath定位是一種路徑定位方式,主要是依賴於元素絕對路徑或者相關屬性來定位,但是絕對路徑xpath執行效率比較低(特別是元素路徑比較深的時候),一般使用比較少。通常使用xpath相對路徑和屬性定位。
1.xpath路徑表達式
表達式 |
描述 |
/ |
從根節點選取。 |
// |
從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。 |
nodename |
選取此節點的所有子節點。 |
. |
選取當前節點。 |
.. |
選取當前節點的父節點。 |
@ |
選取屬性。 |
通配符 |
描述 |
* |
匹配任何元素節點。 |
@* |
匹配任何屬性節點。 |
node() |
匹配任何類型的節點。 |
實踐案例
使用xpath定位元素來進行登錄操作。
by_xpath.py
from find_element.capability import driver
driver.find_element_by_xpath('//android.widget.EditText[@text="請輸入用戶名"]').send_keys('zxw1234')
driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="3"]').send_keys('zxw123456')
driver.find_element_by_xpath('//android.widget.Button').click()
# driver.find_element_by_xpath('//*[@class="android.widget.Button"]').click()
擴展資料:xpath語法
List定位
前面我們提到相同的classname屬性值元素無法區分定位,那麼在本節課將使用List定位來解決這個問題。List定位首先是使用find_elements_by_XX獲取一組相同的class屬性的元素,然後使用數組下標來區分標記不同元素進行相關操作。
測試案例1
在新用戶註冊界面點擊添加頭像按鈕後,選擇指定的圖片保存作爲頭像。
by_list.py
from find_element.capability import driver
driver.find_element_by_id('com.tal.kaoyan:id/login_register_text').click()
driver.find_element_by_id('com.tal.kaoyan:id/activity_register_userheader').click()
images=driver.find_elements_by_id('com.tal.kaoyan:id/item_image')
images[10].click()
driver.find_element_by_id('com.tal.kaoyan:id/save').click()