网站首页 > 技术文章 正文
客户端的页面通过 XML 来实现 UI 的布局,页面的 UI 布局作为一个树形结构,而树叶被定义为节点。这里的节点也就对应了要定位的元素,节点的上级节点,定义了元素的布局结构。在 XML 布局中可以使用 XPath 进行节点的定位。
App的布局结构
1080×607 155 KB
从上面这张图中可以看到最左侧是应用的页面的展示,中间部分展示了这个页面的树形结构的 XML 代码。
其中包含的内容为:
- 节点 node
- 节点属性:包括 clickable(是否可点击)、content-desc(内容)、resource-id(元素 id)、text(文本)、bounds(坐标)等。
通过 ID 定位
在 Android 系统元素的 ID 称为 resource-id,使用页面分析工具比如 Appium Inspector 能够获取元素的唯一标识是 ID 属性,可以使用 ID 进行元素定位,方便快捷。
示例代码如下:
- Python 版本
driver.find_element(By.ID, "android:id/text1").click()
- Java 版本
driver.findElement(By.id("android:id/text1")).click();
注意 resource-id 对应的属性(包名:id/id 值),在使用这个属性的时候要把它当作一个整体。
通过 Accessibility 定位
当分析工具能抓取到的 content-desc 的属性值是唯一时,可以采用 Accessibility 的定位方式,示例代码:
- Python 版本
driver.find_element_by_accessibility_id("Accessibility")
- Java 版本
driver.findElementByAccessibilityId("Accessibility");
通过 XPath 定位
与 Selenium 类似,可以使用 XPath 的定位方式完成页面的元素定位。XPath 分为绝对路径定位与相对路径定位两种形式,下面介绍的都是相对定位的形式。
XPath:resource-id 属性定位
元素可以通过 resource-id 定位。
格式:
//*[@resource-id='resource-id属性']
示例代码:
- Python 版本
driver.find_element(By.XPATH, \
'//*[@resource-id="rl_login_phone"]')
- Java 版本
driver.findElement(By.xpath(\
"//*[@resource-id=\"rl_login_phone\"]"));
XPath:text 属性定位
元素可以通过 text 文本属性定位。
格式:
//*[@text=’text文本属性’]
示例代码如下
- Python 版本
driver.find_element(By.XPATH,'//*[@text="我的"]')
- Java 版本
driver.findElement(By.xpath("//*[@text=\"我的\"]"));
XPath:class 属性定位
元素可以通过 class 定位。
格式:
//*[@class=’class 属性’]
示例代码:
- Python 版本
driver.find_element(By.XPATH,\
'//*[@class="android.widget.EditText"]')
- Java 版本
driver.findElement(By.xpath(\
"//*[@class=\"android.widget.EditText\"]"));
XPath:content-desc 属性定位
元素可以通过 content-desc 定位。
格式:
//*[@content-desc='content-desc 属性']
示例代码:
- Python 版本
driver.find_element((By.XPATH,\
'//*[@content-desc="搜索"]')
- Java 版本
driver.findElement(By.xpath(\
"//*[@content-desc=\"搜索\"]");
uiautomatorviewer介绍
使用 Android SDK(sdk/tools/uiautomatorviewer)路径下自带的 uiautomatorviewer 工具也可以抓取当前页面的元素。
提前配置 sdk/tools/ 路径到环境变量 $PATH 中,直接在命令行输入下面的命令:
uiautomatorviewer
可以打开下面这样一个页面,点击页面左上角第二个图标(Android 手机图标),就可以获取下面的 uiautomatorviewer 快照图:
1066×756 158 KB
uiautomatorviewer 抓取快照展示出来的元素属性是经过解析的,如果想要查看 XML DOM 的真实结构可以打印 pagesource ,得到的内容如下,红色框起来的部分为上图的定位的 XML DOM 中的一个节点:
975×299 55.5 KB
通过图片分析,android.widget.TextView 是文本类型的节点,其中包含的属性信息都在上面的 uiautomatorviewer 快照图中有展示。如果只想定位 Android 系统的页面元素,可以直接使用 uiautomatorviewer,速度快并且不需要配置任何参数,直接点击获取页面的图标就可以将客户端页面抓取出来。
另外,uiautomatorviewer 只能抓取 android8 以下的版本,如果要抓取 android8 以上的版本的页面信息,可以使用 Appium Inspector 或 WEditor。
猜你喜欢
- 2024-11-14 Playwright自动化测试工具之元素定位实战
- 2024-11-14 利器 | AppCrawler 自动遍历测试实践(二):定制化配置
- 2024-11-14 java组件HuTool相关工具类的使用二
- 2024-11-14 手把手教你爬取热门小说《诡秘之主》
- 2024-11-14 Python爬虫之xpath用法全解析(py xpath)
- 2024-11-14 怎么用xpath写drissionpage?或者用相对位置?
- 2024-11-14 通过python+Xpath实现抓取某网站推荐的歌曲
- 2024-11-14 Python自动化工具(python写自动化工具)
- 2024-11-14 web自动化测试——xpath常用案例(web自动化测试平台)
- 2024-11-14 手把手教你如何用Python爬取网站文本信息
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 505℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 484℃MySQL service启动脚本浅析(r12笔记第59天)
- 465℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 462℃启用MySQL查询缓存(mysql8.0查询缓存)
- 442℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 422℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 418℃MySQL server PID file could not be found!失败
- 最近发表
-
- netty系列之:搭建HTTP上传文件服务器
- 让deepseek教我将deepseek接入word
- 前端大文件分片上传断点续传(前端大文件分片上传断点续传怎么操作)
- POST 为什么会发送两次请求?(post+为什么会发送两次请求?怎么回答)
- Jmeter之HTTP请求与响应(jmeter运行http请求没反应)
- WAF-Bypass之SQL注入绕过思路总结
- 用户疯狂点击上传按钮,如何确保只有一个上传任务在执行?
- 二 计算机网络 前端学习 物理层 链路层 网络层 传输层 应用层 HTTP
- HTTP请求的完全过程(http请求的基本过程)
- dart系列之:浏览器中的舞者,用dart发送HTTP请求
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)