Appium appium 的技术架构

cmlanche · 2019年04月11日 · 最后由 cmlanche 回复于 2019年07月08日 · 2000 次阅读

appium 是基于 nodejs 来打包、发布的,也用它来管理各个 driver,如下图所示,它的结构图如下:

image-20190411154231747

从上图就可以看到:android 的自动化比 iOS 的要难多了!

appium 主程序,依赖各个 driver 程序,其中,安卓的自动化有 3 个 driver,分别是:

  1. appium-android-driver - 用于驱动 UIAutomator1
  2. appium-uiautomator2-driver - 用于驱动 UIAutomator2
  3. appium-espresso-driver - 用于驱动 Espresso

列个表对比一下:

功能\Driver appium-android-driver appium-uiautomator2-driver appium-espresso-driver
用途 驱动 UIAutomator1 驱动 UIAutomator2 驱动 espresso
automationName UiAutomator1 UiAutomator2 Espresso
包形式 AppiumBootstrap.jar appium-uiautomator2-server-v${version}.apk TODO 待研究
包依赖地址 bootstrap/bin/ appium-uiautomator2-server/apks/ TODO
优点 jar 包形式,免安装,一个命令直接启动,权限级别是 shell 级别 官方推荐使用 2,对高版本兼容性好 控件识别能力强
缺点 对高版本兼容性差,容易无法识别控件 apk 形式,需要安装 apk 形式,需求安装,并且是侵入式的,可能带来风险
Server 模块 在相同工程中,Bootstrap 目录,maven 工程,主要目标是在 bin 目录下输出 AppiumBootstrap.jar 不同工程,单独的另外一个 Nodejs 工程:appium-uiautomator2-server 相同 Nodejs 工程,espress-server 目录,gradle 工程

附:AppiumBootstrap.jar 的打包过程:https://zhuanlan.zhihu.com/p/61213093

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 27 条回复 时间 点赞

用开源框架有个通病,就是有些框架自身就有问题,无论你外部怎么封装,都是无法克服的。

当然封装也是一个必要做的事情,如果发现封装无法解决,那么就要考虑是不是它本身就有问题了

cmlanche 回复

感谢老师的回复。现在我还不具备自己开发工具的能力。 现在的需求不会像 testin 那样兼容很多 app 和机型,只需要把公司目前的几款 app 的主流程跑起来。
我先按照老师说的,先去了解下基本的工作原理。
目前的困惑是:写个脚本跑起来没什么困难,就是想封装些通用的方法,写成更灵活、通用的框架形式,这方面不知道如何下手。

appium 自身有很多问题,我都准备弃了,有能力就自己开发。

当用来学习 ui 自动化技术还是不错的范例,学习建议就是要先了解 UIAutomator 的原理和适用性,其他技术方案如 Robotium、espresso 等都要吃透原理,知道各种不同的技术能测什么不能测什么

至于小白现在是什么水平,还不太清楚,我也不知道你们掌握什么样的程度就可以完成自动化任务,我之前在 testin,做的 UI 自动化面向的是任何 app,它面临的问题的复杂程度是很难的,因为你得去兼容任何 app,任何手机,绝大部分公司做 UI 自动化根本不需要像 testin 这样考虑这么多,做自己家的 APP 的自动化可以有很多独特手段来规避一些业界难题。

楼主能给初步开始学习 appium 的小白一些学习方法、步骤的建议吗? 感谢!

cmlanche 回复

嗯,好久没来了,谢谢

博客:https://cmlanche.com
知乎专栏:https://zhuanlan.zhihu.com/custom-appium 自定义 appium,你都可以关注

30楼 已删除
zhouxiaofu 回复

关键还是 xpath 写的有问题吧,可以直接打开一个 chrome 网页,模拟调试,看怎样的 xpath 是只获取你所说的子元素,屏蔽孙元素(我也不会写😀

大神你好有个问题请教一下,百度查了很多都没找到解决办法。
appium 父元素通过 findElements(By.xpath("//android.view.View")) 获取到的元素集合是所有子孙元素,怎样才能只获取子元素不获取孙元素?

之前在 testin,对这俩货做了深入的改造

老深入了,国内应该没几个人比我更了解了

19楼 已删除
jsonxia 回复

没有精力维护

Karaser 回复
  1. 是的
  2. 可以直接调用,一样,有提供接口,但不建议使用,直接使用 appium 就好
  3. 跟驱动使用无非就是在指定位置找 jar 或者 apk 包,安装使用

棒棒棒呢,楼主,几个问题
1、所以 appium 会根据真实的安卓版本选择不同的驱动是吗?
2、所以我们可以直接调用 AppiumBootstrap.jar,跟 UIAutomator1 是一样的?这个 jar 包有对外提供接口吗?
3、nodejs 是怎么和驱动交互的,第一种驱动是个 jar 包,nodejs 是怎么调用的呢?

题主可以建个群,一起交流下

Dorom 回复

desired_caps ["automationName"] = "uiautomator2" 改为 UiAutomator2

Dorom 回复

控件没找到,最后超时了吧

如果文章再完整一些,可以加个精华

仅楼主可见

太久没用 appium 了,现在都集成了 espresso?

感谢分享

codeskyblue 回复

这方面确实是,不过 iOS 设备少,适配方面好弄点

其实实施起来最复杂的是 iOS,环境搭建难。而且选择的余地少,只有 WDA

虽然看不懂但是支持楼主

赞!支持楼主!

文贤平 回复

谢谢,但是感觉没人看,感觉国内深度研究 appium 的很少,绝大多数都是浅层次的使用,UIAutomator1、UIAutomator2、espresso 都区分不了,更是用不上

很不错的分享,期待楼主持续更新

low

28楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册