1、UiAutomator2
驱动支持界面元素属性如下表
属性名称 | 具体描述 | 举例说明 |
---|---|---|
checkable |
元素是否可检查。 | true |
checked |
元素是否是检查状态,通常false 表示元素不可检查。 |
false |
class 或 className
|
元素类型全名,对于某些元素类型名称可能是null 。 |
android.view.View |
clickable |
元素是否可被点击。 | false |
content-desc 或 contentDescription
|
可访问元素的内容描述属性。 | Contacts |
enabled |
元素是否可被点击。(存疑) | true |
focusable |
元素是否可被聚焦(焦点)。 | true |
focused |
元素当前是否是焦点,通常false 表示元素不可聚焦。 |
false |
long-clickable 或 longClickable
|
元素是否支持长按。 | false |
package |
元素所属的包的标识符。 | com.google.android.diale |
password |
元素是否是密码输入字段。 | true |
resource-id 或 resourceId
|
元素的资源标识符(资源id ),可能是null 。 |
com.google.android.dialer:id/tab_contacts |
scrollable |
元素是否可滚动。 | true |
selection-start |
包含开始选择的字符的索引,若元素未提供范围信息,该值可能是null 。 |
5 |
selection-end |
包含结束选择的字符的索引,若元素未提供范围信息,该值可能是null 。 |
8 |
selected |
元素是否被选中。 | false |
text 或name
|
元素的文本内容,不会为空。 | 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
和相关环境(例如JDK
、Android SDK
、AVD
模拟器),可以参考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