滴~ 今日打卡!

 

好多天没来打卡了。博主最近一直在把碎片化知识转化为知识体系的过程中挣扎。Python语言、selenium、unittest框架、HTMLTestRunner框架都有所了解,也写了一批脚本去做项目的功能测试。但是感觉还是零零散散,串不起来。

所以这几天,一直在看各大博客、论坛,并尝试着自己搭一个自动化测试框架。到了今天,终于初见成效了。中间修修改改经历了很多,今天主要抽取核心部分谈谈自己的搭建思路(个人浅见,有更好idea的欢迎提出)。

首先,来看看整个项目的架构:

从上面两张结构图,大概讲讲每个模块下的类实现的一些方法:

1、config

||-config.yml  配置文件,主要存放一些全局配置变量,如:

(1)截图、报告、驱动存放路径;

(2)发送邮件使用到的发件人邮箱及登录密码(因为发送邮件一般用于自动发送测试报告,所以发件人比较固定);

(3)绕过登录验证码要写入的cookies信息

||-config.py   包含读取配置文件方法和一些全局参数

2、data

||-存放一些数据文件

!!-generator   一个生成各类型随机数据的类,里面包含生成随机汉字、指定位数的数字、字符串的方法,可以减少造测试数据的工作量

3、driver

||-存放浏览器驱动

4、log

||-logger.py   封装的日志类,输出不同级别的日志信息到指定的日志文件里

5、report

||-HTMLTestRunner.py  生成一个HTML格式的网页报告

6、test

||-pageObject  存放各个页面的元素、操作

||-test_suit     存放用例

7、utils

||-common    封装常用方法

||——base_page   页面基本操作(如前进、后退、关闭、切换窗口、弹窗处理、元素定位、点击、输入、截图等)

||-file_reader   封装各种数据文件读取方法,实现脚本参数化

||——csv_reader.py  读取csv文件,支持逐行或逐列读取数据

||——excel_reader.py  读取excel文件

||——yaml_reader.py  读取yml文件,配置文件读取就是调用这个类中的get_data()方法

 

接下来主要讲一下常用方法的封装。其实封装这些方法主要是为了完善各种日常操作的日志信息写入及异常处理。前进。后退、关闭、点击、输入这些都没什么特别的,主要就是调用driver的方法实现,再加上日志信息写入和一些异常处理即可。

着重讲一下切换窗口、日志信息写入、弹窗处理及元素定位三个方法

1、切换窗口:

分三种情况——当前有1/2/>2个窗口

①只有一个窗口,无法切换

②有两个窗口,直接切换到当前窗口外的另一窗口

③有两个以上窗口,遍历每个窗口,直到切换到的窗口是目标窗口(需要靠传入参数判断)为止

If len(driver.window_handles)==1:

#不做任何操作,输入警告日志信息

elif len(driver.window_handles)==2:

driver.switch_to_window(‘另一窗口句柄’)

else:

For window in driver.window_handles:

driver.switch_to_window(window)

If 当前窗口是目标窗口:

Break

2. 日志信息写入:

在每一个封装好的操作类里面,针对各种操作,写入对应日志信息。例如用常用方法类来说明

logger = Logger('BasePage').get_logger()

If len(driver.window_handles)==1:

Logger.warning(“当前只打开了一个窗口,无法切换!”)

elif len(driver.window_handles)==2:

driver.switch_to_window(‘另一窗口句柄’)

Logger.info(‘切换到另一窗口’)

else:

For window in driver.window_handles:

driver.switch_to_window(window)

If 当前窗口是目标窗口:

Break

3. 弹窗处理(主要针对alert和confirm弹窗)

首先需要判断弹窗是否出现?(使用EC.alert_is_present())

-Y 获取弹窗提示信息,与传入的预期提示信息比较,判断信息是否正确?

-Y 点击确认按钮,关闭弹窗

-N 写入错误日志,提示信息有误,并截图,点击确认按钮,关闭弹窗

-N 不需处理,写入日志,无弹窗

4. 元素定位

这里主要是使用find_element()的方法,传入参数格式为(By.方法,’表达式’)

使用find_element()方法需要导入By模块(from selenium.webdriver.common.by import By)

方法可选值:id、xpath、link text、partial link text、name、tag name、class name、css selector

最后,稍微提一下这个框架里的PageObject思想

PageObject(页面对象),简单点说就是把界面定位和业务操作分开。这个框架主要是把UI自动化分为三层:对象库层、操作层和业务层。

在pageObject文件夹下的各个page类,相当于是对象库层,主要存放各个页面的元素

Base_Page类相当于是操作层,再由各个page类继承Base_Object类来实现页面的一些基本操作。最后testcase中的各个用例类,类似业务层,并使用unittest框架组装并批量执行测试用例。

————————————————

基于python的自动化测试框架搭建的更多相关文章

  1. 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码

    引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...

  2. python web自动化测试框架搭建(功能&接口)——测试用例执行和结果收集

    由于unittest框架中结果收集在不同文件中,所以此处重写结果收集方法,加入执行时间,失败信息,失败截图等 TestRunner.py # coding=utf-8 import sys impor ...

  3. python web自动化测试框架搭建(功能&接口)——接口用例实现

    测试用例基类: # coding=utf-8 import unittest import Logger log = Logger.Loger() class BaseCase(unittest.Te ...

  4. python web自动化测试框架搭建(功能&接口)——接口公共方法

    接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ...

  5. python web自动化测试框架搭建(功能&接口)——接口测试模块

    Python接口测试采用python读取excel的方法,通过requests库发送请求和接收响应.模块有: Data:用于存放excel用例的,用例格式: iutil: 接口公共方法,数据引擎.ht ...

  6. python web自动化测试框架搭建(功能&接口)——功能测试模块

    功能测试使用selenium,模块有: 1.futil: 公共方法,如元素高亮显示 # coding=utf-8 """高亮显示元素""" ...

  7. python web自动化测试框架搭建(功能&接口)——通用模块

    1.通用模块: config.conf: 公共配置文件,配置报告.日志.截图路径,以及邮件相关配置 [report] reportpath = E:\workspace\WebAutomation\s ...

  8. Python web自动化测试框架搭建(功能&接口)——unittest介绍

    Python UnitTest测试框架介绍 1)         TestCase:所有测试用例类继承的基本类, TestCase的实例就是测试用例 2)         TestSuite:测试套件 ...

  9. python web自动化测试框架搭建(功能&接口)——环境搭建

    自动化测试框架一般需要实现以下通用功能 执行前准备 结束后清理 执行步骤输出 执行结果输出 错误.失败截图 测试报告 发送邮件 日志 需要的软件和python第三方库有: 通用: JDK Eclips ...

随机推荐

  1. C语言中main函数的参数argc和argv

    参考资料: http://wiki.opencv.org.cn/index.php/Main%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0argc%EF%BC%8Cargv% ...

  2. 最新 iOS 框架整体梳理(三)

    这一篇得把介绍框架这个系列终结了,不能超过三篇了,不然太长了..... 还是老规矩,前面两篇的机票在下方: 最新 iOS 框架整体梳理(一) 最新 iOS 框架整体梳理(二) Part - 3     ...

  3. 《Java并发编程的艺术》 第9章 Java中的线程池

    第9章 Java中的线程池 在开发过程中,合理地使用线程池能带来3个好处: 降低资源消耗.通过重复利用已创建的线程 降低线程创建和销毁造成的消耗. 提高响应速度.当任务到达时,任务可以不需要等到线程创 ...

  4. Spark如何与深度学习框架协作,处理非结构化数据

    随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片.音频.文本)进行大数据处理的业务场景越来越多.本文会介绍Spark如何与深度学习框架进行协同工作,在大数 ...

  5. arduino连接12864LCD方法

    arduino连接12864LCD方法,参考相关代码. https://blog.csdn.net/txwtech/article/details/95038386

  6. java并发编程-线程生命周期

    线程生命周期 现代操作系统在运行一个程序时,会为其创建一个进程.例如,启动一个Java程序,操作系统就会创建一个Java进程.现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight ...

  7. 弹性盒模型中flex-grow 和flex的区别

    在flex弹性盒模型体系中,flex-grow和flex都有对子元素进行放大的作用,但是这两个属性在放大时的计算方法不同,在使用时候要注意,使用正确的放大属性,从而达到自己想要的效果. 先来看下两个属 ...

  8. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

  9. MongoDB快速入门教程 (2)

    2.MongoDB的基本的CRUD操作 2.1.创建文档 在具体操作之前,想要知道有多少数据库,可以执行下面命令 show dbs 在mongodb中,数据库中包含的叫做集合(表),集合中存储的内容叫 ...

  10. 主线程用afxBeginThread()创建多个线程安全退出的办法

    HANDLE hand[]; CCriticalSection m_crisecoin; CEvent m_event; struct Student { int nNO; int nYear; CW ...