Appium UiAutomator2驱动:界面元素属性介绍

1、UiAutomator2驱动支持界面元素属性如下表

属性名称 具体描述 举例说明
checkable 元素是否可检查。 true
checked 元素是否是检查状态,通常false表示元素不可检查。 false
classclassName 元素类型全名,对于某些元素类型名称可能是null android.view.View
clickable 元素是否可被点击。 false
content-desccontentDescription 可访问元素的内容描述属性。 Contacts
enabled 元素是否可被点击。(存疑) true
focusable 元素是否可被聚焦(焦点)。 true
focused 元素当前是否是焦点,通常false表示元素不可聚焦。 false
long-clickablelongClickable 元素是否支持长按。 false
package 元素所属的包的标识符。 com.google.android.diale
password 元素是否是密码输入字段。 true
resource-idresourceId 元素的资源标识符(资源id),可能是null com.google.android.dialer:id/tab_contacts
scrollable 元素是否可滚动。 true
selection-start 包含开始选择的字符的索引,若元素未提供范围信息,该值可能是null 5
selection-end 包含结束选择的字符的索引,若元素未提供范围信息,该值可能是null 8
selected 元素是否被选中。 false
textname 元素的文本内容,不会为空。 Contacts
hint 元素的提示文本,低于Android版本Oreo,该值通常为null my hint text
bounds 元素可见框架([left, top][right, bottom]) [0,0][100,100]
displayed 元素对于用户是否可见。 true
contentSize 元素内容区域的信息,例如长度宽度等 {"left": 0, "top":0, "width": 100, "height": 100, "scrollableOffset": 10, "touchPadding": 0}
extras getExtras的结果,结果包含以分号;分隔的所有key=value键值对,如果结果是空,那么只包含key=部分。 chrome浏览器extras的结果:AccessibilityNodeInfo.roleDescription=; AccessibilityNodeInfo.chromeRole=rootWebArea; ACTION_ARGUMENT_HTML_ELEMENT_STRING_VALUES= ARTICLE,BLOCKQUOTE,BUTTON,CHECKBOX

2、界面元素属性示例展示

本文所有测试代码的前提是已经安装Appium和相关环境(例如JDKAndroid SDKAVD模拟器),可以参考Appium环境搭建

所使用的相关软件及版本如下:

软件名称 软件版本
Linux操作系统 Ubuntu 22.04
JDK 20.0.1
Android SDK 33
node.js 18.17
npm 9.6.7
Appium Server 2.0.1
Appium Client 2.11.1
AVD(模拟器) /
Python 3.10.6

下面演示了从模拟器获取到联系人页面后,获取联系人页面元素属性,所有的属性需要通过元素的接口get_attribute进行获取,代码示例如下:

# -*- coding: utf-8 -*-

import pytest

from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.appium_service import AppiumService
from appium.webdriver.common.appiumby import AppiumBy

# 开启服务端
APPIUM_HOST = '127.0.0.1'
APPIUM_PORT = 4723
@pytest.fixture(scope="session")
def start_appium_service():
 server = AppiumService()
 server.start(args=['--address', APPIUM_HOST, '-p', str(APPIUM_PORT)], timeout_ms=60000)
 yield server
 server.stop()

# 创建客户端到服务端的会话
def create_appium_session_by_api(custom_opts = None):
 options = UiAutomator2Options()
 if custom_opts is not None:
 options.load_capabilities(custom_opts)
 return webdriver.Remote(f'http://{APPIUM_HOST}:{APPIUM_PORT}', options=options)

def test_element_attribute(start_appium_service):
 custom_opts = {
 "appium:appPackage": "com.google.android.dialer",
 "appium:appActivity": ".extensions.GoogleDialtactsActivity",
 "appium:avd": "testPhone",
 }
 driver = create_appium_session_by_api(custom_opts)

 # 获取联系人页面
 contact_id_full = "com.google.android.dialer:id/tab_contacts"
 contact = driver.find_element(AppiumBy.ID, value=contact_id_full)

 print("\n=======print element attribute==========")
 print(f"======= checkable: {contact.get_attribute('checkable')}")
 print(f"======= checked: {contact.get_attribute('checked')}")
 print(f"======= class/className: {contact.get_attribute('className')}")
 print(f"======= clickable: {contact.get_attribute('clickable')}")
 print(f"======= content-desc/contentDescription: {contact.get_attribute('content-desc')}")
 print(f"======= enabled: {contact.get_attribute('enabled')}")
 print(f"======= focusable: {contact.get_attribute('focusable')}")
 print(f"======= focused: {contact.get_attribute('focused')}")
 print(f"======= long-clickable/longClickable: {contact.get_attribute('long-clickable')}")
 print(f"======= package: {contact.get_attribute('package')}")
 print(f"======= password: {contact.get_attribute('password')}")
 print(f"======= resource-id/resourceId: {contact.get_attribute('resource-id')}")
 print(f"======= scrollable: {contact.get_attribute('scrollable')}")
 print(f"======= selection-start: {contact.get_attribute('selection-start')}")
 print(f"======= selection-end: {contact.get_attribute('selection-end')}")
 print(f"======= selected: {contact.get_attribute('selected')}")
 print(f"======= text/name: {contact.get_attribute('name')}")
 print(f"======= hint: {contact.get_attribute('hint')}")
 print(f"======= bounds: {contact.get_attribute('bounds')}")
 print(f"======= displayed: {contact.get_attribute('displayed')}")
 print(f"======= contentSize: {contact.get_attribute('contentSize')}")
 print(f"======= extras: {contact.get_attribute('extras')}")

可能的运行结果:

=======print element attribute==========
======= checkable: false
======= checked: false
======= class/className: android.widget.FrameLayout
======= clickable: true
======= content-desc/contentDescription: Contacts
======= enabled: true
======= focusable: true
======= focused: false
======= long-clickable/longClickable: false
======= package: com.google.android.dialer
======= password: false
======= resource-id/resourceId: com.google.android.dialer:id/tab_contacts
======= scrollable: false
======= selection-start: None
======= selection-end: None
======= selected: false
======= text/name: 
======= hint: None
======= bounds: [214,560][320,640]
======= displayed: true
======= contentSize: {"width":106,"height":80,"top":560,"left":214,"scrollableOffset":0,"touchPadding":8}
======= extras: AccessibilityNodeInfo.roleDescription=Tab

附录

1.官方介绍https://github.com/appium/appium-uiautomator2-driver
2.文章初始来源https://gitee.com/shengzhemi/MyPractice/wikis/projects/appium/Appium%20UiAutomator2%E9%A9%B1%E5%8A%A8%EF%BC%9A%E7%95%8C%E9%9D%A2%E5%85%83%E7%B4%A0%E5%B1%9E%E6%80%A7%E4%BB%8B%E7%BB%8D

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容