推荐安装教程
appium --address 127.0.0.1 --port 4723 --log “./log/appium.log” --log-timestamp --local-timezone --session-override
具体含义参见下文参数配置说明
# 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)
基本可以使用adb命令代替
import os
os.system(adb命令)
driver.install_app(app_path) # app_path:脚本机器中APK文件路径
driver.remove_app(app_id) # app_id:需要卸载的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
{
"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, # 是否在测试结束时充值为系统默认输入法
}
原生的元素可能会存在难获取,难点击的问题
元素的基本定位基于当前屏幕范围内展示的可见元素
# 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()
从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动
swipe(start_x, start_y, end_x, end_y, duration=None)
从一个元素滑动到另一个元素,直到页面自动停止
scroll(origin_el, destination_el)
从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置
drag_and_drop(origin_el, destination_el)
APP放置后台,模拟热启动
background_app(seconds)
类:TouchAction
原理:将一系列的动作放在一个链条中发送到服务器,服务器接受到该链条后,解析各个动作,逐个执行
注意:所有手势都要通过执行函数才会运行
两种定位方式:element定位或坐标点x、y定位(传坐标时一定指明参数)
模拟手指轻敲一下屏幕操作
TouchAction(driver).tap(element=None, x=None, y=None).perform()
模拟手指按下屏幕,按就要对应着离开
TouchAction(driver).press(el=None, x=None, y=None).release().perform()
wait(ms=0)
结合使用:TouchAction(driver).press(el).wait(5000).perform()
模拟手机按下屏幕一段时间,按就要对应着离开
TouchAction(driver).long_press(el=None, x=None, y=None, duration=1000).release().perform()
模拟手机的滑动操作
TouchAction(driver).press(oel).move_to(el=None, x=None, y=None).release().perform()
注:坐标的方式向上滑动
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(),已经处理了位置,所以要用绝对位置
device_time
get_window_size()
模拟系统键值的操作,比如操作honme键,音量键,返回键等
keyevent(keycode, metastate=None):
open_notifications()
network_connection
set_network_connection(connectionType)
get_screenshot_as_file(filename)