Selenium+Unittest自动化测试框架实战详解

本文详述了使用Selenium+Unittest构建自动化测试框架的实践过程,涵盖了配置文件、日志记录、Page Object Model(POM)、页面元素管理、测试用例编写及执行、测试报告生成和邮件发送等关键步骤。通过实例展示了如何提高自动化测试的效率和可维护性。
摘要由CSDN通过智能技术生成

目录

前言

项目框架

首先管理时间

!/usr/bin/env python3

-- coding:utf-8 --

配置文件

conf.py

config.ini

读取配置文件

记录操作日志

简单理解POM模型

管理页面元素

封装Selenium基类

创建页面对象

熟悉unittest测试框架

编写测试用例

执行用例

生成测试报告

执行并生成报告

发送结果邮件

总结:


前言

selenium自动化+unittest测试框架

  • 本章你需要
    • 一定的python基础——至少明白类与对象,封装继承

    • 一定的selenium基础——不讲selenium,

项目框架

开始之前先简单介绍一下框架体系吧:

目录/文件 说明 是否为python包
common 常见的通用类。如:读取config文件,元素文件
config 配置文件目录
logs 日志文件目录
page selenium基类
page_element 页面元素
page_object 页面对象POM设计模式,本人对这个的理解来自于苦叶子的博客
report 报告目录
TestCase 测试用例
utils 工具类。如:邮箱、日志
run_case.py 总执行文件
script 常用脚本目录
  • 框架有什么优点呢?
    • 代码复用率高,如果不使用框架的话,代码会很冗余
    • 可以组装日志、报告、邮件等一些高级功能
    • 提高元素等数据的可维护性,元素发生变化时,只需要更新一下配置文件
    • 使用更灵活的PageObject设计模式

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

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

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


 Python自动化测试学习交流群:全套自动化测试面试简历学习资料获取点击链接加入群聊【python自动化测试交流】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DhOSZDNS-qzT5QKbFQMsfJ7DsrFfKpOF&authKey=eBt%2BF%2FBK81lVLcsLKaFqnvDAVA8IdNsGC7J0YV73w8V%2FJpdbby66r7vJ1rsPIifg&noverify=0&group_code=198408628

 

首先管理时间

<span style="color:#596172"><span style="background-color:#ffffff"><code class="language-go">首先呢,因为用到时间的地方可能会比较多,所以我们也单独把时间封装成一个模块。让其他模块来调用即可。

在<span style="color:#98c379">`utils`</span>目录中新建<span style="color:#98c379">`times.py`</span>文件。填入以下内容。

<span style="color:#98c379">``</span><span style="color:#98c379">`python
</span></code></span></span>

!/usr/bin/env python3

-- coding:utf-8 --

import time
import datetime
from functools import wraps

def timestamp():
"""时间戳"""
return time.time()

def datetime_strftime(fmt="%Y%m"):
"""datetime格式化时间"""
return datetime.datetime.now().strftime(fmt)

def sleep(seconds=1.0):
"""
睡眠时间
"""
time.sleep(seconds)

def run_time(func):
"""运行时长"""

<span style="color:#596172"><span style="background-color:#ffffff"><code class="language-python"><span style="color:#61aeee">  @wraps(func)</span>
  <span style="color:#7171bf">def</span> <span style="color:#61aeee">wrapper</span>(*args, **kwargs):
      start_time = timestamp()
      res = func(*args, **kwargs)
      <span style="color:#7171bf">print</span>(<span style="color:#98c379">"Done!用时%.3f秒!"</span> % (timestamp() - start_time))
      <span style="color:#7171bf">return</span> res

  <span style="color:#7171bf">return</span> wrapper
</code></span></span>

if name == 'main':
print(timestamp())

<span style="color:#596172"><span style="background-color:#ffffff"><code class="language-go"><span style="color:#98c379">``</span><span style="color:#98c379">`
</span></code></span></span>

配置文件

配置文件总是一个项目的重要组成部分!

在项目中我们创建config文件目录,里面存放我们本次项目所需要的配置文件。包括我们常用的目录管理和一些设置。

conf.py

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

<span style="color:#596172"><span style="background-color:#ffffff"><code class="language-python"><span style="color:#5c6370"><em>#!/usr/bin/env python3</em></span>
<span style="color:#5c6370"><em># -*- coding:utf-8 -*-</em></span>
<span style="color:#7171bf">import</span> os
<span style="color:#7171bf">from</span> selenium.webdriver.common.by <span style="color:#7171bf">import</span> By
<span style="color:#7171bf">from</span> utils.times <span style="color:#7171bf">import</span> datetime_strftime


<span style="color:#7171bf">class</span> <span style="color:#61aeee">ConfigManager</span>(<span style="color:#61aeee">object</span>):
    <span style="color:#5c6370"><em># 项目目录</em></span>
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

    <span style="color:#5c6370"><em># 配置文件</em></span>
    INI_PATH = os.path.join(BASE_DIR, <span style="color:#98c379">'config'</span>, <span style="color:#98c379">'config.ini'</span>)

    <span style="color:#5c6370"><em># 页面元素目录</em></span>
    ELEMENT_PATH = os.path.join(BASE_DIR, <span style="color:#98c379">'page_element'</span>)

    <span style="color:#5c6370"><em># 报告目录</em></span>
    REPORT_PATH = os.path.join(BASE_DIR, <span style="color:#98c379">'report'</span>)

    <span style="color:#5c6370"><em># 测试用例</em></span>
    TEST_SUITES = os.path.join(BASE_DIR, <span style="color:#98c379">"TestCase"</span>)

    <span style="color:#5c6370"><em># 元素定位的类型</em></span>
    LOCATE_MODE = {
        <span style="color:#98c379">'css'</span>: By.CSS_SELECTOR,
        <span style="color:#98c379">'xpath'</span>: By.XPATH,
        <span style="color:#98c379">'name'</span>: By.NAME,
        <span style="color:#98c379">'id'</span>: By.ID,
        <span style="color:#98c379">'class'</span>: By.CLASS_NAME
    }

    <span style="color:#5c6370"><em># 邮件信息</em></span>
    EMAIL_INFO = {
        <span style="color:#98c379">'username'</span>: <span style="color:#98c379">'1084502012@qq.com'</span>,  <span style="color:#5c6370"><em># 切换成你自己的地址</em></span>
        <span style="color:#98c379">'password'</span>: <span style="color:#98c379">'QQ邮箱授权码'</span>,
        <span style="color:#98c379">'smtp_host'</span>: <span style="color:#98c379">'smtp.qq.com'</span>,
        <span style="color:#98c379">'smtp_port'</span>: <span style="color:#d19a66">465</span>
    }

    <span style="color:#5c6370"><em># 收件人</em></span>
    ADDRESSEE = [<span style="color:#98c379">'1084502012@qq.com'</span>, ]

<span style="color:#61aeee">    @property</span>
    <span style="color:#7171bf">def</span> <span style="color:#61aeee">log_path</span>(self):
        <span style="color:#5c6370"><em># 日志目录</em></span>
        log_path = os.path.join(self.BASE_DIR, <span style="color:#98c379">'logs'</span>)
        <span style="color:#7171bf">if</span> <span style="color:#7171bf">not</span> os.path.exists(log_path):
            os.makedirs(log_path)
        <span style="color:#7171bf">return</span> os.path.join(log_path, <span style="color:#98c379">'{}.log'</span>.<span style="color:#7171bf">format</span>(datetime_strftime()))

<span style="color:#61aeee">    @property</span>
    <span style="color:#7171bf">def</span> <span style="color:#61aeee">report_path</span>(self):
        <span style="color:#98c379">"""报告文件"""</span>
        _path = self.REPORT_PATH
        <span style="color:#7171bf">if</span> <span style
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值