下面我们开始第一个简单的Android UI自动化测试

1.使用adb命令连接真机或模拟器
2.打开uiautomatorviewer工具
3.使用uiautomatorviewer工具获取应用的元素进行定位
4.简单介绍unittest框架的使用方法
5.使用Python编写猫宁考勤应用注册模块的自动化测试

1.使用adb命令连接真机或模拟器:
手机USB连接电脑,进入开发者模式;

cmd命令:adb devices ,查看手机是否连接

python 调用安卓播放器 python调用android api_自动化测试


显示错误

这是因为adb的端口被占用,我们需要查看是什么应用占用了这个端口(5037为adb默认端口)

cmd命令 : netstat -aon|findstr “5037”

python 调用安卓播放器 python调用android api_android_02

可以看到占用5037端口对应的程序的PID号为8388;

cmd命令 : tasklist|findstr “8388”

python 调用安卓播放器 python调用android api_python_03

可以看出8388对应的程序为kadb.exe,说明该程序正在使用5037端口;

这时我们需要在任务管理器中结束kadb.exe进程,按快捷键“Ctrl+Shift+Esc”调出Windows任务管理器,找到“kadb.exe”,单击下方的结束进程即可!

python 调用安卓播放器 python调用android api_python 调用安卓播放器_04

我们再次运行cmd命令:adb devices

python 调用安卓播放器 python调用android api_python_05

这一步成功后我们才能运行sdk自带的uiautomatorviewer;
我们需要用uiautomatorviewer工具来获取元素,用于定位。

cmd命令:uiautomatorviewer,打开uiautomatorviewer界面

python 调用安卓播放器 python调用android api_验证码_06

或者找到sdk目录:sdk\tools中找到uiautomatorviewer.bat文件双击运行

python 调用安卓播放器 python调用android api_自动化测试_07

2.打开uiautomatorviewer工具

python 调用安卓播放器 python调用android api_自动化测试_08

我们可以根据text,resource-id,class等元素进行定位

3.使用uiautomatorviewer工具获取应用的元素进行定位

这里我使用python自带的IDLE进行编写测试脚本,打开python文件找到IDLE(python GUI)双击打开,如图:

python 调用安卓播放器 python调用android api_验证码_09

4.简单介绍unittest框架的使用方法

#  -*- coding:utf-8 -*-
from uiautomator import device as d
import unittest

class Mytest(unittest.TestCase):
    #初始化工作
    def setUp(self):
        print "--------------初始化工作"
    #退出清理工作
    def tearDown(self):
        print "--------------退出清理工作"

    #测试点击猫宁考勤case
    def test_login(self):
        d(text="猫宁考勤").click()
        print "--------------测试1"

    #测试2
    def test_z(self):
        print "--------------测试2"            #这里你可以写你的第二个测试用例,

    #测试3
    def test_w(self):
        print "--------------测试3"            #这里你可以写你的第三个测试用例。。。。。。。。。。。。。


if __name__ == '__main__':
        unittest.main()

结果如下:

Testing started at 21:14 …
————–初始化工作
————–测试1
————–退出清理工作
————–初始化工作
————–测试3
————–退出清理工作
————–初始化工作
————–测试2
————–退出清理工作

Process finished with exit code 0

从结果中我们可以看出unittest框架的运行方式为:
setUp 测试1 tearDown
setUp 测试2 tearDown
setUp 测试3 tearDown

5.使用Python编写猫宁考勤应用注册模块的自动化测试

#  -*- coding:utf-8 -*-
from uiautomator import device as d
import time
import unittest

class MyTestSuite(unittest.TestCase):
    # 初始化工作
    def setUp(self):
        print "--------------初始化工作"

    # 退出清理工作
    def tearDown(self):
        print "--------------退出清理工作"

    #***************************方法**************************************
    # 判断控件是否存在 & text
    def check_controls_exists(self, controls_text):
        if d(text=controls_text).exists:
            return 1
        else:
            return 0

    # 判断按钮是否置灰 & text & clickable
    def check_controls_click_text(self, controls_text):
        if d(text=controls_text).info.get("clickable") is True:
            return 1
        else:
            return 0

    #assertIn(a, b)     a in b
    def check_ainb(self,resourceid,b):
        if d(resourceId=resourceid).info.get("text") in  b:
            return 1
        else:
            return 0

    #***********************************************************

    # 注册模块
    def test_Aregister(self):
        try:
            time.sleep(2)
            #猫宁考勤开启全新时代
            self.assertEqual(self.check_controls_click_text("注册"),1,u"猫宁考勤开启全新时代")
            # 猫宁考勤开启全新时代--》点击注册按钮进入注册猫宁界面
            d(text="注册").click()
            time.sleep(3)
            #注册猫宁界面
            self.assertEqual(self.check_text("com.isentech.attendancet:id/regis_phone","请输入手机号码"),
                                              1,u"注册页面-》请输入手机号码")
            self.assertEqual(self.check_text("com.isentech.attendancet:id/regis_verifycode","请输入验证码"),
                                              1,u"注册页面-》请输入验证码")
            self.assertEqual(self.check_controls_click_text("获取验证码"), 0,u"注册页面-》获取验证码")
            self.assertEqual(self.check_controls_click_text("《中科爱讯服务协议》"), 1,u"注册页面-》《中科爱讯服务协议》")
            self.assertEqual(self.check_controls_click_text("注册"), 0,u"注册页面-》注册")
            time.sleep(2)
            #《中科爱讯服务协议》
            d(text="《中科爱讯服务协议》").click()
            time.sleep(2)
            self.assertEqual(self.check_ainb("com.isentech.attendancet:id/title","服务协议"), 1,u"注册页面-》服务协议")
            time.sleep(1)
            d(resourceId="com.isentech.attendancet:id/title_back").click()
            time.sleep(1)
            #手机号不输入是否能注册
            d(text="注册").click()
            time.sleep(3)
            # 手机号只输入1个数字是否能注册&只输入1个数字是否能获取验证码
            d(resourceId="com.isentech.attendancet:id/regis_phone").set_text("1")
            self.assertEqual(self.check_controls_click_text("获取验证码"), 0)
            time.sleep(1)
            d(text="注册").click()
            time.sleep(1)
            d(resourceId="com.isentech.attendancet:id/regis_phone").clear_text()
            time.sleep(1)
            #只输入5个数字是否能获取验证码
            d(resourceId="com.isentech.attendancet:id/regis_phone").set_text("11111")
            self.assertEqual(self.check_controls_click_text("获取验证码"), 0)
            time.sleep(1)
            d(resourceId="com.isentech.attendancet:id/regis_phone").clear_text()
            time.sleep(1)
            #只输入手机号是否能注册
            d(resourceId="com.isentech.attendancet:id/regis_phone").set_text(phone_number)
            self.assertEqual(self.check_controls_click_text("注册"), 0)
            time.sleep(1)
            d(text="注册").click()
            time.sleep(1)
            #输入正确的验证码&获取验证码是否高亮
            d(resourceId="com.isentech.attendancet:id/regis_verifycode").set_text("5648")
            time.sleep(1)
            self.assertEqual(self.check_controls_click_text("获取验证码"), 1)
            time.sleep(2)
            #密码只输入1个数字是否能注册&注册按钮是否高亮
            d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("1")
            d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("1")
            time.sleep(1)
            self.assertEqual(self.check_controls_click_text("注册"), 0,u"密码只输入1个数字是否能注册")
            time.sleep(1)
            d(resourceId="com.isentech.attendancet:id/regis_pass").clear_text()
            d(resourceId="com.isentech.attendancet:id/regis_passAgain").clear_text()
            time.sleep(1)
            #输入不相同的密码是否能注册
            d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("123456")
            d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("12345")
            time.sleep(1)
            self.assertEqual(self.check_controls_click_text("注册"), 0,u"输入不相同的密码是否能注册")
            time.sleep(1)
            d(resourceId="com.isentech.attendancet:id/regis_pass").clear_text()
            d(resourceId="com.isentech.attendancet:id/regis_passAgain").clear_text()
            time.sleep(1)
            #输入正确的密码是否能注册&我已同意是否打钩
            d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("123456")
            d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("123456")
            time.sleep(1)
            self.assertEqual(self.check_controls_click_resourceId("com.isentech.attendancet:id/regis_agree"), 1)
            self.assertEqual(self.check_controls_click_text("注册"), 1)
            time.sleep(2)
            d(text="注册").click()
            time.sleep(8)
        except Exception, e:
            print u"Error: 注册模块有问题\n", e

def test_app():
    test_unit = unittest.TestSuite()
    test_unit.addTest(MyTestSuite("test_Aregister"))

if __name__ == "__main__":
    # 测试app
    unittest.main()

uiautomator详细用法请参考这篇文章:https://github.com/xiaocong/uiautomator