画布 1
appium 学习路线
  L1 入门
    appium 安装
      JAVA 环境
        环境搭建贴 https://ceshiren.com/t/topic/13450
        下载安装+环境变量配置
          java -version
      sdk环境
        安装 Android Studio
        使用 SDKmanager 安装 sdk
        配置 Android 环境变量
          adb --version
      appIum server
        界面版
          appium desktop
        服务版
          nodejs环境
            npm工具
            node环境
              node -v
              npm -v
          安装命令
            npm install -g appium
          安装驱动
            appium driver install uiautomator2
      Appium inspector
        推荐安装 2022 年 6 月的版本
      appium client
        pip install Appium-Python-Client
    appium 用例录制
      Appium Inspector 录制
    appium 元素定位
      id定位
      content-desc
        accessbility-id
        content-desc
      xpath 定位(重点！！！)
        //*[@属性名='属性值']
        //*[contains(@属性名, '属性值')]
      Android 原生定位
      ios 原生定位
    appium 等待方式
      强制等待 time.sleep()
      显式等待
        WebDriverWait(driver, 10, 0.5).until()
      隐式等待
        driver.implicitly_wait(time) 单位：秒
    appium desirecapbility 基本用法
      https://appium.io/docs/en/2.1/guides/caps/
      platformName
        平台类型
      appium:automationName
        Appium 驱动程序的名称
      appium:deviceName
        要自动化的特定设备的名称
      appium:appPackage
        应用包名
      appium:appActivity
        启动页面 Activity 名
      appium:noReset
        不清空缓存信息
      appium:dontStopAppOnReset
        首次启动的时候，不停止app
      appium:forceAppLaunch
        强制重新启动
      appium:skipDeviceInitialization
        跳过安装，权限设置等操作
    appium app 控件交互
      点击方法 element.click()​
      输入操作 element.send_keys(“appium”)​
      清除操作 element.clear()​
      是否可见 element.is_displayed() 返回 True/False
      是否可用 element.is_enabled() 返回 True/False​
      是否被选中 element.is_selected() 返回 True/False​
      获取属性值 get_attribute(name)​
        源码地址：https://github.com/appium/appium-uiautomator2-server/blob/master/app/src/main/java/io/appium/uiautomator2/handler/GetElementAttribute.java
        {text,name} text(返回 text)​
        {class,className} (返回 class，只有 API=>18 才能支持)​
        {resource-id,resourceId} (返回 resource-id，只有 API=>18 才能支持)​
        {content-desc,contentDescription} 返回content-desc属性
        checkable, checked,clickable, enabled, focusable, focused, {long-clickable,longClickable}, package, password, scrollable, selection-start, selection-end, selected, bounds, displayed, contentSize 返回true or false
      获取元素文本​
        格式：element.text​
      获取元素坐标​
        格式：element.location​
          结果：{'y': 19, 'x': 498} ​
      获取元素尺寸（高和宽）​
        格式 ：element.size ​
          结果：{'width': 500, 'height': 22} ​
    滑动
      swipe(startx, starty, endx, endy, duration)
  L2 进阶
    高级定位技巧
      xpath 层级定位技巧
        父结点，祖辈结点
          /../..
        兄弟结点
          /../*[@text='联系人']
          following-sibling::* 选取当前节点之后的所有兄弟结点
          preceding-sibling::* 选取当前节点之前的所有兄弟结点
        子结点
          /子结点/子结点
          /* 所有子节点
          /*[n] 第 n 个子节点，n 从 1 开始
        子孙结点
          //*
      css selector 定位(Android 原生定位 )
        1.19.1 新出的一种定位，自动转成android原生 定位
      android 原生定位
        new UiSelector().属性名("<属性值>")
          new UiSelector().text("Accessibility")
          new UiSelector().className("android.widget.TextView")
        android 滑动查找元素
      ios 原生定位
    appium desirecapbility进阶用法
      测试策略相关
        noReset
          True
            防止清空缓存
              登录过的信息会保留
          False
            清空缓存信息
              清空登录信息，需要重新登录
        fullreset
          True
            将app 卸载，重新安装
        forceAppLaunch
          True
            强制重新启动
    appium 触屏操作
      ActionChains()
  L3 应用
    PO封装
      1. 公共的方法代表页面提供的服务
      2. 不要暴露细节
      3. PO中不要有断言
      4. 页面切换需要使用 return 关键字
      5. 不要页面所有的元素，用到哪个封装哪个
      6. 相同的行为会产生不同的结果，可以封装不同方法
    测试框架优化
      基类封装
        BasePage 的封装
          driver封装
      增强功能
        find 方法
          find_and_click 方法
          find_and_sendkeys方法
        日志收集
        handle_exception 方法
    数据驱动
      测试数据的数据驱动