本文是基于Python+uiautomator+adb命令,实现简单的Android自动化测试入门教程
此入门教程需要准备以下事项
1、Python 3.6环境,Python语言基础
2、Python导入uiautomator模块
配置pip环境变量 在这个路径下 Python\Python36-32\Scripts
cmd 中输入pip insatll uiautomator
出现Successfully后
进入 Python 输入import uiautomator 没有报异常说明模块可以正常使用
3、Android SDK自带的uiautomatorviewer
4、adb环境,有Android SDK也就有adb的
接下来进入主题
首先要找到uiautomatorviewer工具,为方便下次使用可以发到桌面快捷方式
然后手机连上PC,开启开发者选项,开启USB调试
点击菜单栏第二个图标,即可获取手机当前界面元素,动态界面可能会无法获取到元素
提示:如果在这一步无法获取到界面元素,可以找到这个路径C:\Users\FirmDapeng\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\uiautomator-0.3.2-py3.6.egg\uiautomator\libs(也可以直接在Python安装路径下搜uiautomator)的apk文件
adb install 安装
如果安装失败,执行一下这两个命令:
adb uninstall com.github.uiautomator
adb uninstall com.github.uiautomator.test
回到 uiautomator
注意红框中的三个元素,其中两个元素在脚本中的写法和显示的不一样
text resourceId className
有了这些元素我们就可以开始进行简单的Android UI自动化测试
下面是一个简单的测试脚本,我会逐行给大家讲解
这个脚本里可以在出现界面异常时,自动截图后发送到我指定的邮箱中,调用的脚本我会附在文末
duoji-UI-test.py
#-*- coding:UTF-8 -*-
# author:Peng Ji time:2018/5/11
import os #导入系统命令模块,用于调用adb命令来启动指定APP
import time #导入时间模块,用于调用时间等待
import automail #这里是导入我打包的自动发送mail脚本
import uiautomator #导入uiautomator模块
from uiautomator import device as d #导入uiautomator模块中的device方法命名为d
Phone=d.info #d.info会返会设备信息,需要注意的是,返回的是字典型
print(Phone) #在屏幕上打印出设备信息
h=Phone['displayHeight'] #这里是从设备信息中获取屏幕的尺寸
w=Phone['displayWidth']
def devicesInfo():
print('获取设备信息')
Phone=d.info #d.info会返会设备信息,需要注意的是,返回的是字典型
print(Phone) #在屏幕上打印出设备信息
try:
devicesInfo()#这里是捕获各种异常,出现异常会提示 "获取设备信息失败,请检查设备连接"
except:
print("获取设备信息失败,请检查设备连接")
def LaunchAPP():
print('启动APP')
os.system("adb shell monkey -p com.hlhdj.duoji -c android.intent.category.LAUNCHER 1")
#这里是调用cmd adb shell 启动指定的APP ,这里的包名可以从uiautomatorviewer 中看到
if d(resourceId="com.hlhdj.duoji:id/home_topbar_rl_search").wait.exists(timeout=20000):
#这里时判断APP首页中指定元素是否出现
print("APP启动成功")
else:
print("APP首页搜索框加载时间超过20S")
try:
LaunchAPP()
except:
print("APP启动失败")
print('启动APP')
time.sleep(8)
H1=int(h*(1810/1920))#首页按钮Y坐标 #这里就用的之前获取的屏幕尺寸,这样即使更换不同屏幕分辨率的设备,依然可以点击到对应坐标元素
W1=int(w*(86/1080))#首页按钮X坐标
d.click(W1,H1) #这里就是点击坐标
print('点击首页')
time.sleep(2)
d(resourceId="com.hlhdj.duoji:id/linear_icon_jingxuan").click()
#这里是点击指定的元素,括号里面是选择器,找到指定满足条件的元素后,进行点击
可以是text resourceId className
print('进入精选')
time.sleep(5)
if d(text="综合").exists: #这里是进行一个判断,如果点击后的界面出现 text="综合" 这个元素,就打印出成功
print('哆集精选进入成功')
time.sleep(2)
d.press.back() #这个是点击返回按键
else:
A1='哆集精选进入失败' #这里是打印出失败,同时赋值给截图这个方法,生成一张截图名称就是 哆集精选进入失败.png
print(A1)
d.screenshot(A1+'.png') #截图生成路径和运行脚本是同一个路径
d.press.back()
d(resourceId="com.hlhdj.duoji:id/linear_groabl").click()
print('进入全球购')
time.sleep(8)
if d(text="全球购首页").exists:
print('全球购进入成功')
time.sleep(2)
d.press.back()
else:
A1 = '全球购进入失败'
print(A1)
d.screenshot(A1 + '.png')
d.press.back()
d(resourceId="com.hlhdj.duoji:id/linear_desiger").click()
print('进入设计馆')
time.sleep(5)
if d(text="设计馆").exists:
print('设计馆进入成功')
time.sleep(2)
d.press.back()
else:
A1 = '设计馆进入失败'
print(A1)
d.screenshot(A1 + '.png')
A=A1
automail.send(A) #将报错的截图添加到前面导入的automail模块中,通过mail中发送到指定的邮箱
d.press.back()
d(resourceId="com.hlhdj.duoji:id/linear_kefu").click()
print('进入客服中心')
time.sleep(3)
if d(text="哆集登陆").exists: #这里也是判断,进入客服中心栏目出现“哆集登录” 就是未登录状态,需要进行登录
print('未登录账号')
d(resourceId="com.hlhdj.duoji:id/activity_loagin_user_phone").clear_text() #这里是清除指定元素的内容
d(resourceId="com.hlhdj.duoji:id/activity_loagin_user_phone").set_text("18111269811") #这里是在指定元素中输入指定内容
print('输入账户')
d(resourceId="com.hlhdj.duoji:id/activity_loagin_user_password").set_text("111111")
print('输入密码')
d(resourceId="com.hlhdj.duoji:id/activity_login_tv_login").click()
print('登陆完成')
d(resourceId="com.hlhdj.duoji:id/linear_kefu").click()
print('进入客服中心')
if d(text="哆集客服").exists: #这里就是已经登录的判断,如果出现“哆集客服”,就是已经登录的状态
print('客服中心进入成功')
time.sleep(2)
d.press.back()
else:
A1 = '客服中心进入失败'
print(A1)
d.screenshot(A1 + '.png')
import automail
A=A1
automail.send(A)
d.press.back()
time.sleep(6)
H5=int(h*(1810/1920))#个人中心按钮Y坐标
W5=int(w*(950/1080))#个人中心按钮X坐标
d.click(W5,H5)
print('点击个人中心')
d(resourceId="com.hlhdj.duoji:id/fragment_info_topbar_rb_setting").click()
print('点击设置')
d(resourceId="com.hlhdj.duoji:id/text_unregist_login").click()
print('退出当前账号')
d(resourceId="android:id/button1").click()
print('确定')
time.sleep(3)
for i in range(1,4):
d.press.back() #循环点击返回键,退出APP
print('点击返回',i)
automail.py
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
def send(A):
sender = '843961665@qq.com'
receivers = '2740939286@qq.com'
my_pass = 'xxx'
message = MIMEMultipart('related')
subject = '哆集商城界面出现异常'
message['Subject'] = subject
message['From'] = sender
message['To'] = receivers
content = MIMEText('<html><body><img src="cid:imageid" alt="imageid"></body></html>','html','utf-8')
message.attach(content)
file=open(A+'.png', "rb")
img_data = file.read()
file.close()
img = MIMEImage(img_data)
img.add_header('Content-ID', 'imageid')
message.attach(img)
try:
server=smtplib.SMTP_SSL("smtp.qq.com",465)
server.login(sender,my_pass)
server.sendmail(sender,receivers,message.as_string())
server.quit()
print ("邮件发送成功")
except smtplib.SMTPException as e:
print(e)
monitor.py #实现自定义时间监测需要执行这个脚本
import datetime
import os
import time
date = datetime.datetime.now()
time1 = date.strftime('%H')
# time1 = date.strftime('%M')
time1 = int(time1)
loop = 0
while time1 <= 23:
import os
os.system("python C:/Users/FirmDapeng/Desktop/test/duoji-UI-test.py")
date = datetime.datetime.now()
time1 = date.strftime('%H')
print(time1)
time1 = int(time1)
loop = loop + 1
print("执行第%s次" % loop)
time.sleep(180)
print("时间到停止监测")