Appium安装&启动&元素获取&API操作一条龙

Posted 写Bug的徐同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Appium安装&启动&元素获取&API操作一条龙相关的知识,希望对你有一定的参考价值。

appium安装

推荐安装教程

命令行启动

appium --address 127.0.0.1 --port 4723 --log “./log/appium.log” --log-timestamp --local-timezone --session-override

具体含义参见下文参数配置说明

手机启动参数

  • desired_caps
    负责启动服务端时的参数设置,appium server 与手机端建立会话关系时,根据这些参数服务端可以做出相应的处理
    Desired capabilities参数配置说明
    Desired capabilities官方文档
  • desired_caps常用参数
    • platformName
      平台的名称:ios, android, or FirefoxOS
    • platformVersion
      设备系统版本号
    • deviceName
      设备号 IOS:instruments -s devices,Android: adb devices
    • app
      安装文件路径:/abs/path/to/my.apk or http://myapp.com/app
      【若手机未安装可直接安装,减少人工操作】
    • appActivity
      启动的Activity
    • appPackage
      启动的包
    • unicodeKeyboard
      unicode设置(允许中文输入)
    • resetKeyboard
      键盘设置(允许中文输入)
  • 声明手机驱动对象
    driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub’, desired_caps)
    # 声明对象后会直接启动参数中的应用
  • 脚本内启动其他app
    driver.start_activity(appPackage,appActivity)
  • 关闭app
    driver.close_app() # 关闭当前操作的app,不会关闭驱动对象
  • 关闭驱动对象
    driver.quit() # 关闭驱动对象,同时关闭所有关联的app
# server 启动参数
desired_caps = {}
# 设备信息
desired_caps['platformName'] = 'Android' 
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = 'deviceName'
# app信息
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'

desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
# 声明手机驱动对象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

系统API操作

基本可以使用adb命令代替
import os
os.system(adb命令)

安装APK到手机

driver.install_app(app_path)  # app_path:脚本机器中APK文件路径

手机中移除APP

driver.remove_app(app_id) # app_id:需要卸载的app包名

判断APP是否已安装

driver.is_app_installed(bundle_id) # bundle_id: 可以传入app包名,返回结果为True(已安装) / False(未安装)

发送文件到手机

import base64
data = str(base64.b64encode(data.encode('utf-8')),'utf-8')
driver.push_file(path,data)
# path:手机设备上的路径(例如:/sdcard/a.txt)
# data:文件内数据,要求base64编码
# Python3.x中字符都为unicode编码,而b64encode函数的参数为byte类型,需要先转码; 生成的数据为byte类型,需要将byte转换回去

从手机中拉取文件

  import base64
  data = driver.pull_file(path) # 返回数据为base64编码
  print(str(base64.b64decode(data),'utf-8')) # base64解码

获取当前屏幕内元素结构

# 返回当前页面的文档结构(xml文件)
driver.page_source

元素获取工具

UI automator viewer工具

  • 位置
    sdk-tools-uiautomatorviewer.bat
  • 操作(获取该控件的id,class,text,坐标等信息)
    • android8以前
      左上角screenshot即可
    • android8以后截取不到机器界面信息,手动截取
    1. 截取uix文件
      adb shell
      uiautomator dump /sdcard/sc.uix # 获取uix文件
      Image1
      adb pull /sdcard/sc.uix ./desktop # 拉取到电脑上
  1. 截取屏幕
    • 将手机的app切换到响应页面
    • 电脑执行命令截取屏幕
      adb shell
      screencap -p /sdcard/sc.png # 截屏
      adb pull /sdcard/sc.png ./desktop # 拉取到电脑上 Image2
  2. 工具操作
    • 点击左上角的文件夹
    • 导入截图和uix资源 Image3

appium-Inspector工具

  • 操作
    • 启动appium服务器,启动检查器会话
    • 参数设置
      Image4
      {
      "deviceName":"can customize using android",  # 设备名称
      "automationName": "appium",  # 指定测试引擎
      "platformName": "Android",  #  使用的手机操作系统
      "platformVersion": "7.1", # 手机操作系统的版本
      "appPackage": "com.android.settings", # 运行的 Android 应用的包名(安卓特有的参数)
      "appActivity": ".Settings", # 指从你的包中所要启动的 Android acticity
      "autoAcceptAlerts": True, # 自动同意弹窗
      "no_reset":True, # 在当前 session 下不会重置应用的状态
      "auto_launch":False, # Appium是否需要自动安装和启动应用
      "newCommandTimeout": 600, # 超出时间自动退出
      "unicodeKeyboard": True, # 是否支持unicode键盘
      "resetKeyboard": True, # 是否在测试结束时充值为系统默认输入法
      }
      
    • 启动会话
    • 界面操作
      Image5
  • 优点
    • 操作栏有点击、滑动等功能,直接在页面中操作即可,不用频繁截图
    • 可以搜索元素,判断是否唯一

获取元素类型

  • Native原生
  • webview
    利用原生定位后,page_source获取webview的元素显示,基本同selenium的定位方式一致

原生的元素可能会存在难获取,难点击的问题

元素操作API

元素定位操作

元素的基本定位基于当前屏幕范围内展示的可见元素

  • 通过id定位
  • 通过class定位
  • 通过xpath定位
  • 定位一组元素(返回list)

等待

  • 显示等待: 在一个超时时间范围内,每隔一段时间去搜索一次元素是否存在;如果存在返回定位对象,如果不存在直到超时时间到达,报超时异常错误
    # WebDriverWait(driver, timeout, poll_frequency).until(lambda x: x.find_elements_by_id(id_value))
    # 1.实例化WebDriverWait类,传入driver对象,之后driver对象被赋值给WebDriverWait的一个类变量:self._driver
    # 2.until为WebDriverWait类的方法,until传入method方法(即匿名函数),之后method方法会被传入self._driver
    # 3.搜索到元素后until返回定位对象,没有搜索到函数until返回超时异常错误
    
    from selenium.webdriver.support.wait import WebDriverWait # 导入WebDriverWait类        
          search_button = WebDriverWait  (driver,timeout=10,poll_frequency=0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID,"com.android.settings:id/search")))
    search_button.click()
    driver.quit()

元素信息操作

  • 点击元素
  • 发送数据到输入框(中文问题,需设置desired_caps)
  • 清空输入框内容
  • 获取元素的文本内容
  • 获取元素的属性值
    get_attribute(value)
    • value=‘name’ 返回content-desc / text属性值
    • value=‘text’ 返回text的属性值
    • value=‘className’ 返回 class属性值,只有 API=>18 才能支持
    • value=‘resourceId’ 返回 resource-id属性值,只有 API=>18 才能支持
  • 获取元素在屏幕上的坐标
    location
  • 获取app包名和启动名
    current_package & current_activity

元素事件API

swip滑动事件

从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动
swipe(start_x, start_y, end_x, end_y, duration=None)

  • start_x:起点X轴坐标
  • start_y:起点Y轴坐标
  • end_x: 终点X轴坐标
  • end_y: 终点Y轴坐标
  • duration: 滑动这个操作一共持续的时间长度,单位:ms

scroll滑动事件

从一个元素滑动到另一个元素,直到页面自动停止
scroll(origin_el, destination_el)

  • origin_el:滑动开始的元素
  • destination_el:滑动结束的元素

drag拖拽事件

从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置
drag_and_drop(origin_el, destination_el)

  • origin_el:滑动开始的元素
  • destination_el:滑动结束的元素

应用置于后台事件

APP放置后台,模拟热启动
background_app(seconds)

  • seconds:停留在后台的时间,单位:秒

手势操作API

类:TouchAction
原理:将一系列的动作放在一个链条中发送到服务器,服务器接受到该链条后,解析各个动作,逐个执行
注意:所有手势都要通过执行函数才会运行
两种定位方式:element定位或坐标点x、y定位(传坐标时一定指明参数)

手指轻敲操作

模拟手指轻敲一下屏幕操作
TouchAction(driver).tap(element=None, x=None, y=None).perform()

  • element:被定位到的元素
  • x:相对于元素左上角的坐标,通常会使用元素的X轴坐标
  • y:通常会使用元素的Y轴坐标

手指按操作

模拟手指按下屏幕,按就要对应着离开
TouchAction(driver).press(el=None, x=None, y=None).release().perform()

  • element:被定位到的元素
  • x:通常会使用元素的X轴坐标
  • y:通常会使用元素的Y轴坐标

等待操作

wait(ms=0)
结合使用:TouchAction(driver).press(el).wait(5000).perform()

  • ms:暂停的毫秒数

手指长按操作

模拟手机按下屏幕一段时间,按就要对应着离开
TouchAction(driver).long_press(el=None, x=None, y=None, duration=1000).release().perform()

  • element:被定位到的元素
  • x:通常会使用元素的X轴坐标
  • y:通常会使用元素的Y轴坐标
  • duration:持续时间,默认为1000ms

手指移动操作

模拟手机的滑动操作
TouchAction(driver).press(oel).move_to(el=None, x=None, y=None).release().perform()

  • el:定位的元素
  • x:相对于前一个元素的X轴偏移量
  • y:相对于前一个元素的Y轴偏移量

注:坐标的方式向上滑动
TouchAction(driver).press(x=240,y=1000).move_to(x=0,y=-400).release().perform() # 需要给相对坐标,相对前一个元素的偏移量,即从(240,1000)到(240,600)向上滑动

swipe方法实际实现为press-wait-move_to-release-perform(),已经处理了位置,所以要用绝对位置

手机操作API

获取手机时间

device_time

获取手机的宽高

get_window_size()

发送键到设备

模拟系统键值的操作,比如操作honme键,音量键,返回键等
keyevent(keycode, metastate=None):

  • keycode:发送给设备的关键代码
  • metastate:关于被发送的关键代码的元信息,一般为默认值
  • 键值

操作手机通知栏

open_notifications()

获取手机当前网络

network_connection

设置手机网络

set_network_connection(connectionType)

  • connectionType:需要被设置成为的网络类型
    0/1/2/4/6 对应 None/飞行模式/仅WIFI/仅数据网络/All network on

手机截图

get_screenshot_as_file(filename)

以上是关于Appium安装&启动&元素获取&API操作一条龙的主要内容,如果未能解决你的问题,请参考以下文章

App自动化--Python&Appium实现安卓手机九宫格解锁

Windows&Appium&Python自动化测试-Appium安装

Appium-desktop & Appium 安装

python+appium如何获取元素内容的颜色

APPIUM安装与搭建Q&A

Appium移动自动化配置-ios&安卓