当前位置: 首页 > news >正文

【UI自动化测试】7_Appium基础API _元素定位

文章目录

  • 一、元素定位操作 API
    • 1.1 应用场景
    • 1.2 步骤
    • 1.3 注意点
  • 二、定位一个元素
    • 2.1 需求
    • 2.2 注意问题
  • 三、定位一组元素
    • 3.1 需求
  • 四、总结
    • 4.1 优先用谁?(从上到下选)
    • 4.2 7 种定位写法(直接复制)
    • 4.3 实战口诀

一、元素定位操作 API

1.1 应用场景

计算机不像人一样 ”聪明“,我们需要通过元素定位来获取元素,才能让计算机帮我们 ”操作“ 这个元素。

1.2 步骤

1、打开 uiautomatorviewer 工具

2、打开模拟器或真机

3、通过 uiautomatorviewer 工具获取想要进行操作的元素的 Node Detail 信息

4、通过元素定位 API 进行定位

5、对元素进行相关操作

1.3 注意点

元素的定位基于当前屏幕范围内展示的可见元素。

二、定位一个元素

2.1 需求

安卓模拟器《设置》界面:

  • ①通过 id 的形式,定位 ”放大镜“ 按钮,并点击
  • ②通过 class 的形式,定位 ”输入框“,输入 ”hello“
  • ③通过 xpath 的形式,定位 ”返回“ 按钮,并点击
  • ④等待3s,关闭app
# 1、导包importtimefromappiumimportwebdriver# 这个python类AppiumBy继承自By类,用于定义不同的定位策略常量,以便在Appium自动化测试中定位元素fromappium.webdriver.common.appiumbyimportAppiumBy# 导入AppiumBy# 2、配置启动参数desired_caps={}# 手机参数desired_caps['platformName']='Android'desired_caps['platformVersion']='5.1'desired_caps['deviceName']='1'# 应用参数desired_caps['appPackage']='com.android.settings'desired_caps['appActivity']='com.android.settings.Settings'# 3、创建APP驱动对象driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)# 4、业务操作# ①通过 id 定位放大镜按钮,点击# search_button = driver.find_element_by_id("com.android.settings:id/search")# search_button.click()driver.find_element(AppiumBy.ID,"com.android.settings:id/search").click()time.sleep(5)# 延迟5秒发送到安卓模拟器# ②通过 class 定位输入框,输入hello# driver.find_element_by_class_name("android.widget.EditText").send_keys("hello")driver.find_element(AppiumBy.CLASS_NAME,"android.widget.EditText").send_keys("hello")# ③通过 xpath 定位返回按钮,点击# driver.find_element_by_xpath("//*[@content-desc='收起']").click()driver.find_element(AppiumBy.XPATH,"//*[@content-desc='收起']").click()# ④等待3s,关闭apptime.sleep(3)# 5、关闭APPdriver.quit()

2.2 注意问题

selenium.common.exceptions.NoSuchElementException:Message:An element couldnotbe located on the page using the given search parameters.;For documentation on this error,please visit:https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exceptionStacktrace:NoSuchElementError:An element couldnotbe located on the page using the given search parameters.at AndroidUiautomator2Driver.findElOrEls(C:\Users\ggk\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\appium-android-driver\lib\commands\find.js:75:11)at processTicksAndRejections(internal/process/task_queues.js:85:5)

原因:因为用电脑连接安卓模拟器,电脑配置太高,运行python代码太快导致传输到安卓模拟器还没反映过来。

解决方法:在代码中加入以下代码:

time.sleep(5)# 延迟5秒发送到安卓模拟器

三、定位一组元素

3.1 需求

安卓模拟器《设置》界面:

  • ①通过 id 定位的形式,获取所有 resource-id 为 ”com.android.settings:id/title“ 的元素,并打印其文字内容。

  • ②通过 class_name 的形式,获取所有class 为 ”android.widget.TextView“ 的元素,并打印其文字内容。

  • ③通过 xpath 的形式,获取所有包含 ”设“ 的元素,并打印其文字内容。

# 1、导包importtimefromappiumimportwebdriver# 这个python类AppiumBy继承自By类,用于定义不同的定位策略常量,以便在Appium自动化测试中定位元素fromappium.webdriver.common.appiumbyimportAppiumBy# 导入AppiumBy# 2、配置启动参数desired_caps={}# 手机参数desired_caps['platformName']='Android'desired_caps['platformVersion']='5.1'desired_caps['deviceName']='1'# 应用参数desired_caps['appPackage']='com.android.settings'desired_caps['appActivity']='com.android.settings.Settings'# 3、创建APP驱动对象driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)# 4、业务操作# - ①通过 id 定位的形式,获取所有 resource-id 为 ”com.android.settings:id/title“ 的元素,并打印其文字内容。titles=driver.find_elements(AppiumBy.ID,"com.android.settings:id/title")foriintitles:print(i.text)# titles[1].click() # 找到第二个元素(蓝牙),并点击print("----------------------------")# - ②通过 class_name 的形式,获取所有class 为 ”android.widget.TextView“ 的元素,并打印其文字内容。foriindriver.find_elements(AppiumBy.CLASS_NAME,"android.widget.TextView"):print(i.text)print("----------------------------")# - ③通过 xpath 的形式,获取所有包含 ”设“ 的元素,并打印其文字内容。foriindriver.find_elements(AppiumBy.XPATH,"//*[contains(@text,'设')]"):print(i.text)time.sleep(2)# 5、关闭APPdriver.quit()

四、总结

4.1 优先用谁?(从上到下选)

  1. By.ID(resource-id)→ 最快最稳
  2. By.ACCESSIBILITY_ID(content-desc)→(移动端特有)
  3. By.XPath→ 万能、组合条件
  4. By.ANDROID_UIAUTOMATOR(安卓)→ (安卓特有)复杂页面强
  5. By.IOS_PREDICATE(iOS特有)
  6. 坐标→ 最后无奈才用

特点:

  • 移动端页面通常基于原生控件(如Android的View、iOS的UIView),其结构与Web不同。
  • 常用 text 属性进行定位,例如:
xpath_str=f"//*[@text='{key_text}']"

4.2 7 种定位写法(直接复制)

① ID 定位(首选)

Android:resource-id

iOS:nameaccessibility-id

driver.find_element(By.ID,"com.tencent.news:id/title_text")

② Accessibility ID(iOS 巨好用)

Android:content-desc

iOS:accessibility-id

driver.find_element(AppiumBy.ACCESSIBILITY_ID,"搜索")

③ XPath(最万能、必学)

  • 多条件组合
  • 按文字找
  • 父子、兄弟节点定位
//*[@resource-id="xxx"]//*[contains(@text,"关键词")]//类名[@resource-id="xxx"andcontains(@text,"xxx")]//android.widget.TextView[@resource-id="xxx"andcontains(@text,"xxx")]

④ Class Name(控件类型)

# 一般不单独用,页面太多重复,要配合列表使用。# 标签名(class)driver.find_elements(By.CLASS_NAME,"android.widget.TextView")

⑤ Android UIAutomator(安卓专属,很强)

driver.find_element_by_android_uiautomator('new UiSelector().resourceId("xxx").textContains("亚冠")')

⑥ iOS Class Chain(iOS 专属,替代 XPath)

**/XCUIElementTypeStaticText[`name CONTAINS "登录"`]

⑦ 坐标定位(不推荐)

driver.tap([(x,y)])

4.3 实战口诀

有 ID 用 ID

没 ID 用文本

多条件用 and

不乱用坐标

//android.widget.TextView[@resource-id="xxx" and contains(@text,"xxx")]

http://www.jsqmd.com/news/429320/

相关文章:

  • 最短路 - [USACO09NOV] Job Hunt S
  • DOA-CNN-LSTM分类预测+SHAP分析+特征依赖图!深度学习可解释分析,Matlab代码实现
  • Task06:秋招秘籍 C
  • Task04:集合运算
  • 求职】网络工程专业简历怎么写?校招/社招通用模板(附可直接复制写法)
  • Task06:秋招秘籍 A
  • 人生第一份简历——2025年春
  • Task05:SQL高级处理
  • AT_arc199_a [ARC199A] Flip Row or Col 2
  • Task02:基础查询与排序(一)
  • Task03:复杂一点的查询(二)
  • 提示工程ROI评估与风险控制:架构师教你怎么平衡收益与风险
  • 工作感受月记(202603月)
  • 一个月入千美元的游戏站 和 游戏周边站建站技巧
  • 2026年3月广州GEO系统公司推荐,技术、案例、服务三维数据透视 - 品牌鉴赏师
  • 高清流程图|AI应用架构师教你设计AI智能体的“任务分解”机制
  • Task03:复杂一点的查询(一)
  • RK3588 CPU占用说明
  • 随心听书 2.0.3 | 电子书听书神器,内置微软语音,堪比真人
  • 2026年3月上海品牌升级咨询服务公司推荐:定制化方案与预算合理规划 - 品牌鉴赏师
  • 洛雪音乐 手机版+桌面版+魔改版| 目前最强免费音乐软件,支持无损下载,IKUN魔改版更新
  • Task02:基础查询与排序(二)
  • 基于 Fail2ban 的 OpenWRT SSH 入侵自动反制方案
  • 颜色相似度度量
  • Task01:环境搭建,初识数据库
  • Jbd5:MapReduce
  • LLM 算法岗 | 字节面试高频算法题汇总,附 leetcode 链接
  • C语言中结构体的深拷贝与浅拷贝
  • 最长公共子序列(一)
  • P2580 于是他错误的点名开始了