想要应用 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/…,查看有哪些 session。
上面应用 curl 命令,在 Appium 上创立一个 session,而后利用这个 session 发送 find element 申请:
# 应用 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"}'
运行后果如下:
# 创立 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 有没有更深一步的意识了呢?