51Testing软件测试论坛

标题: appium自动化测试框架系列之基类以及公共类的封装 [打印本页]

作者: 草帽路飞UU    时间: 2019-6-20 09:33
标题: appium自动化测试框架系列之基类以及公共类的封装
appium自动化测试框架系列之基类以及公共类的封装

基于对设计框架时的分析,主要的实现的功能时对移动端中对应场景通过代码自动完成指定的操作,首页以实现基本的操作的类作为基类,放置与baseView文件夹。

基类代码如下:

  1. #coding=utf-8


  2. # 完成基类的封装
  3. class BaseView(object):
  4.     def __init__(self, driver):
  5.         self.driver = driver


  6.     #寻找元素
  7.     def find_element(self, *args,**kwargs):
  8.         return self.driver.find_element(*args, **kwargs)

  9.     #寻找元素列表
  10.     def find_elements(self, *args, **kwargs):
  11.         return self.driver.find_elements(*args, **kwargs)

  12.     #获取屏幕尺寸
  13.     def get_window_size(self):
  14.         return self.driver.get_window_size()

  15.     #滑动
  16.     def swipe(self, start_x, start_y, end_x, end_y, duration):
  17.         return self.driver.swipe(start_x, start_y, end_x, end_y, duration)
复制代码

而公共类则作为实现常用的方法的封装而成,放置于common文件夹下,包含了以下3个文件:

1.启动脚本:desire_caps.py

  1. import json
  2. from appium import webdriver
  3. import os
  4. import logging.config

  5. CON_LOG = r'../config/log.conf'
  6. logging.config.fileConfig(CON_LOG)
  7. logging = logging.getLogger()

  8. def appium_desired():

  9.     with open("../config/desire_caps", "r") as file:
  10.         data = json.load(file)

  11.     desired_caps = {}
  12.     # print(data['platformName'])
  13.     desired_caps['platformName'] = data['platformName']
  14.     desired_caps['deviceName'] = data['deviceName']
  15.     desired_caps['deviceVersion'] = data['deviceVersion']

  16.     BASE_DIR = os.path.dirname(os.path.dirname(__file__))
  17.     App_Path = os.path.join(BASE_DIR, 'app', data['appName'])
  18.     desired_caps['app'] = App_Path

  19.     desired_caps['noReset'] = data['noReset']

  20.     desired_caps['unicodeKeyboard'] = data['unicodeKeyboard']
  21.     desired_caps['resetKeyboard'] = data['resetKeyboard']

  22.     desired_caps['appPackage'] = data['appPackage']
  23.     desired_caps['appActivity'] = data['appActivity']

  24.     logging.info('start run app...')
  25.     driver = webdriver.Remote("http://%s:%s/wd/hub" % (data['host'], data['port']), desired_caps)

  26.     driver.implicitly_wait(5)
  27.     return driver

  28. if __name__ == '__main__':
  29.     appium_desired()
复制代码

2.公用方法类:common_fun.py

  1. from baseViews.baseView import BaseView
  2. from selenium.webdriver.common.by import By
  3. from selenium.common.exceptions import NoSuchElementException
  4. from common.desire_caps import *
  5. import time
  6. import os
  7. import csv

  8. #完成公用的类及其方法
  9. class Common(BaseView):
  10.     def set_Btn(self, match, value):
  11.         Btn = (match, value)
  12.         return Btn

  13.     def check_updateBtn(self):
  14.         logging.info("===========check updateBtn=======")
  15.         btn_name = 'android:id/button2'
  16.         update_btn = self.set_Btn(By.ID, btn_name)
  17.         try:
  18.             element = self.find_element(update_btn[0], update_btn[1])
  19.         except NoSuchElementException:
  20.             logging.info("===not found update button====")
  21.         else:
  22.             logging.info("===check update button====")
  23.             element.click()

  24.     def check_skipBtn(self):
  25.         logging.info('====check skipBtn====')
  26.         btn_name = 'com.tal.kaoyan:id/tv_skip'
  27.         btn = self.set_Btn(By.ID, btn_name)
  28.         try:
  29.             element = self.find_element(btn[0], btn[1])
  30.         except NoSuchElementException:
  31.             logging.info("===not found skip button====")
  32.         else:
  33.             logging.info("===check skip button====")
  34.             element.click()

  35.     def get_screenSize(self):
  36.         '''
  37.         获取屏幕尺寸
  38.         :return:
  39.         '''
  40.         x = self.get_window_size()['width']
  41.         y = self.get_window_size()['height']
  42.         return (x, y)

  43.     def swipeLeft(self):
  44.         logging.info('swipeLeft')
  45.         l = self.get_screenSize()
  46.         y1 = int(l[1] * 0.5)
  47.         x1 = int(l[0] * 0.95)
  48.         x2 = int(l[0] * 0.25)
  49.         self.swipe(x1, y1, x2, y1, 1000)

  50.     def getTime(self):
  51.         self.now = time.strftime("%Y-%m-%d %H_%M_%S")
  52.         return self.now

  53.     def getScreenShot(self, module):
  54.         time = self.getTime()
  55.         image_file = os.path.dirname(os.path.dirname(__file__)) + '/screenshots/%s_%s.png' % (module, time)

  56.         logging.info('get %s screenshot' % module)
  57.         self.driver.get_screenshot_as_file(image_file)

  58.     def check_market_ad(self):
  59.         '''检测登录或者注册之后的界面浮窗广告'''
  60.         logging.info('=======check_market_ad=============')
  61.         self.wemedia = self.set_Btn(By.ID, 'com.tal.kaoyan:id/view_wemedia_cacel')
  62.         try:
  63.             element = self.driver.find_element(*self.wemedia)
  64.         except NoSuchElementException:
  65.             pass
  66.         else:
  67.             logging.info('close market ad')
  68.             element.click()

  69.     def get_csv_data(self, csv_file, line):
  70.         '''
  71.         获取csv文件指定行的数据
  72.         :param csv_file: csv文件路径
  73.         :param line: 数据行数
  74.         :return:
  75.         '''
  76.         BASE_DIR = os.path.dirname(os.path.dirname(__file__))
  77.         csv_file_path = os.path.join(BASE_DIR, 'data', csv_file)
  78.         with open(csv_file_path, 'r', encoding='utf-8-sig') as file:
  79.             reader = csv.reader(file)
  80.             for index, row in enumerate(reader, 1):
  81.                 if index == line:
  82.                     return row

  83. if __name__ == '__main__':
  84.     driver = appium_desired()
  85.     com = Common(driver)
  86.     com.check_updateBtn()
  87.     com.check_skipBtn()
  88.     com.swipeLeft()
  89.     com.swipeLeft()
  90.     com.getScreenShot('startapp')
复制代码

3.测试用例公用类:myunit.py

  1. import unittest
  2. from common.desire_caps import *
  3. from time import sleep

  4. class StartEnd(unittest.TestCase):

  5.     def setUp(self):
  6.         logging.info('===setup====')
  7.         self.driver = appium_desired()



  8.     def tearDown(self):
  9.         logging.info('====tearDown====')
  10.         sleep(5)
  11.         self.driver.close_app()
复制代码

当完成基类以及公用类的封装,下一步我们继续实现业务逻辑的脚本








欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2