python+selenium+unnittest框架
python+selenium+unnittest框架,以百度搜索为例,做了一个简单的框架,先看一下整个项目目录结构

我用的是pycharm工具,我觉得这个工具是天使,超好用也超好看!
这些要感谢原作者:https://blog.csdn.net/u011541946/article/details/70269965
但是我这里有些改动,主要是代码方面的,作者写的我运行有问题而且理解不了,改了一点
有几点注意强调一下:
1、不要建目录,要建python package会自动创建__init__.py,这样import的时候找得到package
2、函数还是选择无参会好一些,如果没有特别的需要
3、有很多api方法的使用不是很熟悉,但没关系,用到了搜一下就行了。有百度和google为什么还要自己死抠
4、有报错,请认真看报错信息,一个字都不能漏掉。指望原作者是不顶用的。
这里就列3个核心py
一、logger.py所有日志输出全靠它了!
#_*_coding:utf-8_*_ import logging
import os
import time class Logger(object): def __init__(self,logger):#logger就是给log起的名字 #创建一个logger
self.logger = logging.getLogger(logger)
self.logger.setLevel(logging.INFO) #创建一个hanlder,用于写入日志文件
request_time = time.strftime('%Y%m%d%H%M',time.localtime(time.time())) #生成一个当前日期的日期字符串
log_path = os.path.dirname(os.getcwd())+'/logs/' # os.getcwd()获取当前工作目录,os.path.dirname(os.getcwd())获取当前目录的上一级目录
log_name = log_path+request_time+'.log' #拼成日志名称 =路径+时间戳.log #创建一个handler,用于生成在磁盘上
fh = logging.FileHandler(log_name) #logging模块自带的三个handler之一。继承自StreamHandler。将日志信息输出到磁盘文件上。
fh.setLevel(logging.INFO) #再创建一个handler,用于输出控制台
sh = logging.StreamHandler()
sh.setLevel(logging.INFO) #定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter) #给handler设置格式
sh.setFormatter(formatter) #给logger添加handler 换句话说就是给该logger添加不同的handler
self.logger.addHandler(fh)
self.logger.addHandler(sh) def getlog(self):
return self.logger
怎么说呢,也许你看不懂,但没关系,我也是看了至少5遍才看懂。你就当是组件。有个步骤
1、先创建logger设置好日志名称
2、拼好生成的本地log文件,生成的最终是路径+文件名
3、创建logging的handler,你可以不用管这个是什么,就相当于句柄吧。控制台输出和文件输出还是不一样的方法
4、定义handler的输出格式
5、把控制台输出和文件输出的2个handler添加进第1步的logger中
二、浏览器引擎基础类本剧的核心browser_engine.py
#浏览器引擎类
import configparser
import os
from selenium import webdriver
from framework.logger import Logger mylogger = Logger(logger='TestMyLog').getlog() class BrowserEngine(object):
dir = os.path.dirname(os.path.abspath('.')) #注意相对路径获取方法
firefox_driver_path = dir+'/tools/geckodriver.exe'
chrome_driver_path = dir + '/tools/chromedriver.exe' def open_browser(self):
#读取配置文件
config = configparser.ConfigParser()
file_path = self.dir+'/config/config.ini'
print('file_path===========',file_path)
config.read(file_path)
#从配置 文件 中获取浏览器名称并打印日志
browser = config.get('browserType','browserName')
print('browser=========',browser)
mylogger.info('you had select %s' % browser)
#从配置文件 中获取要访问的URL并打印日志
url = config.get('testServer','URL')
print('url=============',url)
mylogger.info('you want to visit %s' %url)
if browser == 'Firefox':
self.driver = webdriver.Firefox(executable_path=self.firefox_driver_path)
mylogger.info('Starting firefox browser')
elif browser == 'Chrome':
self.driver = webdriver.Chrome(executable_path=self.chrome_driver_path)
mylogger.info('Starting chrome browser') # URL请求
self.driver.get(url)
mylogger.info('Open url: %s' % url) # 窗口全屏幕
self.driver.maximize_window()
mylogger.info('Maximize the current window')
# 加载等待时间
self.driver.implicitly_wait(5)
mylogger.info('Set implicitly wait 10 seconds') return self.driver def quit_browser(self):
mylogger.info('Now,Close and quit the browser')
self.driver.quit()
这个真的没啥了,玩过'一条道走到黑'(新手一个py走完全程的编程方法 )都看得懂。就是有些原来的东西抽出来当了变量全是旧知识点,
唯一用的新知识点是解析配置文件的库包configparser,就那么简单,读取配置文件。一个get就行了,其实相当于是找key-value
在这一步中,我修改了一些内容,与原作者不同。每个人的编程方法不同,没有好坏,只有对错和有无结果,大家见仁见智了!
三、测试类baidu_search.py
#coding=utf-8
import time
import unittest
from framework.browser_engine import BrowserEngine class BaiduSearch(unittest.TestCase): def setUp(self):
#得到driver
browser = BrowserEngine()
self.driver = browser.open_browser()
print(self.driver) def tearDown(self):
self.driver.quit() def test_baidu_search(self):
self.driver.find_element_by_id('kw').send_keys('selenium')
time.sleep(1)
try:
assert 'selenium' in self.driver.title
print('Test Pass')
except Exception as e:
print('Test Fail.',format(e)) if __name__ == '__main__':
unittest.main()
unnittest是python自带的单元测试包来着。其实相当于java中的junit。意思就是运行不需要再写主函数调用。
这里真没得啥要说的。就是核心类浏览器引擎类的调用。生成driver-启动打开页面-输入-断言
四、结果
控制台:

磁盘日志文件:

python+selenium+unnittest框架的更多相关文章
- python+selenium之框架设计
一.自动化测试框架 1.什么是自动化测试框架 简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境.自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本, ...
- 从零开始到设计Python+Selenium自动化测试框架-如何开始
如何开始学习web ui自动化测试?如何选择一门脚本语言?选择什么自动化测试工具? 本人已经做测试快5年,很惭愧,感觉积累不够,很多测试都不会,三年多功能测试,最近两年才开始接触和学习自动化测试.打算 ...
- 《一头扎进》系列之Python+Selenium自动化测试框架实战篇6 - 价值好几K的框架,呦!这个框架还真牛叉哦!!!
1. 简介 本文开始介绍如何通过unittest来管理和执行测试用例,这一篇主要是介绍unittest下addTest()方法来加载测试用例到测试套件中去.用addTest()方法来加载我们测试用例到 ...
- python selenium --unittest 框架
转自:http://www.cnblogs.com/fnng/p/3300788.html 学习unittest 很好的一个切入点就是从selenium IDE 录制导出脚本.相信不少新手学习sele ...
- Python selenium自动化测试框架入门实战--登录测试案例
本文为Python自动化测试框架基础入门篇,主要帮助会写基本selenium测试代码又没有规划的同仁.本文应用到POM模型.selenium.unittest框架.configparser配置文件.s ...
- python+selenium 自动化测试框架-学习记录
本人小白一枚,想着把学习时的东西以博客的方式记录下来,文章中有不正确的地方请大佬多多指点!!共同学习 前期准备 安装python3.selenium.下载对应版本的webdriver:安装所需的第三 ...
- Eclipse+Python+Selenium自动化测试框架搭建
1.下载Eclipse:http://www.eclipse.org/downloads/ 2.下载JDK:http://www.oracle.com/technetwork/java/javaee/ ...
- python + selenium 自动化测试框架
分享一个网站自动化测试框架 结构如下: test_project|--logs|---pages |---register_page.py| |---base_page.py|---test ...
- Python+Selenium+Unittest框架使用——Selenium——定位元素(二)
1.定位元素(id.name.class.link.partial link) (1)find_element_by_id() 用百度定位测试,用firebug查看定位元素 ,输入框的id为“kw”, ...
随机推荐
- nowcoder提高组2题解
T1 化一下试子就ok code #include<cstdio> #include<algorithm> inline long long read() { long lon ...
- loj#2013. 「SCOI2016」幸运数字 点分治/线性基
题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...
- BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)
题目链接 上下界费用流: /* 每个点i恰好(最少+最多)经过一次->拆点(最多)+限制流量下界(i,i',[1,1],0)(最少) 然后无源汇可行流 不需要源汇. 注: SS只会连i',求SS ...
- Python图形编程探索系列-04-网上图片与标签组件的结合
跳转到自己的博客 任务设定 任务:从网上找到一张图片,然后将其显示在标签上? 网上图片网站:http://pic.58pic.com/58pic/17/56/38/52w58PICtER_1024.j ...
- 潭州课堂25班:Ph201805201 爬虫高级 第三课 sclapy 框架 腾讯 招聘案例 (课堂笔记)
到指定目录下,创建个项目 进到 spiders 目录 创建执行文件,并命名 运行调试 执行代码,: # -*- coding: utf-8 -*- import scrapy from ..items ...
- C++ map<key , value> key值为指针
STL中map的key能否用char *呢?当然可以! 在程序中需要用到一个map,本来是这样写的, map<string, int> mapStr; 为了追求效率,把string改成了c ...
- php中14中排序方式的实现
<?php if (PHP_SAPI == 'cli') { define('EOL', PHP_EOL); define('T', "\t" ...
- 在global.asax中启动定时任务
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { Area ...
- DotNetty z
使用说明 客户端的代码和服务端的代码相差很少,体现了Netty统一的编程模型.有几个不同点: 客户端的Bootstrap不是ServerBootstrap: 客户端不需要主线程组,只有工作线程组,消息 ...
- App架构师实践指南四之性能优化一
App架构师实践指南四之性能优化一 1.性能维度常见用来衡量App性能的维度如图9-1所示.其中,性能指标包括电池(电量/温度).流量(上行流量/下行流量等).CPU(平均/最大/最小).内存 ...