本文是基于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 没有报异常说明模块可以正常使用

app开发调用python库 python调用android api_Python


3、Android SDK自带的uiautomatorviewer

4、adb环境,有Android SDK也就有adb的

app开发调用python库 python调用android api_uiautomator_02

接下来进入主题

首先要找到uiautomatorviewer工具,为方便下次使用可以发到桌面快捷方式

app开发调用python库 python调用android api_uiautomator_03

然后手机连上PC,开启开发者选项,开启USB调试

点击菜单栏第二个图标,即可获取手机当前界面元素,动态界面可能会无法获取到元素

app开发调用python库 python调用android api_Python_04

提示:如果在这一步无法获取到界面元素,可以找到这个路径C:\Users\FirmDapeng\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\uiautomator-0.3.2-py3.6.egg\uiautomator\libs(也可以直接在Python安装路径下搜uiautomator)的apk文件

app开发调用python库 python调用android api_uiautomator_05

 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启动失败")

app开发调用python库 python调用android api_uiautomator_06

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("时间到停止监测")