霍格沃兹测试开发学社

《Python测试开发进阶训练营》(随到随学!)
2023年第2期《Python全栈开发与自动化测试班》(开班在即)
报名联系weixin/qq:2314507862

干货|app自动化测试之Appium 原理 与 JsonWP 协议分析

本文节选自霍格沃兹测试学院内部教材

想要使用 Appium 进行测试,那么就一定要先了解Appium的原理。Appium 不仅能够实现移动端的 JSONWP,并且延伸到了 Selenium 的
JSONWP,它能够控制不同移动设备的行为,例如通过会话安装和卸载 APP。

Appium 原理

图中依赖关系解释:

  • 可以使用 Java、Python 语言编写测试脚本

  • 通过 Appium 服务去驱动不同设备执行自动化测试

  • Android APP 使用 UiAutomator 驱动,iOS APP 使用 WebDriverAgent 驱动

  • ADB 用来驱动 AdbServer

  • ChromeDriver 可以用来直接与 AdbServer 进行通讯,也可以远程调试 Chrome、WebView 及微信小程序

  • AppCrawler 开源框架也是利用 Appium Server 的服务来完成自动化遍历测试

JsonWP协议分析

JSON wire protocol(JSONWP)是 WebDriver 开发者编写的一种通信协议。这个通信协议是一个预定义的特殊设置,通过
RESTful API 暴露标准端口。

下面看一段 Appium 日志:

图中发送一个 POST 请求,请求格式为/session/{session id}/element,Webdriver
解析到需要定位的元素,就会转成手机端能够识别的定位元素的指令,去手机端定位到这个元素。

下面是一些用来连接移动应用 URI 模板:

更详细的模板信息可以参考下面的链接:

https://w3c.github.io/webdriver/

上表中的命令均可在移动端调用,比如使用 curl 命令手工模拟发送请求给 Appium,Session id
可以在浏览器访问http://127.0.0.1:4723/wd/hub/sessions,查看有哪些 session。

下面使用 curl 命令,在 Appium 上创建一个 session,然后利用这个 session 发送 find element 请求:


# 使用 curl 命令发送一个 http POST 请求, 带着 -d 后面的参数,也就是 Desired Capability 设置# 创建一个Sessioncurl 'http://127.0.0.1:4723/wd/hub/session' \-XPOST -H "Content-Type: Application/JSON" \-d '{"capabilities":{value}}'# 建立连接之后 获取 Session-idsession_id=$(curl 'http://127.0.0.1:4723/wd/hub/sessions' \ | awk -F\" '{print $6}')# 使用curl命令 模拟通过 id 定位curl "http://127.0.0.1:4723/wd/hub/session/${session_id}/element" \ -H "Content-Type: Application/JSON" \-d  '{"using":"id","value":"user_profile_icon"}'
  • -d 表示传入的参数
  • -H 加入请求头

运行结果如下:


# 创建 Session$ curl -l -H "Content-type: application/json" -X POST -d \'{"desiredCapabilities":{"platformName": "Android",\"deviceName": "192.168.56.101:5555","platformVersion": \"6.0","appPackage": "com.xueqiu.android","appActivity": \"com.xueqiu.android.common.MainActivity"}}'  \'http://127.0.0.1:4723/wd/hub/session'  
# 上面命令的结果{"value":{"platform":"LINUX","webStorageEnabled":false,\"takesScreenshot":true,"javascriptEnabled":true,\"databaseEnabled":false,"networkConnectionEnabled":\true,"locationContextEnabled":false,"warnings":{},\"desired":{"platformName":"Android","deviceName":\"192.168.56.101:5555","platformVersion":"6.0",\"appPackage":"com.xueqiu.android","appActivity":\"com.xueqiu.android.common.MainActivity"},"platformName":\"Android","deviceName":"192.168.56.101:5555","platformVersion":\"6.0","appPackage":"com.xueqiu.android","appActivity":\"com.xueqiu.android.common.MainActivity","deviceUDID":\"192.168.56.101:5555","deviceApiLevel":23,"deviceScreenSize":\"1080x1920","deviceScreenDensity":420,"deviceModel":\"Google Nexus 5X","deviceManufacturer":"Genymotion",\"pixelRatio":2.625,"statBarHeight":63,"viewportRect":{\"left":0,"top":63,"width":1080,"height":1731}},"sessionId":"1c0bda0f-1a60-4cab-8fe3-f7ee5a6c005b",\"status":0}%  
# 获取 Session id$ session_id=$(curl 'http://127.0.0.1:4723/wd/hub/sessions' \    | awk -F\" '{print $6}')  
# 定位元素$ curl "http://127.0.0.1:4723/wd/hub/session/${session_id}/element" \-XPOST -H "Content-Type: Application/JSON" \-d  '{"using":"id","value":"com.xueqiu.android:id/tv_search"}'  
# 获取结果{"value":{"element-6066-11e4-a52e-4f735466cecf":\"ddd0261e-fff0-4642-b24d-bf64a708c916","ELEMENT":\"ddd0261e-fff0-4642-b24d-bf64a708c916"},"sessionId":\"1c0bda0f-1a60-4cab-8fe3-f7ee5a6c005b","status":0}%

上面的运行过程分析,首先使用 curl 命令创建一个 Session,然后获取到 session id 存到 session_id 这个变量中,最后通过
curl 发送一个 HTTP 请求完成首先搜索框的查找。

此时大家对Appuim有没有更深一步的认识了呢?

** _
来霍格沃兹测试开发学社,学习更多软件测试与测试开发的进阶技术,知识点涵盖web自动化测试 app自动化测试、接口自动化测试、测试框架、性能测试、安全测试、持续集成/持续交付/DevOps,测试左移、测试右移、精准测试、测试平台开发、测试管理等内容,课程技术涵盖bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相关技术,全面提升测试开发工程师的技术实力
QQ交流群:484590337
公众号 TestingStudio
点击获取更多信息

posted @   霍格沃兹测试开发学社  阅读(261)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示