Appium常用的3種元素定位方式



🍎以最右App為例

.apk文件網盤地址:

鏈接:https://pan.baidu.com/s/1L4MYkhpb5ECe8XeaneTx_Q
提取碼:0jqm

1.find_element_by_id / find_elements_by_id

# -*- coding:utf-8 -*-
# 作者:IT小學生蔡坨坨
# 時間:2020/12/18 22:00

import os
import unittest
import time
from appium import webdriver


class AndroidTests(unittest.TestCase):
    def setUp(self):
        """ 初始化 """
        desired_caps = {}  # 定義一個desired_caps字典
        desired_caps['platformName'] = 'Android'  # 平台名稱 Android或iOS
        desired_caps['platformVersion'] = '10'  # 系統版本號 設置->關於手機->Android版本 10
        desired_caps['deviceName'] = 'Android Emulator'  # 設備名稱,一般寫Android Emulator就行
        desired_caps['noReset'] = 'True'  # 不重置

        # 獲取appPackage和appActivity
        # 打開cmd
        # 輸入adb shell dumpsys activity top | findstr "ACTIVITY"
        # ACTIVITY cn.xiaochuankeji.tieba/.ui.base.SplashActivity 9df8d05 pid=27957
        desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'  # app的包名,cn.xiaochuankeji.tieba
        desired_caps['appActivity'] = '.ui.base.SplashActivity'  # app首個活動界面,.ui.base.SplashActivity

        # 輸入中文
        # desired_caps['unicodeKeyboard'] = 'True'  # 安裝appium自帶輸入法
        # desired_caps['resetKeyboard'] = 'True'  # 重置鍵盤,修改默認輸入法

        # Appium REST http interface listener started on 0.0.0.0:4723
        # Appium Server 地址及端口號
        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

    def tearDown(self):
        # self.driver.quit()
        print("執行結束!")

    def test_by_id(self):
        self.driver.implicitly_wait(60)

        # demo01: find_element_by_id,如果id相同,則默認定位第一個
        # 場景:點擊關注按鈕,切換至關注頁面
        ele = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/title")
        print(ele.text)
        ele.click()
        time.sleep(2)

        # demo02:
        # 場景:點擊話題按鈕,切換到話題頁面
        self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/topic").click()
        time.sleep(3)

        # demo03:
        # 場景:點擊×號,退出話題頁面,返回關注頁面
        self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/ic_search_b").click()
        time.sleep(2)

        # demo04: find_elements_by_id
        # 場景:點擊圖文按鈕,切換至圖文頁面

        # 獲取所有di為cn.xiaochuankeji.tieba:id/title的控件
        ele = self.driver.find_elements_by_id("cn.xiaochuankeji.tieba:id/title")
        # 通過一個循環,確認要定位的控件是第幾個
        for i in range(0, len(ele)):
            print("第" + str(i) + "個" + "是" + ele[i].text, end=" ")  # 第0個是關注 第1個是推薦 第2個是視頻 第3個是圖文 執行結束!
        # 點擊圖文,圖文控件的索引為3
        ele[3].click()

        # demo05:
        # 場景:點擊第一條帖子的用戶頭像
        self.driver.find_elements_by_id("cn.xiaochuankeji.tieba:id/avatar_view_avatar")[0].click()


if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

2.find_element_by_class_name / find_elements_by_class_name

    def test_by_class_name(self):
        time.sleep(8)
        self.driver.implicitly_wait(60)

        # demo01:通過find_element_by_class_name定位TextView控件
        # 若有多個class_name相同,則默認定位第一個
        # 場景:點擊關注按鈕,切換至關注頁面
        ele = self.driver.find_element_by_class_name('android.widget.TextView')
        time.sleep(3)
        print(ele.text)
        # 點擊關注按鈕
        ele.click()
        time.sleep(5)

        # demo02:通過find_elements_by_class_name定位TextView控件
        # 場景:點擊圖文按鈕,切換到關注頁面
        # find_elements_by_class_name找到所有TextView控件
        ele = self.driver.find_elements_by_class_name('android.widget.TextView')
        # 通過一個循環獲取控件的索引號
        for i in range(0, len(ele)):
            print("第" + str(i) + "個" + "是" + ele[i].text)
        ele[3].click()  # 點擊圖文
        time.sleep(3)
        """
        返回結果:
        第0個是關注
        第1個是推薦
        第2個是視頻
        第3個是圖文
        ......
        執行完成!
        """

        # demo03: 通過通過find_elements_by_class_name定位ImageView控件
        # 場景:點擊話題圖標,進入話題頁面
        self.driver.find_elements_by_class_name("android.widget.ImageView")[1].click()
        time.sleep(2)

        # demo04:
        # 場景:點擊×號退出話題頁面
        self.driver.find_elements_by_class_name("android.widget.ImageView")[2].click()
        time.sleep(3)

        # demo05: 通過find_elements_by_class_name定位View控件
        # 場景:點擊查看第一條帖子的詳情
        self.driver.find_elements_by_class_name("android.view.View")[2].click()

3.find_elements_by_xpath / find_element_by_xpath

    def test_xpath(self):
        time.sleep(8)
        self.driver.implicitly_wait(60)

        # demo01: xpath通過id定位單個元素
        # 場景:定位關注按鈕,並點擊
        self.driver.by_xpath(
            "//android.widget.TextView[@resource-id='cn.xiaochuankeji.tieba:id/title']").click()
        time.sleep(3)

        # demo02: xpath通過id定位多個元素
        # 定位話題按鈕,並點擊
        # 盡量不要用find_elements_by_xpath,查找多個元素后還需要用索引定位
        ele = self.driver.find_elements_by_xpath(
            "//android.widget.ImageView[@resource-id='cn.xiaochuankeji.tieba:id/topic']")
        ele[0].click()
        time.sleep(2)

        # demo03: xpath通過text文本定位,控件屬性android.widget.ImageView
        # 點擊創建
        self.driver.find_element_by_xpath("//android.widget.TextView[@text='創建']").click()
        time.sleep(2)

        # demo04: xpath通過text文本定位,無控件屬性
        # 點擊關閉
        self.driver.find_element_by_xpath("//*[@text='關閉']").click()
        time.sleep(2)
        # 返回到關注頁面
        self.driver.keyevent(4)
        # 點擊下方最中間的+號按鈕,進入話題編輯頁面
        self.driver.find_elements_by_xpath(
            '//android.widget.ImageView[@resource-id="cn.xiaochuankeji.tieba:id/iconTabItem"]')[2].click()
        time.sleep(3)

        # demo05: xpath通過class查找單個元素
        # 點擊創建話題中的android.widget.EditText
        self.driver.find_element_by_xpath("//*[@class='android.widget.EditText']")
        # 按一次返回鍵隱藏鍵盤
        self.driver.keyevent(4)
        time.sleep(1)
        # 再按一次返回鍵
        self.driver.keyevent(4)
        time.sleep(2)
        # 點擊不保留
        self.driver.find_element_by_xpath("//*[@text='不保留']").click()
        time.sleep(2)

        # demo06:
        # 組合定位,多個屬性,用and定位
        # 定位視頻按鈕,並點擊
        self.driver.find_element_by_xpath("//*[@resource-id='cn.xiaochuankeji.tieba:id/title' and @text='視頻']").click()
        time.sleep(2)

        # demo07:
        # 通過層級定位,父級找子級,只有一個子級
        # 定位搜索按鈕
        self.driver.find_element_by_xpath(
            "//android.widget.FrameLayout[@resource-id='cn.xiaochuankeji.tieba:id/search_b']/android.widget.ImageView").click()
        time.sleep(2)
        self.driver.keyevent(4)
        time.sleep(2)

        # demo08:
        # 通過層級關系,父級找子級,有多個子級,則需要加上索引,索引從1開始
        self.driver.find_element_by_xpath(
            "//android.widget.FrameLayout[@resource-id='cn.xiaochuankeji.tieba:id/search_b']/android.widget.ImageView[1]").click()
        time.sleep(2)
        self.driver.keyevent(4)
        time.sleep(3)

        # demo09:
        # 子級定位父級
        # 定位 圖文 按鈕
        self.driver.find_element_by_xpath("//android.widget.TextView[@text='圖文']/..").click()
        time.sleep(2)

        # demo10:
        # 定位最右按鈕上的文案信息,先找到父級的父級,再找到父級的兄弟級的子級
        self.driver.find_element_by_xpath(
            "//*[@text='最右']/../../android.view.ViewGroup[2]/android.widget.ImageView").click()


免責聲明!

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



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