前言
上一篇文章地址:
Appium: 手机应用自动化测试(一)-CSDN博客
下一篇文章地址:
暂无
一、元素定位
通过上一节,我们了解到可以通过adb获取当前界面的元素信息,获取如下:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<hierarchy rotation="3">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="com.coolkit:id/action_bar_root" class="android.widget.LinearLayout" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,160]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,48][900,160]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,48][398,160]">
<node NAF="true" index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,56][117,152]">
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[54,80][102,128]"/>
</node>
<node index="1" text="我的设备25804c" resource-id="" class="android.widget.TextView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[135,79][398,128]"/>
</node>
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[112,48][788,160]"/>
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[704,48][900,160]">
<node NAF="true" index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[704,80][772,128]">
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[714,80][762,128]"/>
</node>
<node NAF="true" index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[772,80][840,128]">
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[782,80][830,128]"/>
</node>
</node>
</node>
</node>
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,160][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,160][900,1600]">
<node index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,160][900,1426]">
<node NAF="true" index="0" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[300,527][600,1059]">
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[300,599][600,1059]"/>
</node>
</node>
<node index="1" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,1450][300,1576]">
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[114,1450][186,1522]"/>
<node index="1" text="定时" resource-id="" class="android.widget.TextView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[124,1540][176,1576]"/>
</node>
<node index="2" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[300,1450][600,1576]">
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[414,1450][486,1522]"/>
<node index="1" text="延时" resource-id="" class="android.widget.TextView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[424,1540][476,1576]"/>
</node>
<node index="3" text="" resource-id="" class="android.view.ViewGroup" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[600,1450][900,1576]">
<node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[714,1450][786,1522]"/>
<node index="1" text="循环定时" resource-id="" class="android.widget.TextView" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[698,1540][802,1576]"/>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
<node index="1" text="" resource-id="" class="android.widget.FrameLayout" package="com.coolkit" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][900,1600]"/>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</hierarchy>
我们将以该信息为例以及而外补充的元素信息来查看定位元素的方式。
假设 driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
1、通过 resource-id 定位
对应的查找方法为
driver.find_element_by_id(【元素resource-id】)
driver.find_element(By.ID, 【元素resource-id】)
通常是唯一的。
在 Android 开发和自动化测试中,resource-id
是用于唯一标识 UI 元素的一个属性。每个 UI 元素都有一个资源 ID,这个资源 ID 是在应用程序的 XML 布局文件中定义的,并且是唯一的。resource-id
可以帮助开发人员和自动化测试脚本精确地定位和操作应用中的特定元素。
2、通过 class 来定位
对应的查找方法为
driver.find_elements_by_class_name(【元素class】)
driver.find_element(By.CLASS_NAME, 【元素class】)
通常会找到多个元素,返回列表对象,此时可以通过列表取值方式取值。
在 Android 开发和自动化测试中,class
是一个属性,用于描述 UI 元素的类型。这个属性通常会包含一个字符串值,表示元素的具体类别,如 Button
, TextView
, ImageView
, LinearLayout
等。通过这个属性,开发人员和自动化测试工具可以更好地理解和操作不同类型的 UI 元素。
3、通过 content-desc 定位
对应的查找方法为
driver.find_element_by_accessibility_id(【元素content-desc】)
driver.find_element(By.ACCESSIBILITY_ID, 【元素content-desc】)
content-desc
属性的主要目的是提高应用的无障碍访问性。屏幕阅读器(如 TalkBack)会读取该描述,从而帮助视障用户理解该 UI 元素的功能和内容。比如,一个按钮可能没有显示文本,但可以通过 content-desc
属性提供描述。
4、通过 xpath 定位
对应的查找方法为
driver.find_element_by_xpath(【元素xpath】)
driver.find_element(By.XPATH, 【元素xpath】)
这个在元素描述时没有明确的属性来指定,需要学习一些xpath语法。
(1) //android.widget.TextView[@text='定时']
假设有个xpath为 //android.widget.TextView[@text='定时'] , 解释这个语法的各个部分如下:
//
双斜杠表示从当前节点选择文档中的所有符合条件的节点,不论它们在文档中的位置。这意味着会搜索整个文档(或 DOM 树),找到所有匹配的元素。
android.widget.TextView
这是要查找的元素类型。在 Android 中,它是一个常见的 UI 元素,用于显示文本内容。
[@text='定时']
方括号内的内容是条件,用于过滤前面选择的元素。@text='定时'
表示只选择那些 text
属性等于 '定时'
的 android.widget.TextView
元素。
综合起来,//android.widget.TextView[@text='定时']
表示查找所有 text
属性等于 '定时'
的 android.widget.TextView
元素,不论它们在文档中的位置。
(2)//android.widget.Button[contains(@text, '延时')]
解释这个语法的各个部分如下,重复不解释:
android.widget.Button
这是要查找的元素类型。在 Android 中,它是一个常见的 UI 元素,用于表示按钮。
contains(@text, '延时') contains
是一个函数,用于检查属性值是否包含特定的子字符串。@text
是要检查的属性,'延时'
是要查找的子字符串。这表示查找所有 text
属性包含 '延时'
字符串的 android.widget.Button
元素。
综合起来,//android.widget.Button[contains(@text, '延时')]
表示查找所有 text
属性包含 '延时'
字符串的 android.widget.Button
元素,不论它们在文档中的位置。
(3)//*
[@class='android.widget.Button' and @text='循环定时']
解释这个语法的各个部分如下,重复不解释:
//*
双斜杠 //
表示从当前节点选择文档中的所有符合条件的节点,不论它们在文档中的位置。这意味着会搜索整个文档(或 DOM 树),找到所有匹配的元素。星号 *
表示选择所有元素。
[@class='android.widget.Button']
方括号 []
用于指定条件。@class='android.widget.Button'
表示筛选 class
属性值等于 android.widget.Button
的元素。这是一个属性筛选条件,用来匹配特定类型的 UI 元素。
and and
是一个逻辑运算符,用于连接多个条件。这里表示需要同时满足 @class='android.widget.Button'
和 @text='循环定时'
两个条件。
[@text='循环定时']
这是第二个属性筛选条件。@text='循环定时'
表示筛选 text
属性值等于 循环定时
的元素。
综合起来 , //*[@class='android.widget.Button' and @text='循环定时']
表示查找所有 class
属性值为 android.widget.Button
且 text
属性值为 循环定时
的元素,不论它们在文档中的位置。
(4)绝对路径
//android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.Button[2]
解释这个语法的各个部分如下,重复不解释:
android.widget.FrameLayout[1]
:android.widget.FrameLayout
表示一个 FrameLayout
类型的节点。[1]
表示选择这个类型的第一个子节点。数字从 1 开始计数,而不是 0。
/
:单斜杠表示从当前节点选择直接子节点。
节点路径:这一长串路径 //android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/...
表示在文档结构中嵌套的层次结构。这种路径表达式从根节点开始,逐层深入,直到定位到最终的目标元素。
android.widget.Button[2]
:android.widget.Button
表示一个 Button
类型的节点。[2]
表示选择这个类型的第二个子节点。
综合起来 ,从根节点开始,找到第一个 FrameLayout
类型的节点。在这个节点的子节点中,找到第一个 FrameLayout
类型的节点。依次重复这个过程,直到到达嵌套结构的末尾。最后,找到 RelativeLayout
下的第二个 Button
类型的节点。
5、通过 text 来定位
对应的查找方法为
driver.find_element_by_android_uiautomator('new UiSelector().text("【元素text】")')
element = driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("【元素text】")')
假设有一元素'new UiSelector().text("定时")'
,这是一种使用 Appium 和 UIAutomator 来定位 Android 应用中的元素的方法。这个语法是java语法嵌套于python中,它使用了 UIAutomator 框架中的 UiSelector
类来创建一个选择器,来查找文本内容为“定时”的元素。以下是对这个语法的详细解释:
new UiSelector()
:UiSelector
是 UIAutomator 提供的一个类,用于构建查找 UI 元素的选择器。new UiSelector()
创建了一个新的选择器实例。
.text("定时")
:.text("定时")
是选择器的方法之一,用于查找文本内容等于“定时”的元素。当这个方法被调用时,选择器会匹配所有文本内容为“定时”的 UI 元素。
这里涉及到一个 UiSelector 类,方法小结如下:
1. text(String text)
用于根据精确文本内容定位控件。new UiSelector().text("Submit")
此代码定位文本内容为“Submit”的控件。2. textContains(String text)
用于根据部分文本内容定位控件。new UiSelector().textContains("Sub")
此代码定位包含“Sub”文本的控件,例如“Submit”或“Subscription”。3. textStartsWith(String text)
用于根据文本开头部分定位控件。new UiSelector().textStartsWith("Sub")
此代码定位文本以“Sub”开头的控件,例如“Submit”或“Subscribe”。4. textMatches(String regex)
用于根据正则表达式匹配文本内容定位控件。new UiSelector().textMatches("^Sub.*")
此代码定位文本以“Sub”开头的控件,正则表达式可以更复杂以匹配不同的文本模式。5. resourceId(String resourceId)
用于根据控件的资源 ID 进行定位。new UiSelector().resourceId("com.example:id/button")
此代码定位资源 ID 为 com.example:id/button 的控件。6. resourceIdMatches(String regex)
用于根据正则表达式匹配资源 ID 定位控件。new UiSelector().resourceIdMatches("com\\.example:.*")
此代码定位资源 ID 符合正则表达式 com.example: 开头的控件。7. className(String className)
用于根据控件的类名进行定位。new UiSelector().className("android.widget.Button")
此代码定位类名为 android.widget.Button 的控件。8. classNameMatches(String regex)
用于根据正则表达式匹配控件的类名进行定位。new UiSelector().classNameMatches("android\\.widget\\..*")
此代码定位类名以 android.widget. 开头的控件。9、组合使用示例
假设你需要定位一个按钮,它的文本以“Sub”开头,资源 ID 包含“button”,且类名为 android.widget.Button。你可以组合使用这些方法:new UiSelector().textStartsWith("Sub").resourceIdContains("button").className("android.widget.Button");
或者如果需要使用正则表达式:new UiSelector().textMatches("^Sub.*").resourceIdMatches(".*button.*").classNameMatches("android\\.widget\\.Button");
这些组合可以帮助你更加精确地定位界面上的控件。通过组合多个 UiSelector 方法,可以缩小查找范围,提高定位的准确性。
二、查看安卓手机元素的工具
1、UI Automator Viewer
UI Automator Viewer 是 Android SDK 提供的工具,用于查看 Android 应用程序的 UI 层次结构和元素属性。
2、Appium Inspector
Appium Inspector 是 Appium 提供的一个图形化界面工具,用于查看和检查应用程序的 UI 元素。
3、ADB (Android Debug Bridge)
ADB 是一个命令行工具,用于与 Android 设备进行通信。可以通过 ADB 命令获取应用的 UI 层次结构和元素属性。
4、 Espresso Test Recorder
Espresso Test Recorder 是 Android Studio 提供的工具,用于记录和生成 Espresso 测试代码。