python3+selenium框架设计05-配置文件和浏览器引擎类
python3配置文件的增删改查等操作可以使用内置的ConfigParser模块,可以自行百度学习,也可以看Python3学习笔记27-ConfigParser模块
配置文件一般存放着环境信息,比如url和一些测试过程中后续需要用到的字段。还有测试中需要导入,导出的一些文件。在项目下新建Config文件夹,文件夹下新建config.ini文件。项目结构如下
实际项目测试中,比如测试环境和生产的地址的切换,用户信息这些都是放在配置文件中,所以会频繁的使用对配置文件进行操作的方法,那我们就需要对配置文件的增删改查进行封装
先看下config.ini文件
因为ConfigParser模块在写入时会把注释给清空掉。所以如果要实现配置文件去控制想要测试哪个环境信息,只能配置一个开关。没办法通过去掉注释这种方法。
environment是配置一些开关,比如browser用来配置浏览器,可以设定0是谷歌浏览器,1是火狐浏览器。switch是环境开关,0是测试环境,1是生产环境
test放一些关于测试环境用到的信息
prod放一些关于生产环境用到的信息
接下来进行具体的实现。在Common文件夹下,对Base_Page.py文件添加全局变量
path = getcwd.get_cwd()
config_path = os.path.join(path, 'Config/config.ini')
config = configparser.ConfigParser()
config.read(config_path,encoding="utf-8-sig")
上面代码是为了提供配置文件的路径,接下来是封装配置的文件的增删改查
def config_get(self,key,section=None):
'''读取配置文件字段的值并返回'''
switch = config.get('environment', 'switch')
if section==None and switch == str(0):
section = 'test'
elif section==None and switch == str(1):
section = 'prod'
config_get = config.get(section,key)
return config_get
这是将读取配置文件的方法进行封装。代码中key是配置文件中section某个键,section是具体哪个部分的配置文件,默认是None。如果需要读的信息不是test或者prod下,才需要进行传入。来看下测试代码
from framework.Base_Page import BasePage s = BasePage(driver=1)
bro =s.config_get('browser','environment')
print('browser是:%s' %bro) url = s.config_get('url')
print('url是:%s' % url)
可以看到第一个如果要读取不是test或prod下的配置内容,需要把section和key都传进去,注意顺序先key再section。第二个因为switch是1,所以读的是prod下的,也就是生产环境的url。
接下来看写入配置文件
def config_write(self,key = None,value = None,section = None):
'''往配置文件写入键值'''
switch = config.get('environment', 'switch')
if section == None and switch == str(0):
section = 'test'
elif section == None and switch == str(1):
section = 'prod'
if key is not None and value is not None:
config.set(section,key,value)
log1.info('在section:%s下写入%s=%s' %(section,key,value))
with open(config_path,'w',encoding='utf-8')as f :
config.write(f)
else:
config.add_section(section)
log1.info('新增section:%s' % section)
with open(config_path,'w',encoding='utf-8')as f :
config.write(f)
和上面读取的思路差不多懒得解释了。来看测试代码。
s.config_write('用户名','username','environment')
s.config_write('yonghuming','username')
s.config_write(section='yonghu')
可以看到新增成功了。
再看下删除
def config_delete(self,key = None,section = None):
'''删除配置文件字段'''
switch = config.get('environment', 'switch')
if section == None and switch == str(0):
section = 'test'
elif section == None and switch == str(1):
section = 'prod'
if key is not None :
config.remove_option(section,key)
log1.info('删除section:%s下key为:%s的记录' % (section,key))
with open(config_path,'w',encoding='utf-8')as f :
config.write(f)
else:
config.remove_section(section)
log1.info('删除section:%s' % section)
with open(config_path,'w',encoding='utf-8')as f :
config.write(f)
和读取也是差不多的思路,看下测试代码
s.config_delete('用户名','environment')
s.config_delete('yonghuming')
s.config_delete(section='yonghu')
在对配置文件操作封装文成之后,封装浏览器引擎类,根据配置文件的不对,启动不同的浏览器。
def open_browser(self):
browser = self.config_get('browser','environment')
log1.info('读取浏览器配置')
url = self.config_get('url')
log1.info('读取url:%s' % url)
try:
if browser == str(0) :
self.driver = webdriver.Chrome()
log1.info('打开的浏览器为chrome')
elif browser == str(1) :
self.driver = webdriver.Firefox()
log1.info('打开的浏览器为chrome')
self.driver.get(url)
self.driver.maximize_window()
log1.info('浏览器最大化')
self.driver.implicitly_wait(10)
log1.info('设置静态等待时间10秒')
return self.driver
except BaseException:
log1.error('浏览器打开报错')
看下测试代码
from framework.Base_Page import BasePage
import unittest
class baidu(unittest.TestCase): def test_nos(self):
s = BasePage(self)
self.driver = s.open_browser() if __name__ == '__main__':
unittest.main()
我这边执行成功
python3+selenium框架设计05-配置文件和浏览器引擎类的更多相关文章
- python3+selenium框架设计06-编写POM测试用例
之前我们已经把测试基类,配置文件操作,浏览器引擎类封装完成.接下来使用POM的设计思路来创建我们的测试用例.接下来看一个实例,先在项目下新建pageobject文件夹.这个文件夹下放所有要测试的页面类 ...
- python3+selenium框架设计02-自动化测试框架需要什么
什么是自动化测试框架 自动化测试框架能够提供便利给用户高效完成一些事情,比如,结构清晰开发脚本,多种方式.平台执行脚本,良好的日志和报告去跟踪脚本执行结果. 关于自动化测试框架的定义有很多,在我大致理 ...
- python3+selenium框架设计03-封装日志类
首先我们先来实现日志的功能,日志可以使用python3自带logging模块,不会的可以百度一下相关文章,也可以看我另外一篇文章Python3学习笔记24-logging模块 在封装日志类前,我们需要 ...
- python3+selenium框架设计10-发送邮件
使用python3的email模块和smtplib模块可以实现发送邮件的动能.email模块用来生成email,smtplib模块用来发送邮件,接下来看如何在生成测试报告之后,并将报告放在邮件附件中并 ...
- python3+selenium框架设计04-封装测试基类
在完成了日志类封装之后,那我们就要对测试基类进行实现,在其中对一些请求再次封装,在项目下新建一个framework文件夹,在文件夹下新建Base_Page.py文件,这是用来写测试基类的文件.在项目下 ...
- python3+selenium框架设计01-Page Object
页面对象模型Page Object Modal是一种脚本设计模型,将页面元素,业务操作分割,当实际页面发生变化的时候,只需要修改页面元素文件,业务操作不需要修改. 具体实现需要先写一个页面公共类,里面 ...
- python3+selenium框架设计07-unittest单元测试框架
可以自行百度学习下单元测试框架,或者看Python3学习笔记26-unittest模块 在项目下新建一个entrance.py文件.并使用之前的测试用例进行演示.目前项目结构. 在entrance ...
- python3+selenium框架设计08-进一步实现POM
之前都是只有一个页面,一个用例.这次两个页面.两个测试用例.其实界面自动化测试最大的难点在于driver的传递,需要保持唯一性.另外就是断言的难点. 修改之前的BaiduPage,新增部分代码 fro ...
- python3+selenium框架设计09-生成测试报告
使用HTMLTestRunner可以生成测试报告.HTMLTestRunner是unittest模块下的一个拓展,原生的生成报告样式比较丑,GitHub上有大佬优化过后的版本:GitHub地址.下载之 ...
随机推荐
- 《老梁四大名著情商课》笔记-学学TA,你就是聚会的万人迷
<老梁四大名著情商课>笔记-学学TA,你就是聚会的万人迷 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 现在社会学家有一个统计,说中国处在单身状态大概有2个亿.这些人中 ...
- Jvm threaddump,heapdump的分析及问题定位
1 一.Thread Dump介绍 1.1 1.1什么是Thread Dump? 1.2 1.2 Thread Dump特点 1.3 1.3 Thread Dump 能诊断的问题 1.4 1.4如何抓 ...
- JAVA核心技术I---JAVA基础知识(回顾)
一:对象实例化问题: public class Rectangle { ; ; public int area() { return width * height; } } 则如下代码输出结果为: R ...
- Linux记录-JMX监控Tomcat上传到falcon
1.登录测试服务器xxxxxx xxxxxx su root输入xxxx 2.先修改Tomcat的启动脚本,(linux下为catalina.sh),添加以下内容: CATALINA_OPTS=&qu ...
- 解决Lost connection to MySQL server during query错误方法
昨天使用Navicat for MySQL导入MySQL数据库的时候,出现了一个严重的错误,Lost connection to MySQL server during query,字面意思就是在查询 ...
- python模块之序列化
序列化 什么是序列化 序列化是将字典.列表等数据类型转化成一个字符串的过程 序列化的目的 1. 以某种存储形式使自定义对象持久化(存储) 2. 将对象从一个地方传递到另一个我地方(传输) 3. 使程序 ...
- FastJson用法
namespace test { class Program { static void Main(string[] args) { var zoo1 = new zoo(); zoo1.animal ...
- matlab二维绘图学习摘要
1.二维图形plot plot(x1,y1,x2,y2) —— 多条曲线绘图格式 plot(x,y,’s’) —— 开关格式,开关量字符串s设定曲线颜色和绘图方式,使用颜色字符串的前1~3个字母, ...
- Chrome实用技巧集锦
1. 截取整个网页内容: 步骤:(F12 或 Ctrl Shift I 进入开发者模式) ——> Ctrl Shift P 弹出输入框 ——> 输入框中输入:Captrue ful ...
- constraintLayout的一些高级用法 布局一个16:9的图片 以及GuideLine的使用
<!-- "W,9:16" 同样的效果 --> <ImageView android:layout_width="0dp" android:l ...