简单搭建UI自动化框架

1、环境:

语言:python

IDE:pycharn

测试工具:selenium+unittest+beautifulreport

测试页面:某网络设备

2、框架目录:

 

3、下载chrome浏览器对应版本驱动:driver\chromedriver.exe

https://npm.taobao.org/mirrors/chromedriver

 4、完成登录与注销的动作(话不多说、直接上代码)

浏览器驱动,放到common下:common\browser_engine.py

from selenium import webdriver
from common.conf_manage import config_manager


class BrowserEngine(object):

    def __init__(self):
        self.driver = webdriver.Chrome(executable_path=config_manager.CHROME_DRIVER)
        # Chrome浏览器驱动
        # self.driver = webdriver.Edge(executable_path=config_manager.EDGE_DRIVER)
        # Edge浏览器驱动


browser_engine = BrowserEngine().driver

数据文件:data\url.ini

[HOST]
host = http://1.1.1.1
[USERNAME]
username = admin
[PASSWORD]
password = admin

配置文件管理:common\config_manage.py

import os
from utils.time import dt_strftime


class ConfigManager(object):
    # 项目目录
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    # 页面元素目录
    ELEMENT_PATH = os.path.join(BASE_DIR, 'page_element')
    # 配置文件目录
    CSV_PATH = os.path.join(BASE_DIR, 'data')
    # driver文件
    CHROME_DRIVER = os.path.join(BASE_DIR, 'driver\\chromedriver.exe')
    EDGE_DRIVER = os.path.join(BASE_DIR, 'driver\\msedgedriver.exe')
    # 报告文件
    REPORT_FILE = os.path.join(BASE_DIR, 'report')
    REPORT_NAME = '**测试报告'
    # 截图
    IMG_FILE = os.path.join(BASE_DIR, 'img')

    @property
    def log_file(self):
        """日志目录"""
        log_dir = os.path.join(self.BASE_DIR, 'logs')
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)
        return os.path.join(log_dir, '{}.log'.format(dt_strftime()))

    @property
    def ini_file(self):
        """配置文件"""
        ini_file = os.path.join(self.BASE_DIR, 'data', 'url.ini')
        if not os.path.exists(ini_file):
            raise FileNotFoundError("配置文件%s不存在!" % ini_file)
        return ini_file


config_manager = ConfigManager()
if __name__ == '__main__':
    print(config_manager.BASE_DIR)
    print(config_manager.IMG_FILE)

读取ini文件:common\readini.py

import configparser
from common.conf_manage import config_manager


class ReadIni(object):
    """读取配置文件"""

    def __init__(self):
        self.config = configparser.RawConfigParser() 
        self.config.read(config_manager.ini_file, encoding='utf-8')

    def get(self, section, option):
        return self.config.get(section, option)

    @property
    def url(self):
        return self.get('HOST', 'host')

    @property
    def username(self):
        return self.get('USERNAME', 'username')

    @property
    def password(self):
        return self.get('PASSWORD', 'password')


ini = ReadIni()

if __name__ == '__main__':
    print(ini.url)

浏览器操作基类:page\web_page.py

from selenium.common.exceptions import TimeoutException

from common.browser_engine import browser_engine
from utils.logger import log


class WebPage(object):

    def __init__(self):
        self.driver = browser_engine
        # self.driver = driver

    def get_url(self, url):
        """
        打开网址
        :param url: 网址
        :return: 
        """
        self.driver.maximize_window()
        self.driver.set_page_load_timeout(10)
        try:
            self.driver.get(url)
            self.driver.implicitly_wait(10)
            log.info("打开网页:%s" % url)
        except TimeoutException:
            raise TimeoutException("打开%s超时" % url)

    def refresh(self):
        """
        刷新页面
        :return: 
        """
        log.info("刷新页面")
        self.driver.refresh()
        self.driver.implicitly_wait(10)


web_page = WebPage()
if __name__ == '__main__':
    web_page.get_url("http://172.30.12.183")

工具类:utils\logger.py

import logging
from common.conf_manage import config_manager


class Log:
    def __init__(self):
        self.logger = logging.getLogger()
        if not self.logger.handlers:
            self.logger.setLevel(logging.DEBUG)

            # 写入文件
            fh = logging.FileHandler(config_manager.log_file, encoding='utf-8')
            fh.setLevel(logging.INFO)

            # 输出到控制台
            sh = logging.StreamHandler()
            sh.setLevel(logging.INFO)

            # 定义输出的格式
            formatter = logging.Formatter(self.fmt)
            fh.setFormatter(formatter)
            sh.setFormatter(formatter)

            # 添加到handler
            self.logger.addHandler(fh)
            self.logger.addHandler(sh)

    @property
    def fmt(self):
        return '%(levelname)s\t%(asctime)s\t[%(filename)s:%(lineno)d]\t%(message)s'


log = Log().logger

if __name__ == '__main__':
    log.info('hello world')

工具类:utils\time.py

import datetime

def dt_strftime(fmt="%Y%m%d"):
    """
    格式化时间
    :param fmt "%Y%m%d %H%M%S
    """
    return datetime.datetime.now().strftime(fmt)


if __name__ == '__main__':
    print(dt_strftime("%Y%m%d%H%M%S"))

元素定位:page_element\ele_login_logout.py

class ElementLoginLogout:
    UserName = 'username'
    Password = 'pass_word'
    Login = 'loginIn'

    Admin = 'user_td'
    Logout = '//*[@id="user_popup"]/div[2]/div/span[3]/a'


element_login_logout = ElementLoginLogout()

页面操作:action\login_logout.py

from selenium.webdriver.common.by import By
from page_element.ele_login_logout import element_login_logout
from page.web_page import WebPage
import time


class LoginLogout(WebPage):
    def s6_login(self, username, password):
        driver = self.driver
        driver.find_element(By.ID, element_login_logout.UserName).send_keys(username)
        driver.find_element(By.ID, element_login_logout.Password).send_keys(password)
        time.sleep(2)
        driver.find_element(By.ID, element_login_logout.Login).click()

    def s6_logout(self):
        driver = self.driver
        driver.switch_to.default_content()
        driver.find_element(By.ID, element_login_logout.Admin).click()
        driver.find_element(By.XPATH, element_login_logout.Logout).click()
        driver.switch_to.alert.accept()

形成测试用例:test_function\test_login.py

import unittest
from action.login_logout import LoginLogout
from common.read_ini import ini
from utils.logger import log


class TestLoginLogout(unittest.TestCase):
    def test_login(self):
        login = LoginLogout()
        login.get_url(ini.url)
        login.s6_login(ini.username, ini.password)
        log.info("登录")

    def test_logout(self):
        logout = LoginLogout()
        logout.s6_logout()
        log.info("退出")

执行测试例:test_suites\test_suites_login_logout.py

import unittest
from common.conf_manage import config_manager
from test_function.test_login import TestLoginLogout
from BeautifulReport import BeautifulReport as bf

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(TestLoginLogout('test_login'))
        run = bf(suite)
    run.report(filename=config_manager.REPORT_NAME, description='测试', report_dir=config_manager.REPORT_FILE)

执行结果:

 

以上!

posted @ 2021-08-04 16:00  氦呀  阅读(349)  评论(0编辑  收藏  举报