appium自动化测试(三)
一. 层级定位和list
先通过find_element_by_XXX找到父级元素webelement,再通过webelement.find_element_by_XXX寻找子元素
二. 滑动屏幕
滑动接口:
swipe(起始X,起始Y,结束X,结束Y)
结束X - 起始X:X轴滑动的距离
结束Y - 起始Y:Y轴滑动的距离
Q:手机的屏幕尺寸有很多,如何兼容?进入app时的导航页面
原理:
1. 先获取设备的屏幕大小(宽、高)
2. 再设置滑动的距离与屏幕大小的百分比
3. 调用滑动接口执行滑动操作
获取当前窗口大小的接口:
get_window_size:返回窗口的宽和高
滑动接口:
swipe(起始X,起始Y,结束X,结束Y)
实例:
#获取屏幕尺寸 size = self.driver.get_window_size() #swipe还有一个参数duration,单位是ms,防止操作过快 #向左滑动 self.driver.swipe(size["width"]*0.9, size["height"]*0.5, size["width"]*0.1, size["height"]*0.5, 200) #向右滑动 self.driver.swipe(size["width"]*0.1, size["height"]*0.5, size["width"]*0.9, size["height"]*0.5, 200)
多个屏幕需要滑屏时,最好在每个页面滑屏操作之后,利用time.sleep()稍微等待一下,防止操作过快
三. 模拟触屏
TouchAction类
将一系列的动作放在一个链条中,然后将该链条传递给服务器。服务器接收到该链条后,解析各个动作,逐个执行
短按(press)
长按(longPress)
点击(tap)
移动到(move to) x, y为相对上一个坐标的移动距离
等待(wait)
释放(release)
执行(perform)
取消(cancel)
实例
#引入TouchAction from appium.webdriver.common.touch_action import TouchAction ta = TouchAction(driver) #获取九宫格的起点坐标和大小 ele = driver.find_element_by_id("com.xxzb.fenwoo:id/gesturepwd_create_lockview") #九宫格的大小 size = ele.size #获取坐标:九宫格起点坐标 start_point = ele.location #参数是元素或者坐标,没有元素取坐标,wait是为了防止操作过快,单位是ms,绘制九宫格最后要释放release()(即抬起),完成后要perform() ta.press(x=start_point["x"] + size["width"]*1/6, y=start_point["y"] + size["height"]*1/6).wait(200).\ move_to(x=size["width"]*2/6, y=0).wait(200).\ move_to(x=size["width"]*2/6, y=0).wait(200).\ move_to(x=-size["width"]*2/6, y=size["height"]*2/6).wait(200).\ move_to(x=0, y=size["height"]*2/6).wait(200).\ release().wait(200).\ perform()
四. 多点触控
MultiAction类,引入
from appium.webdriver.common.multi_action import MultiAction
五. 安装/卸载/关闭/启动
启动Activity:
driver.start_activity()
在当前app打开一个activity,或者新打开一个应用并启动一个activity,仅支持Android
安装应用:
driver.install_app('path/to/my.apk')
卸载应用:
driver.remove_app('com.example.android.apis')
关闭应用:
driver.close_app()
应用是否已安装:检测应用是否已被安装
driver.is_app_installed('com.example.android.apis')
六. 拉取/推送文件
拉取(pull)文件
从设备上拉取文件
driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')
推送(push)文件
推送文件到设备
data = "some data for the file"
path = "/data/local/tmp/file.txt"
driver.push_file(path, data.encode('base64'))
七. 锁定/将应用切换至后台
锁定屏幕(IOS):
driver.lock(秒)
将应用切换至后台:
background_app({"timeout": secs})
将当前的应用切换到后台,然后可以让其在指定时间内回到前台,或者让它一直留在后台
传递给这个方法的参数有两种类型:
一个整型(秒):表示后台状态维持多久。 -1表示持续置于后台。这种风格的参数已经被废弃
一个看起来像("timeout": secs)的对象。里面的secs是含义和第一个类型一样的整型数字(即表示置于后台多少秒),或者为null(表示持续置于后台)
driver.background_app(5) #置于后台,持续5s
driver.background_app(-1) #持续置于后台
driver.background_app({"timeout": None}) #持续置于后台
driver.background_app({"timeout": 5}) #置于后台5s,5s后自动回到前台
八. 打开通知栏/摇一摇
打开通知栏:仅支持Android
driver.open_notifications()
摇一摇:模拟摇晃设备的操作
driver.shake()
九. 手势
捏(Pinch)手势:缩小(默认缩小一倍)
在屏幕上使用捏(Pinch)手势
driver.pinch(element=el)
放大屏幕(Zoom)(默认放大一倍)
在屏幕上使用放大手势
driver.zoom(element=el)
scroll:滚动
十. 按键操作
按键发送(Android):
driver.press_keycode(键的keycode)
十一. 上下文切换
可用的上下文(Contexts)
列出所有可用的上下文(contexts)
driver.contexts
当前上下文(context):列出当前的上下文(context)
driver.current_context
切换至默认的上下文(context)
切换回默认的上下文(context) (注:一般就是原生上下文 "NATIVE_APP")
driver.switch_to.context(None)
当前Activity:获取当前的Activity。仅支持Android
driver.current_activity
当前包名(package):获取当前包名(package)。仅支持Android
driver.current_package
步骤:
1. 识别——识别当前是否有webview视图,是否需要进入webview页面当中进行元素操作
识别方式一:看class或者content-desc是否包含WebView字段
方式二:
tips:
1) 在手机/模拟器中点击关于手机中的版本号5下,出来开发者选项
2) 在开发者选项中勾选上显示布局边界
3) 如果是html的界面,那界面不会有布局边界显示,如有则说明是native的界面
2. 获取——获取所有的contexts: driver.contexts
常见问题
contexts只能获取NATIVE_APP,无法获取WEBVIEW
使用uiautomatorview定位元素,显示class值为:android.webkit.WebView
但是driver.contexts只打印了 'NATIVE_APP'
解决办法:
1) app打包的时候需要开放webview的debug属性 setWebContentDebuggingEnabled(true),这个直接让开发加上就好
2) 模拟器的contexts中有webview,但有些手机没有,官方给出的答案是:需要将手机root,然后再去获取
3. 切换——切换到webview视图: driver.switch_to.context(webview视图)
4. 定位——定位webview中的元素,并执行操作:web网页元素定位和操作
5. 切换——切换回默认的视图:driver.switch_to.context(None)
参考文章
https://blog.csdn.net/crisschan/article/details/50419963
appium自动化测试(三)的更多相关文章
- Appium+python自动化(三十八) - Appium自动化测试框架综合实践 - 框架简介-助你冲击高薪,迎娶白富美(超详解)
简介 好久没有更新博客了,博友们是不是有点等不及了.不好意思啊,中秋节过后太忙了,这篇是好不容易抽点零碎时间写的.从这一篇开始小伙伴或者童鞋们,就跟随宏哥的脚步,一步步的从无到有,从0到1的搭建一个完 ...
- Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)
简介 经过一段时间的准备,完善的差不多了,继续分享有关Appium自动化测试框架综合实践.想必小伙伴们有点等不及了吧! driver配置封装 kyb_caps.yaml 配置表 参考代码 platfo ...
- 你的第一个自动化测试:Appium 自动化测试
前言: 这是让你掌握 App 自动化的文章 一.前期准备 本文版权归作者和博客园共有,原创作者:http://www.cnblogs.com/BenLam,未经作者同意必须在文章页面给出原文连接. 1 ...
- Appium+python自动化(四十二)-Appium自动化测试框架综合实践- 寿终正寝完结篇(超详解)
1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台.今天这篇分享讲解完.Appium自动化测试框架就要告一段落了. 2.执行测试用例&报告生成 测试报告, ...
- 全网最新方法:Win10下如何安装和搭建appium自动化测试环境
为了方便大家,下面是本人安装和搭建appium所需要的软件,自取. 链接:https://pan.baidu.com/s/1wl5Xnos4BmnSZsBRd6B5YA#list/path=%2F ...
- Appium自动化测试教程-自学网-adb命令
adb命令: adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信.它可为各种设备操作提供便利,如安装和调试应用. T ...
- 全网最全最细的appium自动化测试环境搭建教程以及appium工作原理
一.前言 对于appium自动化测试环境的搭建我相信90%的自学者都是在痛苦中挣扎,在挣扎中放弃,在放弃后又重新开始,只有10%的人,人品比较好,能够很快并顺利的搭建成功.appium 自动化测试 ...
- Python+Appium自动化测试(14)-yaml配置Desired capabilities
一,前言 在之前的appium自动化测试示例中,我们都是把构造driver实例对象的数据(即Desired Capabilities)写在业务代码里,如下: # -*- coding:utf-8 -* ...
- Python+Appium自动化测试(6)-元素等待方法与重新封装元素定位方法
在appium自动化测试脚本运行的过程中,因为网络不稳定.测试机或模拟器卡顿等原因,有时候会出现页面元素加载超时元素定位失败的情况,但实际这又不是bug,只是元素加载较慢,这个时候我们就会使用元素等待 ...
随机推荐
- java URL 利用网址api 查出手机号归属地
手机号码归属地查询api接口 1.淘宝网API地址: http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=手机号码参数:tel:手机号码返 ...
- ssh登陆github
ssh [转载] 如果只是在一个仓库里管理文件历史,Git和SVN真没啥区别.为了保证你现在所学的Git物超所值,将来绝对不会后悔,同时为了打击已经不幸学了SVN的童鞋,本章开始介绍Git的杀手级功能 ...
- Python元组组成的列表转化为字典
虽然元组.列表不可以直接转化为字典,但下面的确是可行的,因为经常用python从数据库中读出的是元组形式的数据. # 原始数据 rows = (('apollo', 'male', '164.jpeg ...
- Tensorflow神经网络进行fiting function
使用Tensorflow中的神经网络来拟合函数(y = x ^ 3 + 0.7) # -*- coding:utf-8 -*-import tensorflow as tf import numpy ...
- 安装MySQL版本为mysql-installer-community-5.7.17.msi
双击MySQL安装包, 勾选复选框,点击下一步: 选择仅仅服务器模式,点击下一步: 直接点击执行: 执行完成,点击下一步: 确认配置,点击下一步: 输入用户名和密码,点击下一步: 默认选项,点击下一步 ...
- android studio上传项目到github报错Successfully created project 'Demo' on GitHub, but initial commit failed:
今天博主正在愉快地学习在AndroidStudio中使用Git,结果报了下面这个错∑(っ°Д°;)っ: Can't finish GitHub sharing process Successfully ...
- js基本
BOM 浏览器对象模型 DOM 文档对象模型 js主要是来操作DOM和BOM,用的事件驱动方式,通过事件去执行相应函数 如何加载:在html当中有写链接,然后加载的时候会把js函数,数据全取出来,然后 ...
- dymaic方式的Json序列化
from:http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object If you ...
- GIT学习笔记(5):变基
GIT学习笔记(5):变基rebase 变基 引入变基 在Git中整合来自不同分支的修改主要有两种方法:merge以及rebase. 整合分支最容易的方法是merge,他会把两个分支的最新快照以及两者 ...
- 11 Spring框架 SpringDAO的JdbcTemplate
上几个章节我们探讨了Spring的IoC和AOP,这是Spring的重点,但是Spring对jdbc的支持同样我们也不能忘记,毕竟我们还要通过Spring来管理DAO框架(例如Hibernate或者M ...