appium--元素定位


前戲

appium的元素定位方式有:id、name、class、相對定位、Xpath定位、List定位、Uiautomator定位

 

send_keys()傳入中文時需要在capability中配置如下內容

desired_caps['unicodeKeyboard']='True'

desired_caps['resetKeyboard']='True'

如果不加這兩行,有中文的時候就輸入不了

有時候加了這兩行,輸入中文時會出現亂碼,是因為輸入法的原因

使用appium做了輸入操作之后,如果出現輸入法無法喚起,可以在系統設置---語言和輸入法---將當前的輸入法替換為系統輸入法或者其他輸入法

id定位

id定位是我們最常用的定位方式,通過find_element_by_id()來定位,打開Uiautomator,resource-id的值就是id

 代碼實戰

import pytest
from appium import webdriver


class Testcsca():
    def setup(self):
        caps = {}
        caps["platformName"] = "Android"
        # caps["deviceName"] = "127.0.0.1:62001"
        caps["deviceName"] = "CLB0219314000452"
        caps["appPackage"] = "com.jgw.csca"
        caps["appActivity"] = "com.jgw.csca.view.activity.LoginActivity"
        caps["platfromVersion"] = "9.0.0"
        caps["autoGrantPermissions"] = True  # 設置自動授權權限
        caps['unicodeKeyboard'] = True  # 輸入中文時要加,要不然輸入不了中文
        caps['resetKeyboard'] = True  # 輸入中文時要加,要不然輸入不了中文

        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(20)

    def test_login(self):
        self.driver.find_element_by_id('com.jgw.csca:id/et_name').send_keys('zouzou')
        self.driver.find_element_by_id('com.jgw.csca:id/et_pwd').send_keys('666')

 

name定位

name定位

根據name進行定位,對於android來說,就是text屬性

driver.find_element_by_name('登錄').click()

self.driver.find_element_by_name('登錄').click()  # 這樣會報錯

由於text穩定性不是很好,所以appium1.5開始廢棄了該方法,雖然這種方法不可用,但我們可以通過xpath來定位

self.driver.find_element_by_xpath("//*[contains(@text,'登錄')]").click()  # 這樣就可以正常點擊了

class定位

classname定位是根據元素類型來進行定位,但是實際情況中很多元素的classname都是相同的,有多個只能定位到第一個輸入框

import pytest
from appium import webdriver


class Testcsca():
    def setup(self):
        caps = {}
        caps["platformName"] = "Android"
        # caps["deviceName"] = "127.0.0.1:62001"
        caps["deviceName"] = "CLB0219314000452"
        caps["appPackage"] = "com.jgw.csca"
        caps["appActivity"] = "com.jgw.csca.view.activity.LoginActivity"
        caps["platfromVersion"] = "9.0.0"
        caps["autoGrantPermissions"] = True  # 設置自動授權權限
        caps['unicodeKeyboard'] = True  # 輸入中文時要加,要不然輸入不了中文
        caps['resetKeyboard'] = True  # 輸入中文時要加,要不然輸入不了中文

        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(20)

    def test_login(self):
        # 這樣定位到的是輸入框
        self.driver.find_element_by_class_name('android.widget.EditText').send_keys('111')
        
        # find_elements 定位多個元素,[1] 獲取第二個元素,從0開始
        self.driver.find_elements_by_class_name('android.widget.EditText')[1].send_keys('222')

相對定位

相對定位是先找到該元素的有對應屬性的父元素節點,然后基於父元素進行元素定位

 

 Xpath定位

xpath定位是一種路徑定位方式,主要是依賴於元素絕對路徑或者相關屬性來定位,但是絕對路徑xpath執行效率比較低,一般使用比較少,通常使用xpath相對路徑和屬性定位

http://www.w3school.com.cn/xpath/xpath_syntax.asp

xpath路徑表達式

contains(@resource-id,'user') 一部分就行

/ 從根節點選取
// 從匹配選擇的當前節點選擇文檔中的節點,而不考慮他們的位置
nodename 選取此節點的所有子節點
. 選取當前節點
.. 選取當前節點的父節點
@ 選取屬性
* 匹配任何元素節點
@* 匹配任何屬性節點
node() 匹配任何類型的節點

 

import pytest
from appium import webdriver


class Testcsca():
    def setup(self):
        caps = {}
        caps["platformName"] = "Android"
        # caps["deviceName"] = "127.0.0.1:62001"
        caps["deviceName"] = "CLB0219314000452"
        caps["appPackage"] = "com.jgw.csca"
        caps["appActivity"] = "com.jgw.csca.view.activity.LoginActivity"
        caps["platfromVersion"] = "9.0.0"
        caps["autoGrantPermissions"] = True  # 設置自動授權權限
        caps['unicodeKeyboard'] = True  # 輸入中文時要加,要不然輸入不了中文
        caps['resetKeyboard'] = True  # 輸入中文時要加,要不然輸入不了中文

        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(20)

    def test_login(self):
        # 沒有contains時,屬性和值之間用=
        self.driver.find_element_by_xpath('//*[@text="請輸入用戶名"]').send_keys('balabala')
        
        self.driver.find_element_by_xpath('//*[@resource-id="com.jgw.csca:id/et_pwd"]').send_keys('123456')
        # 有contains時,屬性和值之間用,中間可以用and
        self.driver.find_element_by_xpath('//*[contains(@text,"登錄") and contains(@index,"5")]').click()

List定位

List定位首先是使用find_elements_by_XX獲取一組相同屬性的元素,然后使用數組下標來區分標記不同元素進行相關操作。下標從0開始

self.driver.find_element_by_id('com.tal.csca:id/login_register_text').click()
self.driver.find_element_by_id('com.tal.csca:id/activity_register_userheader').click()
image = self.driver.find_elements_by_id('com.tal.csca:id/item_image')
image[7].click()
self.driver.find_element_by_id("com.tal.kaoyan:id/save").click()

 

 點擊頭像這里的圖片都是一個id,所以先定位到id,存放到一個列表里面,然后根據下標來確定

 Uiautomator定位

Uiautomator元素定位是Android系統原生支持的定位方式,雖然與xpath相似,但是比它更好用,且支持元素的全部屬性定位。定位原理是通過Android自帶的Android Uiautomator的類庫去查找元素。Appium元素定位方法其實也是基於Uiautomator來進行封裝的

 常用的定位方式有:

id:對應Android屬性的resource_id

text:對應安卓的text

classname:Android屬性的class

import pytest
from appium import webdriver


class Testcsca():
    def setup(self):
        caps = {}
        caps["platformName"] = "Android"
        # caps["deviceName"] = "127.0.0.1:62001"
        caps["deviceName"] = "CLB0219314000452"
        caps["appPackage"] = "com.jgw.csca"
        caps["appActivity"] = "com.jgw.csca.view.activity.LoginActivity"
        caps["platfromVersion"] = "9.0.0"
        caps["autoGrantPermissions"] = True  # 設置自動授權權限
        caps['unicodeKeyboard'] = True  # 輸入中文時要加,要不然輸入不了中文
        caps['resetKeyboard'] = True  # 輸入中文時要加,要不然輸入不了中文

        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(20)

    def test_login(self):
        # 根據text定位
        self.driver.find_element_by_android_uiautomator('new UiSelector().text("請輸入用戶名")').send_keys('666')
        
        # 根據id定位
        self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.jgw.csca:id/et_pwd")').send_keys('balabala')

        # 根據class定位
        self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button")').click()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM