• 干货|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 请求:

    1. # 使用 curl 命令发送一个 http POST 请求, 带着 -d 后面的参数,也就是 Desired Capability 设置
    2. # 创建一个Session
    3. curl 'http://127.0.0.1:4723/wd/hub/session' \
    4. -XPOST -H "Content-Type: Application/JSON" \
    5. -d '{"capabilities":{value}}'
    6. # 建立连接之后 获取 Session-id
    7. session_id=$(curl 'http://127.0.0.1:4723/wd/hub/sessions' \
    8. | awk -F\" '{print $6}')
    9. # 使用curl命令 模拟通过 id 定位
    10. curl "http://127.0.0.1:4723/wd/hub/session/${session_id}/element" \
    11. -H "Content-Type: Application/JSON" \
    12. -d '{"using":"id","value":"user_profile_icon"}'

    运行结果如下:

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

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

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

  • 相关阅读:
    文件操作和IO
    【LeetCode 每日一题】15. 三数之和
    【SSL集训DAY1】C【暴力】【数学】
    分布式任务调度Schedulerx2.0 Map模型作业执行流程
    技术分享 | 专项测试技术初识Hook
    使用JMX监控ZooKeeper和Kafka
    文件操作及IO(java)
    Jupyter Notebook,学习python数据科学最好的学习开发环境
    HOC示例
    使用Docker安装MySQL5.7.36
  • 原文地址:https://blog.csdn.net/cebawuyue/article/details/127609426