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
键盘设置(允许中文输入)
- platformName
- 声明手机驱动对象
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以后截取不到机器界面信息,手动截取
- 截取uix文件
adb shell
uiautomator dump /sdcard/sc.uix # 获取uix文件
adb pull /sdcard/sc.uix ./desktop # 拉取到电脑上
- android8以前
- 截取屏幕
- 将手机的app切换到响应页面
- 电脑执行命令截取屏幕
adb shell
screencap -p /sdcard/sc.png # 截屏
adb pull /sdcard/sc.png ./desktop # 拉取到电脑上
- 工具操作
- 点击左上角的文件夹
- 导入截图和uix资源
appium-Inspector工具
- 操作
- 启动appium服务器,启动检查器会话
- 参数设置
{ "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, # 是否在测试结束时充值为系统默认输入法 }
- 启动会话
- 界面操作
- 优点
- 操作栏有点击、滑动等功能,直接在页面中操作即可,不用频繁截图
- 可以搜索元素,判断是否唯一
获取元素类型
- 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实现安卓手机九宫格解锁