技术标签: uiautomator2 自动化测试框架
1. 博主使用的是雷电模拟器,其它模拟器不适用此方法
2. 新建一个.py文件,开始编写脚本
# -*- coding:UTF-8 -*-
import os
import subprocess
from time import sleep
from optparse import OptionParser
class LeiDian(object):
def __init__(self):
# 启动虚拟机
self.start_vm = 'dnconsole.exe launch --name %d'
# 新增虚拟机
self.add_vm = 'dnconsole.exe add --name %d'
# 修改分辨率
self.alter_ratio = 'dnconsole.exe modify --index %d --resolution 540,960,240'
# 安装app
self.install_app = 'dnconsole.exe installapp --index %d --filename %s'
# app路径
self.app_path = 'D:\\Changzhi\Facebook_x86_128.apk'
# dnconsole.exe路径
self.ld_path = 'D:\\Changzhi\dnplayer2'
# 查看虚拟机所有信息
self.all_vm_info = 'doconsole.exe list2'
# 切换目录
def chair(self):
try:
retval = os.getcwd()
print("当前工作目录为 %s" % retval)
# 切换到当前路径
os.chdir(self.ld_path)
# 查看修改后的工作目录
retval2 = os.getcwd()
print("当前工作目录已修改为 %s" % retval2)
except Exception as e:
print(e)
else:
self.view_vm(index=61)
# 查看虚拟机
def view_vm(self, index):
data = subprocess.Popen('dnconsole.exe list2', stdout=subprocess.PIPE, universal_newlines=True)
# 虚拟机全部信息
# data_info = data.stdout.read()
number_list = []
for line in data.stdout:
# 含有换行符
info = line.strip().split(',')
vm_number = info[1]
number_list.append(vm_number)
if str(index) in number_list:
print('该虚拟机已经存在')
else:
self.make_vm(index=index)
# 创建模拟器
def make_vm(self, index):
subprocess.call(self.add_vm % index)
print('创建模拟器{}成功!'.format(index))
subprocess.call(self.alter_ratio % index)
print('修改模拟器{}分辨率成功!'.format(index))
subprocess.call(self.start_vm % index)
print('启动模拟器{}'.format(index))
print('开始安装Facebook!')
code = subprocess.call(self.install_app % (index, self.app_path))
if code == 0:
sleep(60)
print('安装Facebook成功!')
print('开始安装uiautomator2!')
subprocess.call('python -m uiautomator2 init')
print('安装uiautomator2成功!')
if __name__ == '__main__':
leidain = LeiDian()
leidain.chair()
3. 启动app,输入账号与密码,登录app
import uiautomator2 as u2
from time import sleep
import uiautomator2.ext.htmlreport as htmlreport
class LeiDian(object):
def __init__(self):
try:
self.d = u2.connect_usb('emulator-5656')
except Exception as e:
print(e)
# 全局设置,每个ui点击之后休眠1.5s
self.d.click_post_delay = 1.5
hrp = htmlreport.HTMLReport(self.d)
hrp.patch_click()
# 连接测试
def link_test(self):
if self.d.info['naturalOrientation'] == True:
print('设备连接正常!')
self.run_app()
else:
print('设备连接出现问题!请检查后重试!')
# 运行app
def run_app(self):
# 先返回主菜单界面
self.d.press('home')
self.d(text="Facebook").click()
self.login_app()
# 登录app
def login_app(self):
self.d(resourceId="com.facebook.katana:id/login_username").set_text('账号')
self.d(resourceId="com.facebook.katana:id/login_password").set_text('密码')
try:
self.d(text='登录').click()
except Exception as e:
print(e)
else:
print('正在登录>>>>>>\n请稍后>>>>>>')
if __name__ == '__main__':
leidain = LeiDian()
leidain.link_test()
4. 查找设备数量(也是非常有用的)
# 查找设备数量
def finddevices():
data = subprocess.Popen('adb devices', stdout=subprocess.PIPE, universal_newlines=True)
data_info = data.stdout.read()
devices = re.findall(r'(.*?)\s+device', data_info)
if len(devices) > 1:
deviceIds = devices[1:]
print('共找到%s个手机' % str(len(devices)-1))
for i in deviceIds:
print('ID为%s' % i)
return deviceIds
else:
print('没有找到手机,请检查')
return
finddevices()
5. 当你想要找的元素有多个相同的实例, 或者有时屏幕可能包含多个具有相同属性的视图时, 可以使用以下这种写法
year_number=int(d(className="android.widget.LinearLayout").child(className="android.widget.NumberPicker", instance=2).child(className="android.widget.EditText").get_text())
6. 元素点的状态辨别, 有些时候你定的元素的位置其实是没有问题的, 但是它总是或多或少的去点击另外一个看似毫不相干的点, 这个时候我们就要让它在重新点击回我们想要的位置, 也许你会想到做判断, 这是没有问题的, 如果它点击其它点较多的情况下适合. 但如果它点击其它的点就几乎一个的时候, 我们可以使用, 用这个点的点击状态来进行判断.
if d(descriptionStartsWith="Selected, Friend Requests").exists:
time.sleep(2)
d(resourceId="com.facebook.katana:id/news_feed_tab").click_exists(timeout=15)
7. 如果你不太会将可以滚动的元素滚动到指定位置时你可以试试这个方法(在git上还有它类似的写法)
文章浏览阅读4.7k次,点赞3次,收藏16次。当我们要分析一个lib库里的代码时,首先需要判断这是一个静态库还是一个导入库。库类型判断lib文件其实是一个压缩文件。我们可以直接使用7z打开lib文件,以查看里面的内容。如果里面的内容是obj文件,表明是静态库。如果里面的内容是dll文件,表明是导入库。导入库里面是不包含代码的,代码包含在对应的dll文件中。从lib中提取obj静态库是一个或者多个obj文件的打包,这里有两个方法从中提取obj:Microsoft 库管理器 7z解压Microsoft 库管理器(li_libtersafe
文章浏览阅读5.3k次,点赞3次,收藏3次。了解一下,省的脑壳痛 桥接模式对应的虚拟网络名称“VMnet0” 桥接模式下,虚拟机通过主机的网卡进行通信,若物理主机有多块网卡(有线的和无线网卡),应选择桥结哪块物理网卡桥接模式下,虚拟机和物理主机同等地位,可以通过物理主机的网卡访问外网(局域网),一个局域网的其他计算机可以访问虚拟机。为虚拟机设置一个与物理网卡在同个网段的IP,则虚拟机就可以与物理主机以及局域..._linux 查询网络适配器
文章浏览阅读3.4w次,点赞77次,收藏438次。# 前言2020 12月 1+X Web 前端开发中级 模拟题大致就更这么多,我的重心不在这里,就不花太多时间在这里面了。但是,说说1+X Web前端开发等级考证这个证书,总有人跑到网上问:这个证书有没有用? 这个证书含金量高不高?# 关于考不考因为这个是工信部从2019年才开始实施试点的,目前还在各大院校试点中,就目前情况来看,知名度并不是很高,有没有用现在无法一锤定音,看它以后办的怎么样把,软考以前也是慢慢地才知名起来。能考就考吧,据所知,大部分学校报考,基本不用交什么报考费(小部分学校,个别除._1+xweb前端开发中级
文章浏览阅读2.5w次,点赞46次,收藏345次。Linux安装mysql(官方教程!)_linux安装mysql8.0
文章浏览阅读3.5w次,点赞19次,收藏18次。win10微软账号登陆报错:0x80190001解决方案_微软账户登录0x8019001
文章浏览阅读1.5k次。Azure DevOpsAzure DevOps 汇集人员、流程和技术,实现软件交付自动化,为用户提供持续的价值。借助 Azure DevOps 解决方案,帮助您全流程构建你的软件产品,它使流程和产品更可靠。Azure DevOps帮助你用敏捷工具计划项目;用Git管理你的代码;..._azure devops approve
文章浏览阅读1.2w次,点赞28次,收藏61次。Hugging face 资源很不错,可是国内下载速度很慢,动则GB的大模型,下载很容易超时,经常下载不成功。很是影响玩AI的信心。经过多次测试,终于搞定了下载,即使超时也可以继续下载。真正实现下载无忧!究竟如何实现?且看本文分解。_huggingface_hub
文章浏览阅读3.5k次,点赞2次,收藏7次。其中 `DEFAULT CHARSET` 和 `COLLATE` 分别指定了表的默认编码和排序规则。其中 `DEFAULT CHARACTER SET` 指定了数据库的默认编码。其中 `Collation` 列指定了字段的排序规则,这也是字段的默认编码。此命令将更改表的默认编码和排序规则。此命令将更改字段的编码和排序规则。此命令将更改数据库的默认编码。_查看数据库编码
文章浏览阅读1.3k次,点赞7次,收藏24次。本文深入探讨了集成学习及其在随机森林中的应用。对集成学习的基本概念、优势以及为何它有效做了阐述。随机森林,作为一个集成学习方法,与Bagging有紧密联系,其核心思想和实现过程均在文中进行了说明。还详细展示了如何在Sklearn中利用随机森林进行建模,并对其关键参数进行了解读,希望能帮助大家更有效地运用随机森林进行数据建模。_bagging数据集
文章浏览阅读383次。创建的对话框类为 CMFCTEST2Dlg在 MFCTEST2Dlg.h : 头文件 定义#define WM_MYMESSAGE (WM_USER + 100) //step 1....// 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPA..._自定义消息发送到企业微信对话框怎么实现
文章浏览阅读2.4k次,点赞3次,收藏2次。这段时间进行openstack控制台界面的开发有2个多月,感觉学到了不少东西。1、前端 首先是前端的技术,之前只知道简单的html语法,对CSS,JS,JQUERY等一窍不通。年后,小组开发人手不是很够,果断转行去开发,记得刚开始,搞个练手的界面,搞了两天才实现。而且前提是别人写好的结构,拿过来修改使用。熟读唐诗三百首,不会做诗也会吟的境界。但是一旦碰到没有样例的界面,那就头疼了_openstack console开发
文章浏览阅读4k次,点赞4次,收藏26次。INA180电流检测电路_ina180