Appium进阶教程
目录
Monkey的使用
adb shell monkey -p com.lqr.wechat -v 500 > monkey.log
adb shell monkey -p com.lqr.wechat -vvv 5000 > monkey2.log
adb shell monkey -p com.lqr.wechat -vvv 5000 --send=1556166765229 --throttle 500 > monkey3.log
adb shell monkey -p com.lqr.wechat -vvv 5000 --send=1556166765229 --ignore-crashes > monkey4.log
参数:
- -p
- -v
- -s
- --throttle
- --ignore-crashes: 忽略崩溃
- --ignore-timeouts: 忽略ANR
- --ignore-security-exceptions: 忽略证书问题
- --kill-process-after-error: Monkey出错后结束运行
- --monitor-native-crashes: 监控本地崩溃
可通过命令行指定
- count=5000: 计划执行5000次
- AllowPackage: 包名
- Event percentages: 事件百分比, 可通过命令行修改
- Switch: Activity(页面)跳转
- Sending Touch: 发送动作指令
- Injection Failed #注入(执行)指令失败, App无反应或不支持
- CRASH: 崩溃
指定事件百分比
- –pct-touch:触摸事件(点击)
- –pct-motion:动作事件(拖动)
- –pct-trackball:轨迹球事件(移动)
- –pct-nav:基本导航事件:上下左右操作
- –pct-majornav:主导航事件: 确认,菜单,返回键
- –pct-syskeys:系统按键事件: 如HOME键,BACK键,拨号键,挂断键,音量键等
- –pct-appswitch:应用启动事件
- –pct-anyevent: 任意事件
手动停止Monkey
adb shell
ps | grep monkey (查询进程号)
kill 进程号
Appium inspector的使用
- 启动和配置
- 定位和操作元素
- 录制
元素定位
- 通过resource_id: find_element_by_id:
- 通过content-desc: find_element_by__accessibility_id
- 通过xpath: 结合属性/上下级节点/索引定位
- 重复元素+索引定位: l = find_elements_by_... l[1].click()
- 逐级定位: driver.find_element_by_id(...).find_element_by_class_name(...)
使用By及元素定位器
from appium.webdriver.common.mobileby import By
driver.find_element(By.ID, "....")
使用uiautomator的原始定位方式
1.通过id定位
driver.find_element_by_android_uiautomator('new UiSelector().resourceId(“id”)').click()
- 通过text定位
# Text定位
driver.find_element_by_android_uiautomator('new UiSelector().text("textstr")')
# 文字包含
driver.find_element_by_android_uiautomator('new UiSelector().textContains(textStr)')
# 以哪个字符开始
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith(textStr)')
- 通过class属性定位
driver.find_element_by_android_uiautomator('new UiSelector().className("class属性")')
- 多属性定位
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView").text("Custom View")')
可作为过滤条件的有:
- UISelector.text
- UISelector.textContains
- UISelector.textStartsWith
- UiSelector.resourceId
- UISelector.className
- UISelector.textMatches
- UISelector.classNameMatches
- UiSelector.fromParent
- UiSelector.childSelector
- UiSelector.resourceIdMatches
- UiSelector.description
- UiSelector.descriptionStartWith
- UiSelector.descriptionMatches
元素操作
- click()
- send_keys()
- clear()
- is_displayed()/is_enabled()/is_checked()
- get_attribute(): 获取属性 文本/状态/是否可操作等
- get_attribute("text")
- get_attribute("resourceId")
- get_attribute("className")
- set_value(): 设置text值
- text: 元素的文本
- location: 获取元素坐标值
- size: 获取元素大小
练习
noReset: True
1. 打开微信应用 ,判断是否存在 登录按钮
2. 如果已经登录,登录按钮不存在 ,就直接进入登录页,打印 通讯录的这些属性值, resourceid,text,className,enabled,clickable,selected,Displayed
c = driver.find...()
print(c.get_attribute("clickable"))
print(c.is_enabled()/c.is_displayed()/c.is_selected())
如果登录按钮存在 ,打印这个登录按钮的上面的属性值resourceid,text,className,enabled,clickable,selected,Displayed, 并点击登录按钮,
使用set_value())输入用户名密码
判断登录按钮是否可用,
可用的话打印可用,并点击登录,判断是否登录成功
不可用打印不可用
3. 退出应用
练习提示
try: # 尝试定位登录按钮
l = driver.find_element_by_id("")
except: # 未定位到
print(“没有登录按钮”)
c = driver.find_....() # 定位 通讯录 标签
print(c.get_attribute('resource-id') # 打印各种属性
print(c.text)
print(c.get_attribute(“class”)
print(c.is_enabled())
....
else: # 如果没有异常(定位到了登录按钮)
print(l.get_attribute("resource-id") # 打印登录按钮的各种属性
print(l.text)
print(l.get_attribute(“class”)
print(l.is_enabled())
...
l.click() # 点击登录按钮
driver.find…().set_value("18010181267") # 使用set_value输入文字
driver.find…().set_value("123456") # 使用set_value输入密码
l2 = driver.find..() # 定位 登录 按钮
if l2.is_enabled() is True: # 判断 登录按钮 是否可用
print(“可用”)
l2.click() # 点击登录按钮
try: # 判断是否登录成功, 登录成功后会有 "通讯录" 这个标签
c = driver.find_....() # 尝试定位通讯录这个标签
except: # 定位不到打印失败
print(“登录失败”)
else: # 没有异常(定位到) 打印成功
print(“登录成功”)
else:
print("不可用") # 上面的l2登录按钮不可用打印不可用
按键操作
- drvier.keyevent()
- driver.press_keycode()
练习
启动 微信,登录用户名和密码,并点击登录
进入 “我” ,点击用户名,
点击二维码名片,
截图并保存到d:\\screenshot\\VCODE.png
导入截图到手机/sdcard/images/这个路径下
返回到微信聊天列表页,并将音量放大两个分贝
点击菜单回到手机主屏
退出
屏幕操作
- tap: 触控(点击指定坐标),支持多点触控
- swipe: 滑动
- flick: 快滑
- pinch:
- zoom:
- get_screenshot_as_file: 截图
获取屏幕宽度
- width = driver.get_window_size()['width']
- height = driver.get_window_size()['height']
练习
封装四个方法,
向下滑动,
向上滑动,
向左滑动,
向右滑动,
练习2
打开手机设置
滑动查找页面上含有“关于“文字的 元素
如果找到了点击,如果没找到继续找,
进入关于页面,查看手机的版本信息
退出设置页面
文件操作
- driver.pull()
- driver.push()
app操作
autoLaunch=False
- driver.is_app_installed()
- driver.install_app()
- driver.remove_app()
- driver.launch_app()
- driver.start_activity()
- driver.current_activity()
- driver.background_app(3)
- driver.close_app()
网络状态
- driver.network_connection
查找已安装app(无apk包)Package/MainActiviy方法
adb shell
logcat | grep cmp=
然后在设备上操作一次app
练习
1.连接appium server,不启动任何app ,(autoLaunch =False)
2.启动微信的首页activity( launch_app() )
3.打开通知栏,然后关闭通知栏(要先打开一个activity) driver.press_keyevent(“4”)
4.用start_activity()启动本地浏览器,判断当前相机activity是否正确(
获取current_activity 对比当前的activity print driver.current_activity - .Camera)
5. 截屏screenshot.png 并保存到 d:\tmp\目录下
6.把当前app放在后台运行5秒钟 driver.backGround_app—进入 入到app首页
7.查看当前的网络状态,并且输出
8. 判断微信app是否已安装,已安装卸载,未安装执行安装 driver.is_app_install(“com.sankuai.meituan”)
Driver.remove_app(“包名”)
Driver.install_app(“路径/.apk”)
Appium进阶教程的更多相关文章
- duilib进阶教程 -- 总结 (17)
整个教程的代码下载:http://download.csdn.net/detail/qq316293804/6502207 (由于duilib进阶教程主要介绍界面,所以这个教程只给出界面相关的代码,完 ...
- duilib进阶教程 -- Container控件的bug (14)
在<duilib进阶教程 -- TreeView控件的bug (9)>里,Alberl发现了两个bug,并解决了其中一个,现在教程已经接近尾声啦,所以Alberl就解决了另外一个bug. ...
- Gensim进阶教程:训练word2vec与doc2vec模型
本篇博客是Gensim的进阶教程,主要介绍用于词向量建模的word2vec模型和用于长文本向量建模的doc2vec模型在Gensim中的实现. Word2vec Word2vec并不是一个模型--它其 ...
- Bash脚本15分钟进阶教程
转载: Bash脚本15分钟进阶教程 这里的技术技巧最初是来自谷歌的"Testing on the Toilet" (TOTT).这里是一个修订和扩增版本. 脚本安全 我的所有ba ...
- Android高手进阶教程(二十八)之---Android ViewPager控件的使用(基于ViewPager的横向相册)!!!
分类: Android高手进阶 Android基础教程 2012-09-14 18:10 29759人阅读 评论(35) 收藏 举报 android相册layoutobjectclassloade ...
- Nodejs爬虫进阶教程之异步并发控制
Nodejs爬虫进阶教程之异步并发控制 之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回 ...
- appium简明教程
appium简明教程 什么是appium? 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use to automate mobi ...
- Modelbuilder进阶教程
Modelbuilder进阶教程 By 李远祥 Modelbuilder 进阶1 自定义变量 参数是用来交互操作的,因此,参数具备非常大的灵活性,包括参数的定义和调用. 除了工具里面的参数之外,还可以 ...
- SpringBoot进阶教程(二十九)整合Redis 发布订阅
SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Ra ...
随机推荐
- S03_CH02_AXI_DMA PL发送数据到PS
S03_CH02_AXI_DMA PL发送数据到PS 1.1概述 本课程的设计原理分析. 本课程循序渐进,承接<S03_CH01_AXI_DMA_LOOP 环路测试>这一课程,在DATA ...
- S02_CH02_MIO实验Enter a post title
S02_CH02_MIO实验 2.1 GPIO简介 Zynq7000系列芯片有54个MIO(multiuse I/O),它们分配在 GPIO 的Bank0 和Bank1隶属于PS部分,这些IO与PS直 ...
- S02_CH01_Hello World实验
S02_CH01_Hello World实验 ZYNQ是一款SOC芯片,在前面第一季的学习当中,我们只是粗略的学习了ZYNQ的PL部分,对于ZYNQ最突出的功能,其内部的双核Cortex-A9内核并未 ...
- GoLang语言环境搭建及idea集成开发(超详细)
一.所需安装包(windows) 1. https://golang.org/dl/ 下载 MSI installer.不会翻墙的自己找国内下载,双击运行,按照提示安装即可.环境变量自动配置 2.i ...
- WindowsAPI使用详解——GetVersion|GetVersionEx 获取操作系统版本和名称
Windows API 中有两个函数可以得到系统版本信息:GetVersion和GetVersionEx. GetVersion这个函数曾经困扰了很多程序员,其本来设计的是在DWORD返 ...
- service程序改为windows窗体展示
首先将exe程序文件进行快捷创建.然后就会生成一个 exe -shortCut 程序,然后进入属性中,并且进行修改引用路径,在路径xx.exe 后面加一个空格和/tt,保存,这样就可以正常运行了. 如 ...
- 【小知识点】去除inline-block元素间间距的办法
之前一直用float浮动方法布局,因为display:inline-block有间隙,现在找到办法了.在父元素上面加font-sise:0,就可以了. 效果如图: 代码如下: <!DOCTYPE ...
- 14.SpringMVC核心技术-类型转换器
类型转换器 在前面的程序中,表单提交的无论是 int 还是 double 类型的请求参数,用于处理该请求 的处理器方法的形参, 均可直接接收到相应类型的相应数据,而非接收到 String 再手工转换. ...
- Heap(堆)与Stack(栈)的区别详解
在了解堆与栈之前,我们想来了解下程序的内存分配 一个编译的程序占用的内存分为以下几个部分 : 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 ...
- 编译luacheck Linux版
最近在写Visual Studio Code的Lua插件,需要把luacheck集成进去.但是luacheck默认只提供了win32版本,见https://github.com/mpeterv/lua ...