当前位置: 首页 > 编程日记 > 正文

手机APP自动化之uiautomator2 +python3 UI自动化

题记: 之前一直用APPium直到用安卓9.0  发现uiautomatorviewer不支持安卓 9.0,点击截屏按钮 一直报错,百度很久解决方法都不可以,偶然间看见有人推荐:uiautomator2 就尝试使用 发现比appium要简单一些; 下面文字主要来自虫师的博客

一、Uiautomator2原理介绍

1.uiautomator2是一个可以使用Python对Android设备进行UI自动化的库。其底层基于Google uiautomator,Google提供的uiautomator库可以获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作,目前仅支持android平台的原生应用测试,https://github.com/openatx/uiautomator2。但有两个缺点:

    测试脚本只能使用Java语言。
    测试脚本必须每次被上传到设备上运行。

2.工作原理

分为两个部分:

PC上的python端:运行脚本,并向系统设备发送http请求

移动设备:移动设备上运行了封装了uiautomator2的HTTP服务,解析收到的请求,并转化成uiautomator2的代码。

二、安装uiautomator2

pip install --pre uiautomator2

pip install pillow

三、初始化

部署相关的守护进程。

电脑连接上一个手机或多个手机, 确保adb已经添加到环境变量中,执行下面的命令会自动安装本库所需要的设备端程序:uiautomator-server 、atx-agent、openstf/minicap、openstf/minitouch

python -m uiautomator2 init

安装完成,设备上会多一个uiautomator的应用。

配置手机设备参数:

有两种方法,一种是通过WIFI,另一种是通过USB数据线将手机链接电脑。 (我是通过USB这个方法,按照后手机会多一个ATX小汽车图标的软件)

WiFi连接更方便一点,需要保持PC和手机使用的一个WIFI,查看手机连接WIFI的IP地址。

定位元素:

我们可以借助Android SDK自的uiautomatorviewer查看元素,这就要求手机必须以USB的方式连接PC,我前面使用的是WIFI连接进行连接的。所以,openatx提供了另外一个工具weditor 来解决这个问题。

GitHub地址:https://github.com/openatx/weditor

1、安装:

pip install --pre --upgrade weditor

2、使用:

python3 -m weditor

默认会通过浏览器打开页面:http://atx.open.netease.com/

下面这个跟用uiautomatorviewer定位元素是一样的 而且多了xpath的定位语句,用起来更方便,

在页面左上角选择Android,输入设备IP(192.168.31.234),点击Connect按钮。

当我们操作完手机后,可以点击“Reload”按钮进行刷新,从而保持与设备上的界面保持同步。weditor 还可以帮我们生成代码。总之,你研究一下就会用了。

编写测试脚本 这里参考怎么去定位元素,在定位元素和启动APP 相对比APPium  要简单很多

这里针对魅族社区App进行测试。

import uiautomator2 as u2
from time import sleepd = u2.connect('192.168.31.234')# 启动App
d.app_start("com.meizu.mzbbs")# 搜索
d(resourceId="com.meizu.mzbbs:id/j0").click()# 输入关键字
d(resourceId="com.meizu.mzbbs:id/p9").set_text("flyme")# 搜索按钮
d(resourceId="com.meizu.mzbbs:id/tp").click()sleep(2)# 停止app
d.app_stop("com.meizu.mzbbs") 

 

app_start()和app_stop()用于启动和停止应用。

常用的定位方式:

  • ResourceId定位:
    d(resourceId="com.meizu.mzbbs:id/tp").click()

  • Text定位:
    d(text="精选").click()

  • Description定位:
    d(description="..").click()

  • ClassName定位:
    d(className="android.widget.TextView").click()

小结:其实关注该项目已经好几个月了,目前该项目已经趋于稳定,整个测试环境的搭建过程也要比Appium简单得多。

我是练习分割线


在尝试对APP进行登录的时候发现一个问题,在用APPium 是可以隐藏键盘进行输入, 用uiautomator2 发现不可以 ,一直卡主键盘没法办收起来提交失败;

最后尝试用物理返回,成功解决,

下面尝试用uiautomator2 打开微信小程序并进行授权 代码如下:

#链接设备
driver = u2.connect_usb("XXXX")
#打开APP
driver.app_start("com.tencent.mm")time.sleep(3)
#下拉操作
driver.swipe(0.513,0.399, 0.513,0.6)
#通过文本定位打开小程序
driver(text="XX").click()

打开APP,并进行登录:

#定位driver
driver = u2.connect_usb("L081")
#启动app driver.app_start("com.XXX.XXXX")
#通过id定位输入框输入账号密码 driver(resourceId="com.XXX.XXXX:id/login_username_et").set_text("test") driver(resourceId="com.XXX.XXXX:id/login_password_et").send_keys("123456") #通过物理返回,收齐键盘 driver.press("back") time.sleep(2) #点击登录 driver(resourceId="com.XXX.XXXX:id/login_commit_btn").click()

疑问:在校验还没涉及  如果有朋友涉及  请不吝赐教,谢谢

下面是原文链接和一些用法介绍:

原文:

https://www.cnblogs.com/fnng/p/8486863.html

用法:

https://blog.csdn.net/ricky_yangrui/article/details/81415365

转载于:https://www.cnblogs.com/shoebill/p/10776353.html

相关文章:

爱上MVC3系列~开发一个站点地图(俗称面包屑)

回到目录 原来早在webform控件时代就有了SiteMap这个东西,而进行MVC时代后,我们也希望有这样一个东西,它为我们提供了不少方便,如很方便的实现页面导航的内容修改,页面导航的样式换肤等. 我的MvcSiteMap主要由实体文件,XML配置文件,C#调用文件组成,当然为了前台使用方便,可以为…

Django web框架-----Django连接现有mysql数据库

第一步:win10下载mysql5.7压缩包配置安装mysql,创建数据库或导入数据库 第二步:win10搭建django2.1.7开发环境,创建项目为mytestsite,创建应用app为quicktool 第三步:编辑与项目同名的文件夹的配置文件&…

CUDA Samples: green ball

以下CUDA sample是分别用C和CUDA实现的生成的绿色的球图像&#xff0c;并对其中使用到的CUDA函数进行了解说&#xff0c;code参考了《GPU高性能编程CUDA实战》一书的第五章&#xff0c;各个文件内容如下&#xff1a;funset.cpp:#include "funset.hpp" #include <r…

ICLR 2020论文投稿2600篇,GNN、BERT、Transformer领跑热门研究方向

&#xff08;图片由AI科技大本营付费下载自视觉中国&#xff09;出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;2019 年 4&#xff0c;ICLR 2020 论文征集活动开始&#xff0c;截止 9 月 25 日&#xff0c;大会共收到近 2600 篇投稿&#xff0c;相比 ICL…

android环境安装之android4.2安装(转)

准备学习android&#xff0c;着手安装android时听说很麻烦&#xff0c;在网上看了很多android安装说明&#xff0c;都是android比较早的版本&#xff0c;我这里安装了android4.2&#xff0c;简单记录一下。 安装分为几步&#xff0c;首先申明&#xff0c;安装时最好保持网络畅通…

如何创建一个百分百懂你的产品推荐系统 | 深度教程(附代码详解)

&#xff08;图片由AI科技大本营付费下载自视觉中国&#xff09;来源 | 读芯术&#xff08;ID&#xff1a;AI_Discovery&#xff09;你也许每天都会逛一逛电子商务网站&#xff0c;或者从博客、新闻和媒体出版物上阅读大量文章。浏览这些东西的时候&#xff0c;最令读者或者用户…

CUDA Samples: Ray Tracking

以下CUDA sample是分别用C和CUDA实现的生成光线跟踪图像&#xff0c;并对其中使用到的CUDA函数进行了解说&#xff0c;code参考了《GPU高性能编程CUDA实战》一书的第六章&#xff0c;CUDA各实现包括了使用常量内存和不使用常量内存两种方法&#xff0c;各个文件内容如下&#x…

从产品的适用性以及费用方面考虑

物联宇手持终端在对比性价比高低应该从产品的适用性以及费用方面考虑。不过在选择时不一定要整机&#xff0c;可以按实际需求让厂商定做和行业需要功能的手持机&#xff0c;这样有针对性的定制更能体现整体的性价效率。转载于:https://blog.51cto.com/14222294/2386642

杨学海:跨境电商新通道-进口保税直邮模式解析

为什么80%的码农都做不了架构师&#xff1f;>>> 杨学海&#xff1a;跨境电商新通道-进口保税直邮模式解析 广州威云供应链管理公司总经理杨学海在第九届中国中小企业电子商务大会上表示&#xff0c;其品牌海外通要为跨境电子商务提供一个更加快速、便捷、低成本&am…

CUDA Samples: heat conduction(模拟热传导)

以下CUDA sample是分别用C和CUDA实现的模拟热传导生成的图像&#xff0c;并对其中使用到的CUDA函数进行了解说&#xff0c;code参考了《GPU高性能编程CUDA实战》一书的第七章&#xff0c;各个文件内容如下&#xff1a;funset.cpp:#include "funset.hpp" #include <…

2020应届生:今年秋招也太太太太太难了吧!

讲个简短的鬼故事&#xff1a;2020秋招已经过去一大半了&#xff01;回顾9月&#xff0c;你可能以为秋招还有很多机会&#xff0c;还有大把时间准备。然而各大名企的实际进度却不等人。阿里巴巴9月12日网申截止&#xff1b;腾讯9月15日网申截止&#xff1b;宝洁9月20日关闭网申…

PDF文字怎么编辑,PDF文档编辑方法

有时候遇到PDF文件不是自己制作的或者是制作的有点匆忙&#xff0c;会有文字遗漏或者打错的时候&#xff0c;我们使用就会有点麻烦就需要把文件中的文字进行编辑修改&#xff0c;那么具体怎么做呢&#xff1f;小伙伴们都挺好奇吧&#xff0c;今天就来跟大家分享一下。操作软件&…

浏览器是怎样工作的:渲染引擎,HTML解析

2019独角兽企业重金招聘Python工程师标准>>> 渲染引擎 渲染引擎的职责是……渲染&#xff0c;也就是把请求的内容显示到浏览器屏幕上。 默认情况下渲染引擎可以显示HTML&#xff0c;XML文档以及图片。 通过插件&#xff08;浏览器扩展&#xff09;它可以显示其它类型…

CUDA Samples: Calculate Histogram(atomicAdd)

以下CUDA sample是分别用C和CUDA实现的计算一维直方图&#xff0c;并对其中使用到的CUDA函数进行了解说&#xff0c;code参考了《GPU高性能编程CUDA实战》一书的第九章&#xff0c;各个文件内容如下&#xff1a;funset.cpp:#include "funset.hpp" #include <rando…

glusterfs基本操作

基本操作 集群节点 扩展集群 1,必须做hosts域名解析其实通过IP地址也能做集群,但是不建议这种方式. 192.168.1.210 glusterfs04 2, 添加节点到集群中,在当前所有集群节点中都需要执行 gluster peer probe glusterfs04 3,查看对等状态 gluster peer status 查看集群节点信息 gl…

100多次竞赛后,他研发了一个几乎可以解决所有机器学习问题的框架

&#xff08;图片由AI科技大本营付费下载自视觉中国&#xff09;作者 | XI YANG来源 | 知乎&#xff08;机器学习之路&#xff09;一个叫 Abhishek Thakur 的数据科学家&#xff0c;在他的 Linkedin 发表了一篇文章 Approaching (Almost) Any Machine Learning Problem&#xf…

mysql中char与varchar的区别分析(补充一句,int和integer没区别)

转自&#xff1a;http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢&#xff0c;都是用来存储字符串的&#xff0c;只是他们的保存方式不一样罢了&#xff0c;char有固定的长度&#xff0c;而varchar属于可变长的字符类型。har与varchar的区别 &#…

CUDA Samples: Streams' usage

以下CUDA sample是分别用C和CUDA实现的流的使用code&#xff0c;并对其中使用到的CUDA函数进行了解说&#xff0c;code参考了《GPU高性能编程CUDA实战》一书的第十章&#xff0c;各个文件内容如下&#xff1a;funset.cpp:#include "funset.hpp" #include <random&…

你的神经网络不起作用的37个理由

&#xff08;图片由AI科技大本营付费下载自视觉中国&#xff09;作者 | Slav Ivanov译者 | 吴金笛校对 | 丁楠雅、林亦霖编辑 | 王菁来源 | 数据派THU&#xff08;ID&#xff1a;DatapiTHU&#xff09;【导语】本文列举了在搭建神经网络过程中的37个易错点&#xff0c;并给出了…

菜鸟Vue学习笔记(三)

菜鸟Vue学习笔记&#xff08;三&#xff09;本周使用了Vue来操作表单&#xff0c;接下来说下Vue中双向绑定表单元素的用法。Vue中双向绑定是使用的v-model&#xff0c;所谓的双向绑定即改变变量的值&#xff0c;表单元素的值也会改变&#xff0c;同样的&#xff0c;改变表单元素…

Python中的注释(转)

一、单行注释单行注释以#开头&#xff0c;例如&#xff1a;print 6 #输出6二、多行注释&#xff08;Python的注释只有针对于单行的注释&#xff08;用#&#xff09;&#xff0c;这是一种变通的方法&#xff09;多行注释用三引号将注释括起来&#xff0c;例如:多行注释多行注释三…

CUDA Samples: dot product(使用零拷贝内存)

以下CUDA sample是分别用C和CUDA实现的点积运算code&#xff0c;CUDA包括普通实现和采用零拷贝内存实现两种&#xff0c;并对其中使用到的CUDA函数进行了解说&#xff0c;code参考了《GPU高性能编程CUDA实战》一书的第十一章&#xff0c;各个文件内容如下&#xff1a;funset.cp…

一文读懂线性回归、岭回归和Lasso回归

&#xff08;图片由AI科技大本营付费下载自视觉中国&#xff09;作者 | 文杰编辑 | yuquanle本文介绍线性回归模型&#xff0c;从梯度下降和最小二乘的角度来求解线性回归问题&#xff0c;以概率的方式解释了线性回归为什么采用平方损失&#xff0c;然后介绍了线性回归中常用的…

tf.matmul / tf.multiply

import tensorflow as tfimport numpy as np 1.tf.placeholder placeholder()函数是在神经网络构建graph的时候在模型中的占位&#xff0c;此时并没有把要输入的数据传入模型&#xff0c;它只会分配必要的内存。 等建立session&#xff0c;在会话中&#xff0c;运行模型的时候通…

Java 匿名类也能使用构造函数

为什么80%的码农都做不了架构师&#xff1f;>>> 匿名类虽然没有名字&#xff0c;但可以有一个初始化块来充当构造函数。 public enum Ops {ADD, SUB} public class Calculator { private int i, j, result; public Calculator() {} public Calculator(int _i, …

CUDA Samples: matrix multiplication(C = A * B)

以下CUDA sample是分别用C和CUDA实现的两矩阵相乘运算code即C A*B&#xff0c;CUDA中包含了两种核函数的实现方法&#xff0c;第一种方法来自于CUDA Samples\v8.0\0_Simple\matrixMul&#xff0c;第二种采用普通的方法实现&#xff0c;第一种方法较快&#xff0c;但有些复杂&am…

业界首个实时多目标跟踪系统开源

&#xff08;图片由AI科技大本营付费下载自视觉中国&#xff09;作者 | CV君来源 | 我爱计算机视觉&#xff08;ID&#xff1a;aicvml&#xff09;相对业界研究比较多的单目标跟踪&#xff0c;多目标跟踪&#xff08;Multi-Object Tracking&#xff0c;MOT&#xff09;系统在实…

python基础 练习题

【练习题1】实现一个整数加法计算器如 content input(">>> ") # 59 , 64 count0 while 1:contentinput(>>>)s1 content.split()print(s1)count 0for i in s1:count int(i)print(count) 【练习题2】请编写1 - 100 所有数的和 sum0 for i in r…

[再寄小读者之数学篇](2014-04-18 from 352558840@qq.com [南开大学 2014 年高等代数考研试题]二次型的零点)...

(2014-04-18 from 352558840qq.com [南开大学 2014 年高等代数考研试题]) 设 ${\bf A}$ 为实对称矩阵, 存在线性无关的向量 ${\bf x}_1,{\bf x}_2$, 使得 ${\bf x}_1^T{\bf A}{\bf x}_1>0$, ${\bf x}_2^T{\bf A}{\bf x}_2<0$. 证明: 存在线性无关的向量 ${\bf x}_3,{\bf …

从0到1详解推荐系统中的嵌入方法,原理、算法到应用都讲明白了

&#xff08;图片由AI科技大本营付费下载自视觉中国&#xff09;作者丨gongyouliu编辑丨lily来源 | 大数据与人工智能&#xff08;ID&#xff1a;&#xff09;前言作者曾在这篇文章中提到&#xff0c;矩阵分解算法是一类嵌入方法&#xff0c;通过将用户行为矩阵分解为用户特征矩…