源代码层面分析Appium-inspector工作原理

news2024/11/17 6:56:12

Appium-inspector功能

  Appium Inspector 基于 Appium 框架,Appium 是一个开源工具,用于自动化移动应用(iOS 和 Android)和桌面应用(Windows 和 Mac)。Appium 采用了客户端-服务器架构,允许用户通过客户端(例如 Appium Inspector)与 Appium 服务器通信,以自动化测试应用程序。主要用这个工具来查找获取元素的locator,提升mobile UI自动化测试效率。

  Appium-inspector的界面如下图所示,在界面上可以点击app页面元素,左边会显示被选择元素的selector,在app source的具体位置等信息。

Appium-inspector工作原理

Appium-inspector的工作流程大致可以分为如下四个部分
连接移动设备或模拟器:Appium Inspector 连接到目标移动设备或模拟器。可以是物理设备,也可以是虚拟设备(模拟器或仿真器)。
启动移动应用:Appium 服务器接收客户端(Appium Inspector)的指令,通过相应的驱动(如 uiautomator2 驱动用于 Android,XCUITest 驱动用于 iOS),启动目标移动应用。
获取应用页面源代码:一旦应用启动,Appium 服务器通过驱动与移动设备或模拟器通信,获取当前页面的源代码(DOM 树),包括所有 UI 元素及其属性。这个页面源代码通常以 XML 格式表示。
展示 UI 元素:Appium Inspector 将获取到的页面源代码解析并展示在图形界面上。用户可以在 Appium Inspector 中看到当前应用页面的结构、元素的层次关系,以及每个元素的属性(如 resource-id、class、text 等)。
生成 Locator:用户在 Appium Inspector 中可以选择某个 UI 元素,Appium Inspector 会根据该元素的属性生成唯一的定位符(Locator)。这些 Locator 可以用来在自动化脚本中定位和操作该元素。常见的 Locator 类型包括:ID、XPath、Class Name、Accessibility ID 等。

Appium-inspector如何显示mobile app UI

  在appium inspector上面,可以加载显示mobile app应用页面,这个是如何实现的呢?实际appium inspector是通过截图来显示app页面UI的,实现这个过程主要有四个步骤       

截图获取: Appium Inspector使用Appium Server通过WebDriver协议与移动设备建立连接。一旦连接建立,Inspector会向设备发送命令以获取当前应用的屏幕截图。

截图传输: 设备收到命令后,会执行截图操作,并将截图数据传输回Appium Server。这通常是以base64编码的图像数据的形式返回。

解码和展示: Appium Server接收到截图数据后,会对其进行解码,并在Inspector界面中展示。Inspector本身会使用相关的图像处理技术,如将base64编码的图像数据解析为可见的图像。

图像渲染: 解码后的图像在Inspector界面中进行渲染,以显示移动应用的当前界面。这个过程涉及将图像数据转换为可视化的UI元素,通常以实时或者轮询的方式更新截图以显示最新状态。

  当用appium-inspector连接到appium server时,可以在appium server的日志中看到如下信息,可以看到调用了appium server的接口获取screenshot信息和page source信息。screenshot就是用来显示mobile app UI的。

Appium-inspector如何生成selector

  当鼠标hover到某个元素时,appium inspector会设置元素的x,y坐标信息。有了坐标信息,就可以发送给appium server来获取页面元素信息。(需要补充修改)

Appium-inspector源码阅读

 下图是appium-inspector source code,component里面是用react写各个自定义组件,这些组件会组合到containers下面的InspectorPage.js和SessionPage.js中,其中SessionPage.js及时appium-inspector连接信息输入的界面,InspectorPage.js就是连接成功后显示source page,locator等信息的的界面。另外,这里使用了react reducers技术,在 React 应用中,useReducer 钩子是一种处理复杂状态逻辑的方式,特别是当组件状态由多个子值组成,或者当状态逻辑需要根据多种不同的动作进行更改时。

  以reducers目录下Inspector.js为例,接受action.type,来更新state信息。

   以action目录下的Inspector.js为例,文件里面定义了很多方法,主要是通过dispatch来分发动作。

  像获取整个页面的pageSource,screenshot等,是call appium server的api来获取的,这些需要与appium server进行交互的部分,都封装在callClientMethod方法里,这个方法也定义在action/Inspector.js文件中。

  除了上面的一些关键source code,当用户点击页面的某个element的时候,会在appium-inspector中显示生成的selector,这个是如何实现的呢?在utils目录下有个locator-generation.js文件,里面有getSuggestedLocactor方法,里面调用了getSimpleSuggestedLocators和getComplexSuggestedLocators方法,再将获取的locator进行对比选取合理的locator。

  SimpleSuggestedLocators方法主要是看元素信息中是否有content-desc,id,resource-id等信息,如果有这些信息,就用这些信息来生成locator。

  ComplexSuggestedLocators方法,主要是使用'-ios class chain','-android uiautomator'等来生成定义页面元素的locator。

  上面生成locator的前提是要给出选定element的相关信息,从appium-inspector中下载source page,如下图所示,source page中除了有元素的content-desc等信息外,还有个关键信息是bounds,也就是元素的坐标信息。当鼠标选中某个element的时候,可以计算得到element的坐标信息,再根据这个坐标信息从source page中获取到对应的目标元素信息。那appium-inspector是什么时候计算所选元素的坐标信息的呢?

    在component目录下的Screenshot.jsx文件中,有个handleMouseMove的方法,可以看到,当鼠标移动的时候,这里会调用setX,setY来设置坐标信息。

  以上就是Appium-inspector源码部分解读,可以看到Appium源码理解可以分为下面7部分

1:使用react来构建appium-inspector的UI,主要保卡session页面和inspector页面。

2:使用了react的reducer来管理复杂的状态信息,对于涉及异步调用的部分,还使用了redux thunk。

3:需要与appium server交互的部分,都封装在clientMethod中。

4:inspector界面显示的app UI是通过调用appium server api,获取到app的截图信息,然后通过截图显示来实现app UI展示的。

5:inspector界面的page source也是调用appium server的api获取的。

6:获取的page source里面包含每个页面元素的坐标信息,当鼠标move到某个元素上面时,会设置元素的x,y坐标信息,这样当选中某个元素的时候,可以通过坐标信息,获取目标元素在page source中的所有信息

7:获取到元素信息后,封装了一些方法来生成locator,主要包括简单locator生成和复杂locator生成。实际只通过坐标获取到当前元素属性信息,还无法直接生成所有的locator,在source code的utils目录下有个source-parsing文件,即把xml格式的page source信息转换成JSON格式的信息,有了JSON格式的数据,才能通过当前元素查找这个元素的父亲元素,从而生成完善的locator信息,生成locator信息后,还可以调用appium-server的api确定这个locator是否是正确和唯一的。

  以下图为例,当选中左边的username input输入框的时候,右边的locator有两种方式,第一种是通过id查找element,第二种是通过xpath查找element。当确定了selector后,appium-inspector会调用appium server的api来确认是否能查找到元素。

  如下图所示,是inspector调用apppium server的api的截图信息,当输入id的信息,调用接口时,返回了‘no such element’,当输入xpath信息,调用接口,返回的element的信息,返回的状态码也是200,说明匹配到元素。

xml格式转换成json格式

  Appium-inspector中,当获取到xml格式的page source后,还调用了util里面的parsing方法将xml格式转换成json格式的page source,source code内容如下图所示:

  这个方法的作用就是将xml格式的page source转换成JSON格式,转换后,就可以检索获取当前element的层级信息了,便于生成xpath信息。假设输入的xml格式的source如下图所示:

  调用方法后,生成的JSON格式的内容如下图所示:可以看到,在json格式数据中,可以通过path信息,计算出所有元素之间的层级关系。

{
  "children": [
    {
      "children": [
        {
          "children": [],
          "tagName": "title",
          "attributes": {
            "lang": "en"
          },
          "path": "0.0"
        },
        {
          "children": [],
          "tagName": "author",
          "attributes": {},
          "path": "0.1"
        },
        {
          "children": [],
          "tagName": "year",
          "attributes": {},
          "path": "0.2"
        },
        {
          "children": [],
          "tagName": "price",
          "attributes": {},
          "path": "0.3"
        }
      ],
      "tagName": "book",
      "attributes": {
        "category": "children"
      },
      "path": "0"
    },
    {
      "children": [
        {
          "children": [],
          "tagName": "title",
          "attributes": {
            "lang": "en"
          },
          "path": "1.0"
        },
        {
          "children": [],
          "tagName": "author",
          "attributes": {},
          "path": "1.1"
        },
        {
          "children": [],
          "tagName": "year",
          "attributes": {},
          "path": "1.2"
        },
        {
          "children": [],
          "tagName": "price",
          "attributes": {},
          "path": "1.3"
        }
      ],
      "tagName": "book",
      "attributes": {
        "category": "web"
      },
      "path": "1"
    }
  ],
  "tagName": "bookstore",
  "attributes": {},
  "path": ""
}

   以上就是整个appium-inspector实现原理的梳理和总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1892016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BNO055 智能传感器

型号简介 BNO055是博世(bosch-sensortec)的一款系统级封装 (SiP) 解决方案,集成了三轴 14 位加速度计、精确的闭环三轴 16 位陀螺仪、三轴地磁传感器和运行 BSX3.0 FusionLib 软件的 32 位微控制器。这款智能传感器比同类解决方案小得多。通过…

JAVA 获取客户端信息工具类

获取客户端信息工具类 import com.wangyao.common.constant.ConstantNumeral; import jakarta.annotation.Nullable; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j;import java.io.IOEx…

一文了解微服务架构路线

为什么选择微服务架构? 众所周知,单体应用程序,由于其种种不足,几乎不支持敏捷方法。如果你想为一个大型或复杂的业务创建一个软件项目,最好从微服务架构开始。 微服务架构是一种灵活的架构,可以显著性地提…

阿里云 ECS 服务器的安全组设置

阿里云 ECS 服务器的安全组设置 缘由安全组多个安全组各司其职一些常见的IP段百度 IP 段华为云 IP 段搜狗蜘蛛 IP 段阿里云 IP 段 。。。 缘由 最近公司规模缩减,原有的托管在 IDC 机房的服务器,都被处理掉了,所有代码都迁移到了阿里云的云服…

手机图库照片删除如何找回?别再捶胸顿足,用这3招恢复

手机和电脑中的照片越来越多,人们在浏览照片时,可能会不小心删除一些重要的照片。这些照片可能是旅行中的风景照、与家人朋友的合影,甚至是一些具有纪念意义的照片。一旦删除,我们可能就无法找回这些照片了。因此,图库…

【postgresql】索引

见的索引类型: B-tree 索引:这是最常用的索引类型,适用于大多数查询。B-tree索引可以高效地处理范围查询。 Hash 索引:适用于等值查询,但不支持范围查询。 GiST 索引:通用搜索树(GiST&#xf…

ELISA实验前,需要做好哪些准备?

进行ELISA试剂盒实验前,需要进行周密的准备工作以确保实验的顺利进行和实验的准确性。那么,具体应该做哪些准备呢?欣博盛生物为您总结了一些关键的准备工作步骤: 1. 阅读说明书 仔细阅读ELISA试剂盒的说明书,了解试剂…

CANoe的capl调用Qt制作的dll

闲谈 因为Qt封装了很多个人感觉很好用的库,所以一直想通过CAPL去调用Qt实现一些功能,但是一直没机会(网络上也没看到这方面的教程),这次自己用了两天,踩了很多坑,终于是做成了一个初步的调用方…

AI大模型深度学习:理论与应用全方位解析

背景 在当前技术环境下,AI大模型学习不仅要求研究者具备深厚的数学基础和编程能力,还需要对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法,AI大模型学习能够不断提升模型的准确性和效率,为人类生活和工作带来更多…

wordpress企业网站模板免费下载

大气上档次的wordpress企业模板,可以直接免费下载,连注册都不需要,网盘就可以直接下载,是不是嘎嘎给力呢 演示 https://www.jianzhanpress.com/?p5857 下载 链接: https://pan.baidu.com/s/1et7uMYd6--NJEWx-srMG1Q 提取码:…

基于Java中的SSM框架实现高校学生请假管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现高校学生请假管理系统演示 摘要 社会经济的快速发展带来了各行各业都在推进计算机网络技术的应用。而在各行各业中,教育业又显得尤为重要,因为学生是祖国的未来。计算机网络技术也在逐步的在教育业取代原有的传统教育模式。但是…

Java [ 基础 ] HashMap详解 ✨

目录 ✨探索Java基础 HashMap详解✨ 总述 主体 1. HashMap的基本概念 2. HashMap的工作原理 3. HashMap的常用操作 4. HashMap的优缺点 总结 常见面试题 常见面试题解答 1. HashMap的底层实现原理是什么? 2. 如何解决HashMap中的哈希冲突?…

Simulink 模型生成 C 代码(四):比较模型仿真和生成代码的结果

接下来将验证生成的代码执行时在数值上等效于 Simulink 中建模的算法。您使用测试框架模型在普通模式下对 RollAxisAutopilot 进行仿真,并在 SIL 模式下进行仿真,然后使用仿真数据检查器比较这两个仿真。 要测试生成的代码,您可以运行软件在…

实验六 智能停车系统设计 (综合类)含源码 福利

某停车场停车费用计算规则如下: ①每小时 10 元,不足 1 小时的部分按照 1 小时计算; ②超过 8 小时,未超过 24 小时的按照 8 小时计算; ③超过 24 小时,超过部分按照上述标准重新计算。 本程序的任务是模拟一个智能停车管理系统,…

qt5.15关于qradiobutton遇到的坑

前言 不知道是只有我遇到了,还是qt本身就存在这个bug 当将2个qradiobutton放入到一个布局内,然后进行来回切换,若无数据刷新的情况下,切换无异常,当窗体内有数据开始刷新了,则点击其中一个qradiobutton&am…

考PMP一定要报培训班么?

曾有自学PMP想法学员分享:不如选择性价比高通过率高的PMP项目管理培训机构威班PMP 其实参加PMP考试如果非要自学也能参加考试的,只是需要找一个能卖给你35学时的机构,也只有PMI授权的PMP机构能开具35学时证明,这种生意也只有小机…

工厂自动化相关设备工业一体机起到什么作用?

在当今的制造业领域,工厂自动化已成为提高生产效率、保证产品质量和降低成本的关键。在这一进程中,工业一体机作为一种重要的设备,发挥着不可或缺的作用。 工业一体机是自动化生产线上的控制中心。它能够整合和处理来自各个传感器、执行器和其…

Hadoop3:集群压测-读写性能压测

一、准备工作 首先,我们要知道,平常所说的网速和文件大小的MB是什么关系。 100Mbps单位是bit;10M/s单位是byte ; 1byte8bit,100Mbps/812.5M/s。 测试 配置102、103、104虚拟机网速 102上用Python开启一个文件下载服务&#x…

没有找到openslide-win64xxxx文件 ! ! ! (openslide-python安装教程)

各位小伙伴大家好,今天给大家带来教程:openslide-python安装 说实话这个库我之前也没有用到过,然后今天代码需要,就安装了一下 但是在import openslide的时候报错,找了很多教程 说句心里话:那些教程都是…

又一个被催的相亲对象!家庭不和,是因为智慧不够?——早读(逆天打工人爬取热门微信文章解读)

你相亲过吗? 引言Python 代码第一篇 洞见 家庭不和,是因为智慧不够第二篇 口播结尾 引言 yue 昨天居然忘记了 正事:拍视频j 居然忘记了 别着急 让我找下理由(借口) 前天我妈给我介绍了个相亲对象 推给我了她的微信 我…