Appium學習17:元素定位

元素定位

與Web自動化測試一樣,app自動化測試過程中最重要一個環節就是元素定位,只有準確定位到了元素才能進行相關元素的操作,如輸入、點擊、拖拽、滑動等。appium提供了許多元素定位的方法,如id定位、name定位、class定位、層級定位等等.... 接下來將會給大家來實踐運用這些定位技巧。

元素定位方式

  • id
  • name
  • class
  • List定位
  • 相對定位
  • Xpath定位
  • H5頁面元素定位
  • Uiautomator定位

id定位

日常生活中身邊可能存在相同名字的人,但是每個人的身份證號碼是唯一的,在app界面元素中也可以使用id值來區分不同的元素,然後進行定位操作。Appium中可以使用 find_element_by_id() 方法來進行id定位。

測試場景

  1. 安裝考研幫kaoyan3.1.0.apk
  2. 點擊升級頁面取消按鈕
  3. 點擊引導頁面的跳過按鈕

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章