2023最全最细的Selenium+Pytest自动化测试框架实战

2023最全最细的Selenium+Pytest自动化测试框架实战_第1张图片

 

选前言#  
selenium自动化+ pytest测试框架

本章你需要

一定的python基础——至少明白类与对象,封装继承

一定的selenium基础——本篇不讲selenium,不会的可以自己去看selenium中文翻译网

测试框架简介#
测试框架有什么优点呢:

代码复用率高,如果不使用框架的话,代码会很冗余
可以组装日志、报告、邮件等一些高级功能
提高元素等数据的可维护性,元素发生变化时,只需要更新一下配置文件
使用更灵活的PageObject设计模式
测试框架的整体目录
目录/文件    说明    是否为python包
common    这个包中存放的是常见的通用的类,如读取配置文件    是
config    配置文件目录    是
logs    日志目录    
page    对selenium的方放进行深度的封装    是
page_element    页面元素存放目录    
page_object    页面对象POM设计模式,本人对这个的理解来自于苦叶子的博客    是
TestCase    所有的测试用例集    是
utils    工具类    是
script    脚本文件    
conftest.py    pytest胶水文件    
pytest.ini    pytest配置文件
 

  这样一个简单的框架结构就清晰了。

知道了以上这些我们就开始吧!

我们在项目中先按照上面的框架指引,建好每一项目录。

注意:python包为是的,都需要添加一个__init__.py文件以标识此目录为一个python包。

首先管理时间#

首先呢,因为我们很多的模块会用到时间戳,或者日期等等字符串,所以我们先单独把时间封装成一个模块。

然后让其他模块来调用即可。在utils目录新建times.py模块

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import time
import datetime
from functools import wraps
 
 
def timestamp():
    """时间戳"""
    return time.time()
 
 
def dt_strftime(fmt="%Y%m"):
    """
    datetime格式化时间
    :param fmt "%Y%m%d %H%M%S
    """
    return datetime.datetime.now().strftime(fmt)
 
 
def sleep(seconds=1.0):
    """
    睡眠时间
    """
    time.sleep(seconds)
 
 
def running_time(func):
    """函数运行时间"""
 
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = timestamp()
        res = func(*args, **kwargs)
        print("校验元素done!用时%.3f秒!" % (timestamp() - start))
        return res
 
    return wrapper
 
 
if __name__ == '__main__':
    print(dt_strftime("%Y%m%d%H%M%S"))
 

添加配置文件#
配置文件总是项目中必不可少的部分!

将固定不变的信息集中在固定的文件中

conf.py#
项目中都应该有一个文件对整体的目录进行管理,我也在这个python项目中设置了此文件。

在项目config目录创建conf.py文件,所有的目录配置信息写在这个文件里面。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
from selenium.webdriver.common.by import By
from utils.times 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')
 
    # 报告文件
    REPORT_FILE = os.path.join(BASE_DIR, 'report.html')
 
    # 元素定位的类型
    LOCATE_MODE = {
        'css': By.CSS_SELECTOR,
        'xpath': By.XPATH,
        'name': By.NAME,
        'id': By.ID,
        'class': By.CLASS_NAME
    }
 
    # 邮件信息
    EMAIL_INFO = {
        'username': '[email protected]',  # 切换成你自己的地址
        'password': 'QQ邮箱授权码',
        'smtp_host': 'smtp.qq.com',
        'smtp_port': 465
    }
 
    # 收件人
    ADDRESSEE = [
        '[email protected]',
    ]
 
    @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, 'config', 'config.ini')
        if not os.path.exists(ini_file):
            raise FileNotFoundError("配置文件%s不存在!" % ini_file)
        return ini_file
 
 
cm = ConfigManager()
if __name__ == '__main__':
    print(cm.BASE_DIR)

注意:QQ邮箱授权码:点击查看生成教程

这个conf文件我模仿了Django的settings.py文件的设置风格,但是又有些许差异。

在这个文件中我们可以设置自己的各个目录,也可以查看自己当前的目录。

遵循了约定:不变的常量名全部大写,函数名小写。看起来整体美观。

config.ini#
在项目config目录新建一个config.ini文件,里面暂时先放入我们的需要测试的URL

[HOST]
HOST = https://www.baidu.com

读取配置文件#

配置文件创建好了,接下来我们需要读取这个配置文件以使用里面的信息。

我们在common目录中新建一个readconfig.py文件

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import configparser
from config.conf import cm
 
HOST = 'HOST'
 
 
class ReadConfig(object):
    """配置文件"""
 
    def __init__(self):
        self.config = configparser.RawConfigParser()  # 当有%的符号时请使用Raw读取
        self.config.read(cm.ini_file, encoding='utf-8')
 
    def _get(self, section, option):
        """获取"""&l

你可能感兴趣的:(selenium,pytest,测试工具,职场和发展)