• Appium基础教程


    目录

    Appium简介

    Appium是一款开源的Appium自动化工具, 基于Webdriver协议, 主要有以下3个特点:

    1. 全能: 支持iOS/Andorid/H5/混合App/WinApp
    2. 通用: 支持Win/Linux/Mac, 支持Java/Python/Ruby/Js/PHP等各种语言
    3. 开源: 免费

    App自动化测试工具对比

    iOS

    官方:

    • Uiautomation/XCUITest: 白盒, UI测试, JS
      其他:
    • FastMonkey: 性能(仿Monkey), 张钊

    Andorid

    官方:

    • Uiautomator/Uiautomtor2: UI测试, Java
    • Monkey: app性能/稳定性测试, 随机操作
    • MonkeyRunner: UI测试, Jpython, 只能通过坐标定位
    • Robotium: 白盒, UI测试, Java, 支持Webview/Toast/menu/Dialog等, 无法跨进程
    • Espresso: 官方推荐扩展测试包, 白盒,ui, 一般开发自测使用
    • CTS: 兼容性测试, Java

    其他:

    • Python-Uiautomotor2: UI测试, 使用简单, 支持无线连接设备及使用weditor查看元素定位
    • Adb-For-Test/adb-For-Robotium: 个人, 基于adb命令的封装

    多平台支持

    • Calabash: iOS/Andriod/混合app, Ruby, BDD模式, Api丰富
    • Appium: iOS/Andriod/混合app/H5, Java/Python/Ruby/JS..
    • Macaco: 阿里基于Appium进行的精简封装的一套框架, 支持Electron应用, 包含app-inspector和ui-recorder, 统一了iOS/Android操作的Api, 目前坑比较多, 环境搭建较麻烦
    • Airtest(ATS): 网易推出的一款基于截图对比的App自动化测试工具, 可用于App游戏UI测试, 支持iOS/Android

    云平台

    • Sauce Labs: Appium官方推荐, 应用最广的云测平台, 收费
    • Testin/腾讯云测等: 国内云平台, 收费
    • OpenSTF: 开源手机集群管理平台, 免费

    Appium实现原理

    Andorid(uiautomator)
    image

    1. 调用Android adb完成基本的系统操作
    2. 向Android上部署bootstrap.jar
    3. bootstrap.jar Forward Android的端口到PC机器上
    4. PC上监听端口接收请求,使用webdriver协议
    5. 分析命令并通过forward 端口发给bootstrap.jar
    6. bootstrap.jar接收请求并把命令发给uiautomator
    7. ui automator执行命令

    Andorid-uiautomator2-driver: bootstrap.jar改为使用uiautomato2 server apk, 使用netty server代替原来的websocket与PC端通信

    iOS

    1. client端 依然是 test script是我们的webdriver测试脚本。
    2. 中间是起的Appium的服务,Appium在服务端起了一个Server(4723端口),跟selenium Webdriver测试框架类似, Appium⽀持标准的WebDriver JSONWireProtocol。在这里提供它提供了一套REST的接口,Appium Server接收web driver client标准rest请求,解析请求内容,调⽤用对应的框架响应操作。
    3. appium server调用instruments.js 启动⼀一个socket server,同时分出一个⼦子进程运⾏instruments.app,将bootstrap.js(一个UIAutomation脚本)注⼊入到device⽤于和外界进行交互
    4. 最后Bootstrap.js将执行的结果返回给appium server
    5. appium server再将结果返回给 appium client。

    环境搭建

    • 安装JDK, 配置环境变量
    • 安装Android SDK, 配置环境变量
    • 安装Appium-Windows-Desktop
    • 安装Appium-Python-Client
    • 安装模拟器

    Mac Android/iOS环境搭建

    Andorid介绍

    基本架构

    常见布局/视图

    • 线性布局: LinerLayout
    • 相对布局: RelativeLayout
    • 帧布局: FrameLayout, 叠放
    • 普通视图: View
    • 切换视图: ListView, 注意, 其中的元素会动态变化

    HierarchyViewer, uiautomatorviewer

    基本控件

    • TextView: 文本
    • Button: 按钮
    • EditText: 输入框
    • ImageView: 图片
    • 其他: Alert(警告框)/Toast(提示消息)/SeekBar(滑块)/Webview(嵌入网页)

    控件常见属性

    • index: 索引, 用于排序

    • text: 控件名称(显示文本)

    • resource-id: 资源id

    • class: 控件类型(文本/按钮/输入框等)

    • content-desc: 控件描述

    • package: 所属包(一个包就是一个apk)

    • enabled: 是否可用

    • clickable: 是否可点击

    • focused: 是否聚焦状态

    • bounds: 坐标

    Adb命令基础

    Andorid sdk介绍

    • add-ons: 附加库
    • build-tools: 编译工具
    • platform: 各版本sdk
    • platforms-tools: 平台通用工具, 如adb
    • tools: 常用工具

    Adb介绍

    Adb(Android Debug Bridge): Andoid设备调试桥梁, 可以再PC端通过命令调试Android设备, 如获取设备状态, 安装/卸载app, 上传/下载文件等操作

    Adb常用命令

    开启/关闭服务

    • adb start-server: 开启服务
    • adb kill-server: 关闭服务

    连接设备/获取连接状态(自动开启服务)

    • adb connect/disconnect 设备名或uuid: 连接/断开连接设备
    • adb devices: 查看连接的设备

    安装/卸载app

    • adb install 安装包路径.apk
    • adb uninstall apk包名

    通过uiautomatorviewer可以获取获取apk包名

    上传/下载文件

    • 上传: adb push 本地文件 设备目录
    • 下载: adb pull 设备文件 本地目录
    adb push 1.txt /sdcard/
    adb pull sdcard/1.txt .
    

    adb shell: 可用于查看设备中的文件, exit退出

    强大的adb shell

    • pm: 应用及权限管理 adb shell pm list packages
    • am: Activity操作 adb shell am start -n 包名/包名.主Activity名
    • input: 模拟按键/输入
      • 点击(触控)指定坐标: adb shell input tap 50 250
      • 输入文字: adb shell input text hello
      • 按键: adb shell input keyevent 3
      • 滑动: adb shell input swipe 300 1000 300 500
    • logcat: 日志查看及过滤(问题定位)
    • monkey: 性能/稳定性测试
    • dumpsys: 性能分析
    • screencap: 截图 adb shell screencap -p /sdcard/01.png
    • screenrecord: 录屏 adb shell screenrecord --time-limit 10 /sdcard/demo.mp4

    使用aapt获取包名, 主Activity(aapt位于Androidsdk/build-tools下)

    aapt dump badging app-debug.apk
    
    package: name='com.lqr.wechat'
    ...
    launchable-activity: name='com.lqr.wechat.ui.activity.SplashActivity'
    ...
    

    name中包含 包名.主Acitivty名

    示例:

    配合uiautomatorviewer查看元素坐标, 使用bounds中x,y的平均值, 屏幕分辨率1280*760, 滑动时可取平均值

    • 安装高仿微信app
    • 启动app
    • 点击登录按钮
    • 输入18010181267
    • 按TAB键
    • 输入123456
    adb install app-debug.apk
    adb am start -n com.lqr.wechat/com.lqr.wechat.com.lqr.wechat.ui.activity.SplashActivity
    adb shell input tap 170 1197
    adb shell input text 18010181267
    adb shell input keyevent KEYCODE_TAB
    adb adb shell input tap 360 498
    adb shell input swipe 700 540 10 540  # 滑动时离开一定边界
    adb shell screencap -p /sdcard/01.png
    adb shell input keyevent 3 # 按HOME键
    adb pull /sdcard/01.png .  # 下载图片
    

    支持的KEYCODE

    • 0 --> "KEYCODE_UNKNOWN"
    • 1 --> "KEYCODE_MENU"
    • 2 --> "KEYCODE_SOFT_RIGHT"
    • 3 --> "KEYCODE_HOME"
    • 4 --> "KEYCODE_BACK"
    • 5 --> "KEYCODE_CALL"
    • 6 --> "KEYCODE_ENDCALL"
    • 7 --> "KEYCODE_0"
    • 8 --> "KEYCODE_1"
    • 9 --> "KEYCODE_2"
    • 10 --> "KEYCODE_3"
    • 11 --> "KEYCODE_4"
    • 12 --> "KEYCODE_5"
    • 13 --> "KEYCODE_6"
    • 14 --> "KEYCODE_7"
    • 15 --> "KEYCODE_8"
    • 16 --> "KEYCODE_9"
    • 17 --> "KEYCODE_STAR"
    • 18 --> "KEYCODE_POUND"
    • 19 --> "KEYCODE_DPAD_UP"
    • 20 --> "KEYCODE_DPAD_DOWN"
    • 21 --> "KEYCODE_DPAD_LEFT"
    • 22 --> "KEYCODE_DPAD_RIGHT"
    • 23 --> "KEYCODE_DPAD_CENTER"
    • 24 --> "KEYCODE_VOLUME_UP"
    • 25 --> "KEYCODE_VOLUME_DOWN"
    • 26 --> "KEYCODE_POWER"
    • 27 --> "KEYCODE_CAMERA"
    • 28 --> "KEYCODE_CLEAR"
    • 29 --> "KEYCODE_A"
    • 30 --> "KEYCODE_B"
    • 31 --> "KEYCODE_C"
    • 32 --> "KEYCODE_D"
    • 33 --> "KEYCODE_E"
    • 34 --> "KEYCODE_F"
    • 35 --> "KEYCODE_G"
    • 36 --> "KEYCODE_H"
    • 37 --> "KEYCODE_I"
    • 38 --> "KEYCODE_J"
    • 39 --> "KEYCODE_K"
    • 40 --> "KEYCODE_L"
    • 41 --> "KEYCODE_M"
    • 42 --> "KEYCODE_N"
    • 43 --> "KEYCODE_O"
    • 44 --> "KEYCODE_P"
    • 45 --> "KEYCODE_Q"
    • 46 --> "KEYCODE_R"
    • 47 --> "KEYCODE_S"
    • 48 --> "KEYCODE_T"
    • 49 --> "KEYCODE_U"
    • 50 --> "KEYCODE_V"
    • 51 --> "KEYCODE_W"
    • 52 --> "KEYCODE_X"
    • 53 --> "KEYCODE_Y"
    • 54 --> "KEYCODE_Z"
    • 55 --> "KEYCODE_COMMA"
    • 56 --> "KEYCODE_PERIOD"
    • 57 --> "KEYCODE_ALT_LEFT"
    • 58 --> "KEYCODE_ALT_RIGHT"
    • 59 --> "KEYCODE_SHIFT_LEFT"
    • 60 --> "KEYCODE_SHIFT_RIGHT"
    • 61 --> "KEYCODE_TAB"
    • 62 --> "KEYCODE_SPACE"
    • 63 --> "KEYCODE_SYM"
    • 64 --> "KEYCODE_EXPLORER"
    • 65 --> "KEYCODE_ENVELOPE"
    • 66 --> "KEYCODE_ENTER"
    • 67 --> "KEYCODE_DEL"
    • 68 --> "KEYCODE_GRAVE"
    • 69 --> "KEYCODE_MINUS"
    • 70 --> "KEYCODE_EQUALS"
    • 71 --> "KEYCODE_LEFT_BRACKET"
    • 72 --> "KEYCODE_RIGHT_BRACKET"
    • 73 --> "KEYCODE_BACKSLASH"
    • 74 --> "KEYCODE_SEMICOLON"
    • 75 --> "KEYCODE_APOSTROPHE"
    • 76 --> "KEYCODE_SLASH"
    • 77 --> "KEYCODE_AT"
    • 78 --> "KEYCODE_NUM"
    • 79 --> "KEYCODE_HEADSETHOOK"
    • 80 --> "KEYCODE_FOCUS"
    • 81 --> "KEYCODE_PLUS"
    • 82 --> "KEYCODE_MENU"
    • 83 --> "KEYCODE_NOTIFICATION"
    • 84 --> "KEYCODE_SEARCH"
    • 85 --> "TAG_LAST_KEYCODE"

    Appium使用

    获取app的Package和Activity

    desired_caps

    元素定位

    uiautoviewer

    • id: resource_id
    • name: text/content-desc
    • xpath:
  • 相关阅读:
    什么叫做事务
    WPF之路——Canvas布局(画布)
    Image控件Stretch属性
    C#中的委托
    简单的MVVM的实例
    如何绘制与配置2D图形界面
    wpf中 <ColumnDefinition Width="82*"/> *号表示什么,82*又是什么意思?
    Xaml技术:浅谈Grid.ColumnDefinitions和Grid.RowDefinitions属性
    SQL中Left Join 与Right Join 与 Inner Join 与 Full Join与交叉连接与自连接的区别
    Evanyou Blog 彩带
  • 原文地址:https://www.cnblogs.com/superhin/p/11454788.html
Copyright © 2020-2023  润新知