Appium--pageobject实践(4)-unittest封装

前提:已配置好yaml应用初始化参数文件和log.conf日志配置文件

定义配置文件cap.yaml,包括key和value,具体内容如下:

platformName: Android 
platformVersion: 4.4.2 
deviceName: 127.0.0.1:62001 
app: apk文件路径
packageName: 包名 
appActivity: 主Activity 
unicodekeyboard: True 
resetkeyboard: True 
noReset: False 
ip: 127.0.0.1 
port: 4723 
uiautomationName: uiautomator2

定义日志配置文件logconf,脚本内容如下:

[loggers]

keys=root,main

[logger_root]

level=DEBUG

handlers=consoleHandler,fileHandler

[logger_main]

level=DEBUG

qualname=main

handlers=fileHandler

[handlers]

keys=consoleHandler,fileHandler

[handler_consoleHandler]

class=StreamHandler

level=DEBUG

formatter=fmt

args=(sys.stdout,)

[handler_fileHandler]

class=logging.handlers.RotatingFileHandler

level=DEBUG

formatter=fmt

args=('test.log','a')

[formatters]

keys=fmt

[formatter_fmt]

format=%(asctime)s - %(filename)s - %(levelname)s - [line:%(lineno)d] - %(message)s

创建启动app初始化模块:新建desired_caps.py文件,脚本内容如下

from appium import webdriver

import yaml

import  logging

import logging.config

#日志配置文件

CON_LOG='log.conf'

logging.config.fileConfig(CON_LOG)

logging=logging.getLogger()

def app_desired():

    #读取配置文件的数据

    file = open('cap.yaml', 'r')

    data = yaml.load(file)

    logging.info("Initialize  APP...")

    desired_caps = {}

    desired_caps['platformName'] = data['platformName']

    desired_caps['platformVersion'] = data['platformVersion']

    # 第一个模拟器默认127.0.0.1:62001  第二个默认:127.0.0.1:62025

    desired_caps['deviceName'] = data['deviceName']

    desired_caps['app'] = data['app']

    desired_caps['packageName'] = data['packageName']

    desired_caps['appActivity'] = data['appActivity']

    desired_caps['noReset'] = data['noReset']

    desired_caps['unicodekeyboard'] = data['unicodekeyboard']

    desired_caps['resetkeyboard'] = data['resetkeyboard']

    desired_caps['uiautomationName'] = data['uiautomationName']

    logging.info("Start APP...")

    driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(data['port']) + '/wd/hub', desired_caps)

    driver.implicitly_wait(8)

    return driver

#调试当前脚本方法

if __name__ == '__main__':

    app_desired()

 

创建基类,新建baseview.py文件,脚本内容如下:

class BaseView(object):

    def __init__(self,driver):

        self.driver=driver

    #普通元素定位

    def find_element(self,*loc):

        return self.driver.find_element(*loc)

    #元素定位返回一个数组list,一般用于判断元素是否存在

    def find_elements(self,*loc):

        return self.driver.find_elements(*loc)

    #获取屏幕大小

    def getsize(self):

        return self.driver.getsize()

    #滑动屏幕

    def swipe(self, star_x,star_y,end_x,end_y,duration):

        return self.driver.swipe( star_x,star_y,end_x,end_y,duration)



    def time_wait(self,t):

        return self.sleep(t)

 

创建公共类,创建lijitiyan.py文件,脚本内容如下:

 
#!urs/bin/python

#!_*_ coding:UTF-8 _*_

#从baseView.py文件内导入基类BaseView

from baseView import BaseView

from selenium.common.exceptions import NoSuchElementException

import logging

import time

from selenium.webdriver.common.by import By

#从desired_caps .py文件内导入app_desired

from desired_caps import app_desired

from time import sleep

import os

#定义类

class Common(BaseView):

    #定义"流量充值"按钮元素

    image_button=(By.ID,"com.mydream.wifi:id/tvAsk")

     #定义检测是否已进入首页函数

    def check_imagebutton(self):

        logging.info("========检测元素========")

        try:

            element=self.driver.find_element(*self.image_button)

        except NoSuchElementException:

            logging.info("========元素不存在========")

        else:

           # element.click()

            logging.info("========元素存在========")

    def screenshot(self):

        logging.info("========屏幕截图========")

        self.driver.save_screenshot()

    #获取系统当前时间的方法

    def getTime(self):

        self.now = time.strftime("%T-%m-%d %H_%M_%S")

        return self.now

    #定义屏幕截图的方法

    def getScreenShot(self,module):

        time=self.getTime()

        image_file=os.path.dirname(os.path.dirname(__file__))+'screenshots/%s_%s.png' %(module,time)



        logging.info('get %s screenshot' % module)

        self.driver.get_screenshot_as_file(image_file)



if __name__ == '__main__':

    #定义driver初始化

    driver=app_desired()

    com=Common(driver)

    com.check_imagebutton()

    com.getScreenShot("star APP")




 

创建登陆模块脚本,创建loginView.py文件,脚本内容如下:

from desired_caps import app_desired

from common_fun import Common

from lijitiyan import Common

from selenium.webdriver.common.by import By

import logging

from time import sleep

class LoginView(Common):



    username_type=(By.ID,'com.mydream.wifi:id/cacetMobile')

    password_type=(By.ID, 'com.mydream.wifi:id/cacetPwd')

    loginBtn=(By.ID, 'com.mydream.wifi:id/cbtnLogin')

    weTab=(By.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/'

                    'android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/'

                    'android.widget.TabHost/android.widget.LinearLayout/android.widget.TabWidget/android.widget.RelativeLayout[3]')

    login_type=(By.ID,'com.mydream.wifi:id/cbtnLogin')

    more_type=(By.ID,'com.mydream.wifi:id/title_third_login_button')

    def login_action(self,username,password):

        self.check_imagebutton()



        logging.info("========切换到我的tab页面========")

        self.driver.find_element(*self.weTab).click()

        logging.info("========进入登录页面========")

        self.driver.find_element(*self.login_type).click()

        logging.info("========进入账号密码登录页面========")

        self.driver.find_element(*self.more_type).click()

        logging.info("========输入账号和密码========")

        logging.info("账号是: %s" % username)

        self.driver.find_element(*self.username_type).send_keys(username)

        logging.info("密码是: %s" % password)

        self.driver.find_element(*self.password_type).send_keys(password)

        logging.info("========开始登录========")

        self.driver.find_element(*self.loginBtn).click()

        logging.info("========登录成功========")

        sleep(5)

        self.driver.save_screenshot("login.png")





if __name__ == '__main__':

    driver = app_desired()

    #logview继承Common,Common继承BaseVIew,BaseVIew要求传入参数

    l=LoginView(driver)

    l.login_action("18059869253","123456")

创建myunit.py文件,脚本内容如下:

import unittest
import logging
from desired_caps import app_desired
from time import sleep
class StarEnd(unittest.TestCase):
    #启动app
    def setUp(self):
        logging.info("========setUp========")
        self.driver=app_desired()
    def tearDown(self):
        logging.info("========tearDown========")
        sleep(5)
        self.driver.close_app()  #调用退出app的方法

创建test_unit.py,脚本内容如下:

from myunit import StarEnd

from loginView import LoginView #导入已封装好的登陆模块

import unittest

import logging



class TestLogin(StarEnd):   #继承myunit.py文件内的StarEnd类

#测试用例必须以test开头

    def test_login_01(self):

        logging.info("========登录成功========")

        l = LoginView(self.driver)

        l.login_action("18059869253", "123456")

    def test_login_02(self):

        logging.info("========登录密码错误========")

        l = LoginView(self.driver)

        l.login_action("15280265205", "123456")



if __name__ == '__main__':

    unittest.main()

猜你喜欢

转载自blog.csdn.net/Teamo_mc/article/details/83178967