软件测试 | 测试开发 | 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 模板:

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

w3c.github.io

WebDriver

WebDriver is a remote control interface that enables introspection and control of user agents. It provides a platform- and language-neutral wire protocol as a way for out-of-process programs to remotely instruct the behavior of web browsers.

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

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

bash 复制代码
# 使用 curl 命令发送一个 http POST 请求, 带着 -d 后面的参数,也就是 Desired Capability 设置
# 创建一个Session
curl 'http://127.0.0.1:4723/wd/hub/session' 
-XPOST -H "Content-Type: Application/JSON" 
-d '{"capabilities":{value}}
# 建立连接之后 获取 Session-id
session_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"}'

运行结果如下:

rust 复制代码
# 创建 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有没有更深一步的认识了呢?

更多资料

相关推荐
九英里路5 小时前
protobuf快速上手
网络·c++·中间件·json·谷歌·序列化·protobuf
wuyk55518 小时前
Spider-第09讲-三格式落盘CSV-Excel-JSON
爬虫·python·json·excel
wuyk5552 天前
Spider-第07讲-JSON接口与正则提取
爬虫·python·json
xbzb4 天前
镜像到底存在哪:/var/lib/docker 的四级映射与 daemon.json 配置
docker·容器·json·镜像·daemon.json·四级
坤坤子吖5 天前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
code2cat5 天前
【随笔】结构化输出:JSON格式过关,业务数据就能入库吗
json·大语言模型
Hello_Pyhx9 天前
NWinfo 导出 Windows 硬件信息:从 JSON 报告到缺项排查
windows·json
程序员大阳9 天前
副队长JavaScript教程(66)-本地存储实战:待办事项网页的开发
javascript·json·实战·待办事项·本地存储·案例
视觉小萌新10 天前
AI Class 3 · Chapter 2-3:函数、异常、文件读写+JSON / JSONL 读写(小白版)
人工智能·python·json
翊众建站11 天前
用 JSON-LD 给企业官网做结构化数据:LocalBusiness 与 FAQPage 实践笔记
人工智能·搜索引擎·json