封装App

App类概述

在demolib/app.py中封装你的应用App类DemoApp,实现App类的基本功能 qt4a.androidapp.AndroidApp 类提供了常见功能,如检测安装包、等待窗口出现,关闭当前窗口等,用户需要声明自己的App类,继承于AndroidApp基类。

App类封装

我们仍以Demo App为例,完整代码见Demo工程。被测应用的基本App类继承于AndroidApp类,只需实现最基本的功能,如下:

# -*- coding: utf-8 -*-

from qt4a.androidapp import AndroidApp

class DemoApp(AndroidApp):
    '''安卓Demo App类
    '''
    # 包名,必须定义
    package_name = 'com.qta.qt4a.demo'

    def __init__(self, device=None, clear_state=True, kill_process=True, net_type='wifi', start_extra_params={}):
        '''
        :param device: 设备实例
        :type device:  Device
        '''
        super(DemoApp, self).__init__(self.package_name, device)  #第一个参数传入主进程名,在demo app中,主进程名和包名相同
        self._start(clear_state, kill_process, start_extra_params=start_extra_params)

    def _start(self, clear_state=True, kill_process=True, start_extra_params={}):
        '''启动Android demo apk
        '''
        if kill_process == True:
            self.device.kill_process(self.package_name)  # 杀死已有进程
        if clear_state == True:
            self.device.clear_data(self.package_name) #清除包数据
        self.device.adb.start_activity('%s/%s.MainActivity' % (self.package_name, self.package_name), extra=start_extra_params)

上述代码只实现了最基本的功能,你可以根据需要定义更多的接口。__init__函数中需要实现:

  • 声明package_name属性,传入包名,AndroidApp类会去检查被测应用是否已安装。
  • 调用基类的__init__函数,以便初始化操作得以执行,此处传入了参数主进程名和device对象。
  • 杀死应用进程(kill_process调用),清除应用数据(clear_data调用),以便每次都会从应用的初始状态开始进入,这样可以知道每一步都会到达什么窗口界面,从而定义使用预期窗口。
  • 启动应用(start_activity调用)。

启动应用时,需要传入要启动的Activity参数,如果你不清楚被测应用的启动Activity,你可以调用QT4A的接口:

from qt4a.androiddriver.util import AndroidPackage
package = AndroidPackage(r'D:\demo.apk')
print (package.start_activity)
print (package.package_name)

由上可知,应用的包名也可以同时读取出来。更多的包信息可以参考该类的接口文档获取。这样便实现了一个最简单的被测应用App类。

App类功能自定义实现

如果你在启动应用前需要自定义一些其他操作,可以再自行实现。例如你在启动应用前希望去连接WIFI,那么可以在调用_start接口前先进行连接WIFI操作:

self._connect_network('wifi')
self._start(clear_state, kill_process, start_extra_params=start_extra_params)

然后自行实现_connect_network接口,例如:

def _connect_network(self, net_type):
'''连接网络
'''
   pass

所以请根据实际功能进行扩展开发。

App类使用

在用例中申请完设备后,即可开始实例化被测App,如下:

app = DemoApp(device)

传入设备实例参数device,在__init__函数中会先对应用数据进行清除,杀死应用进程,再启动应用,保证应用都是从启动界面开始。实例化App后,App会启动,进入启动界面:

../_images/login.png