51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2003|回复: 0
打印 上一主题 下一主题

appium自动化测试框架系列之基类以及公共类的封装

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-6-20 09:33:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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()
复制代码

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



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-25 06:51 , Processed in 0.061285 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表