python-App自动化测试框架——uiautomator2之元素操作方法(一)
目录设备连接健康守护进程调试模式弹窗操作获取设备信息安装手机应用包启动应用程序关闭应用程序获取包信息屏幕操作文件上传和下载键盘操作设备连接import uiautomator2 as u2from pprint import pprint# 设备连接:USB连接方式# d = u2.connect('d7eac884')# 或u2.connect_usb('d7eac884'),这个方法是当前只有
目录
设备连接
import uiautomator2 as u2 from pprint import pprint # 设备连接:USB连接方式 # d = u2.connect('d7eac884') # 或u2.connect_usb('d7eac884'),这个方法是当前只有一个设备时使用 # 设备连接:WIFI连接方式 d = u2.connect('192.168.1.27') # 或u2.connect_adb_wifi('192.168.1.27'),ip可带端口号如5555
健康守护进程
d.healthcheck # 检查并维持设备端守护进程处于运行状态 d.service('uiautomator').stop() # 停用UiAutomator的守护程序安卓上的UiAutomator是独享的,一旦一个服务使用了它,其他服务就不能去碰。因此appium, macaca, uiautomatorviewer.bat 只要用了UiAutomator服务,都会冲突。只有使用完之后,停止uiautomator service,才能让其他服务使用。
调试模式
d.debug = True # 开启调试模式,值为true为开启,为false为关闭
获取设备信息
def device(): print('___________' * 4, '设备序列号:', '___________' * 4, '\n', d.serial) # 如果是无线连接输出为连接的设备ip,如果是usb连接输出为设备序列号 print('___________' * 4, '获取WIFI IP:', '___________' * 4, '\n', d.wlan_ip) print('___________' * 4, '设备基本信息(driver信息):', '___________' * 4, '\n') pprint(d.info) # info获取设备基本信息 print('___________' * 4, '设备详细信息:', '___________' * 4, '\n') pprint(d.device_info) # device_info获取设备详细信息,包括电池,CPU,内存等所有信息 print('___________' * 4, '窗口大小:', '___________' * 4, '\n') x, y = d.window_size() # 返回的结果是一个元组(横坐标像素大小,纵坐标大小) print('x:', x, 'y:', y) print('___________' * 4, '当前应用程序:', '___________' * 4, '\n',d.app_current()) device()
安装手机应用包
安装手机应用包,括号里的参数可以是本机地址,也可以是网络url地址
d.app_install('C:/Users/Administrator/Desktop/浏览器下载/hanyucidianv3.5_downcc.com.apk') # 本地软件安装包 d.app_install('http://a.xzfile.com//apk4/hanyucidianv3.5_downcc.com.apk') # 网络软件安装包
启动应用程序
d.app_start('org.hisand.zidian.zhs.pro') # 参数为包名
关闭应用程序
1、退出指定app程序并结束进程
d.app_stop('org.hisand.zidian.zhs.pro') # 退出指定app程序并结束进程2、关闭所有应用程序
d.app_stop_all() # 关闭所有应用程序3、关闭除了指定应用的其他应用,excludes参数为一个字典,里面是不进行结束进程的包名
d.app_stop_all(excludes=['org.hisand.zidian.zhs.pro']) # 停止所有应用程序,除了com.examples.demo,excludes参数为一个字典,里面是不进行结束进程的包名4、清空App数据,相当于重新安装的软件包
d.app_clear('org.hisand.zidian.zhs.pro') # 清空App数据,相当于重新安装的软件包
卸载手机应用包
d.app_uninstall('org.hisand.zidian.zhs.pro')
等待应用启动
参数:包名、超时时间、front(等待直到应用程序是当前应用程序,默认为false,表示只要后台有这个应用的进程就会返回PID(true表示不支持后台运行,false表示后台运行即返回PID)),如果没有应用进程返回的PID值为0
applist = d.app_wait('com.cctv.yangshipin.app.androidp',10) print(applist) # 返回PID
获取包信息
def apk(): print('___________' * 4, '获取指定应用包的信息:', '___________' * 4, '\n') pprint(d.app_info('org.hisand.zidian.zhs.pro')) img_apk = d.app_icon('org.hisand.zidian.zhs.pro') # 获取指定应用的图标 img_apk.save('./img/apklogo.png') # 保存应用图标到指定文件目录下 apk()
屏幕操作
单击,滑动,拖动操作支持百分比位置值
d.screen_on() # 打开屏幕 d.screen_off() # 关闭屏幕 print(d.info.get('screenOn')) # 获取屏幕开启状态(需要Android>=4.4),返回布尔值,true为开启状态,false为关闭状态 d.unlock() # 解锁屏幕,没有密码进入到手机桌面,有密码的时候进入到开机解锁界面 d.click(0.536, 0.651) # 点击屏幕 d.double_click(0.536, 0.651) # 双击屏幕,参数(x,y,duration),第三个参数为单击之间间隔时间,默认为0.1秒 d.long_click(0.259, 0.853) # 长按一下屏幕 d.long_click(0.259, 0.853,1) # 长按1秒(默认) d.swipe(0.136, 0.651, 0.907, 0.706) # 指定坐标滑动滑动屏幕,参数(x1,y1,x2,y2,duration,steps) d(scrollable=True).scroll.vert.backward() # 向上滑动,下拉操作,backward()的参数为distance,滑动的距离 d(scrollable=True).scroll(steps=30) d(scrollable=True).scroll.toEnd(60) d(scrollable=True).scroll.toBeginning(steps=60) # 竖直滑动到开头 d(scrollable=True).scroll.horiz.forward(steps=60) # 水平向右滑动 d(scrollable=True).scroll.horiz.toEnd(steps=50, max_swipes=500) # 水平向右滑动,直到最右边 d(scrollable=True).scroll.horiz.backward(steps=50) # 水平向左滑动 d(scrollable=True).scroll.horiz.toBeginning(steps=100, max_swipes=1000) # 水平向左滑动,直到最左边 d().gesture((0.736, 0.651),(0.507, 0.806),(0.259, 0.653),(0.729, 0.638),steps=100) # 双指从(a,b),(c,d)滑动(a1,b1),(c1,d1),步长100 d().pinch_in(percent=80, steps=50) # 从屏幕外侧向中心滑动,percent为左右起始位置占两边的比例 d().pinch_out(percent=10, steps=100) # 从屏幕中心向外侧滑动,percent为左右起始位置占两边的比例 d.drag(0.207, 0.306, 0.659, 0.653, 1) # 在屏幕上拖拽
文件上传和下载
推送文件:上传文件到手机设备
d.push("./Img/1.jpg", "/sdcard/贾宝玉/") # 将文件推送到设备,如果导出的目标设备位置为文件夹,文件夹前后都要加/,否则报错,sdcard为手机的根目录,必须加 d.push("./Img/1.jpg", "/sdcard/贾宝玉/test.jpg") # 将文件推送到设备并重命名文件 # 使用读写文件的方式导出文件到设备 with open("./Img/1.jpg", 'rb') as f: d.push(f, "/sdcard/贾宝玉/test.jpg")下载文件到本机
# 从设备中拉出一个文件,如果在设备上找不到文件,报错:FileNotFoundError d.pull('/sdcard/测试/城里的月光.mp3','城里的月光_许美静.mp3')
键盘操作
def press_key(): d.press("back") # 点击back键 d.press("home") # 点击home键 d.press("left") # 点击左键 d.press("right") # 点击右键 d.press("up") # 点击上键 d.press("down") # 点击下键 d.press("center") # 点击中间 d.press("menu") # 点击menu按键,菜单键 d.press("search") # 点击搜索按键 d.press("enter") # 点击enter键,键盘上的Enter键 d.press("delete") # 点击删除按键,delete(or del)对应键盘上的DEL键 用于删除) d.press("recent") # 点击近期活动按键,(recent apps) d.press("volume_up") # 音量+ d.press("volume_down") # 音量- d.press("volume_mute") # 静音 d.press("camera") # 相机拍照按钮 d.press("power") # 电源键 press_key()
driver全局设置
print(d.settings) ''' 默认设置的输出结果: {'fallback_to_blank_screenshot': False, 'operation_delay': (0, 0), # 操作前延迟时间和操作后延迟时间 'operation_delay_methods': ['click', 'swipe'], # 延迟生效的方法 'wait_timeout': 20.0, # 默认等待时间 'xpath_debug': False} # xpath日志 ''' d.settings['wait_timeout'],d.settings['operation_delay'] = 30.0,(5,5) # 修改全局设置 print(d.settings) ''' 修改后的输出结果: {'fallback_to_blank_screenshot': False, 'operation_delay': (5, 5), 'operation_delay_methods': ['click', 'swipe'], 'wait_timeout': 30.0, 'xpath_debug': False} '''
UiAutomator中的超时设置(隐藏方法)
# 为了防止客户端程序响应超时,waitForIdleTimeout和waitForSelectorTimeout目前已改为0
Configurator | Android Developers
pprint(d.jsonrpc.getConfigurator()) ''' 输出默认设置结果: {'actionAcknowledgmentTimeout': 500, 'keyInjectionDelay': 0, 'scrollAcknowledgmentTimeout': 200, 'waitForIdleTimeout': 0, 'waitForSelectorTimeout': 0} ''' d.jsonrpc.setConfigurator({'waitForIdleTimeout':200}) # 修改UiAutomator中的超时设置 pprint(d.jsonrpc.getConfigurator()) ''' 输出修改设置后的结果: {'actionAcknowledgmentTimeout': 500, 'keyInjectionDelay': 0, 'scrollAcknowledgmentTimeout': 200, 'waitForIdleTimeout': 200, 'waitForSelectorTimeout': 0} '''
方法或属性设置
http默认请求超时时间
d.HTTP_TIMEOUT = 60 # 默认值为60s当设备掉线时,等待设备在线时长
d.WAIT_FOR_DEVICE_TIMEOUT = 70 # 仅当TMQ=true时有效,支持通过环境变量 WAIT_FOR_DEVICE_TIMEOUT 设置元素查找默认等待时间
d.implicitly_wait(10.0) # 找不到元素时,等待10后再报异常
更多推荐




所有评论(0)