python+selenium+unittest自动化测试框架

前言

关于自动化测试的介绍,网上已有很多资料,这里不再赘述,UI自动化测试是自动化测试的一种,也是测试金字塔最上面的一层,selenium是应用于web的自动化测试工具,支持多平台、多浏览器、多语言来实现自动化,优点如下:

①开源、免费且对web界面有良好的支持;;

②多浏览器支持:chrome、Firefox、IE、Edge等;

③多平台支持:Linux、Windows、MAC;

④多语言支持:java、python、Ruby、C#、JavaScript、C++;

⑤简单(API简单)、灵活(开发语言驱动),支持分布式测试用例执行;

环境准备
  • 浏览器(Chrome)
  • Python
  • Selenium
  • chromedriver(请下载于Chrome对应版本的驱动)
  • IDE(Pycharm)

1、python、pycharm安装

2、selenium安装

pip install selenium ​

关于selenium元素定位是开展web自动化测试的基础和关键,总共有八种定位方式,包括id,class,xpath等

3、chromedriver驱动安装

驱动下载:http://chromedriver.storage.googleapis.com/index.html

然后把chromedriver.exe拷贝到到chrome的安装目录下…\Google\Chrome\Application\ ,同时把chrome的安装目录加入到path环境变量。

4、快速验证测试

自动化测试框架

  • config目录中存放的是测试配置相关的文件,文件类型ini,包括测试的网址、浏览器驱动等信息
  • framework目录中存放的是页面基础类base_page: 封装一些常用的页面操作方法;日志类 Logger: 封装日志输出及控制台输出方法
  • logs用来存放输出的日志文件
  • pageobjects目录存放的是页面对象,一个页面封装为一个类,一个元素封装为一个方法
  • screenshots目录存放的是测试过程中的相关截图
  • test_report用来存放输出的测试报告
  • testsuites目录存放测试用例,包括test_base和单个测试用例

1、config.ini配置信息如下:

2、framework目录下base_page的封装:


import timefrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support.select import Selectimport os.pathfrom framework.logger import Logger# 创建一个日志实例logger = Logger(logger="BasePage").getlog()class BasePage(object):"""定义一个页面基类,让所有页面都继承这个类,封装一些常用的页面操作方法"""def __init__(self, driver):self.driver = driver#get an url linkdef open(self,url):self.driver.get(url)#quit browser and end testingdef quit_browser(self):self.driver.quit()# 浏览器前进操作def forward(self):self.driver.forward()logger.info("Click forward on current page.")# 浏览器后退操作def back(self):self.driver.back()logger.info("Click back on current page.")# 显示等待def wait(self,loc,seconds):try:wait_=WebDriverWait(self.driver,seconds)wait_.until(lambda driver:driver.find_element(*loc))logger.info("wait for %d seconds." % seconds)except NameError as e:logger.error("Failed to load the element with %s" % e)# 保存图片def get_windows_img(self):"""把file_path保存到我们项目根目录的一个文件夹.\Screenshots下"""file_path = os.path.dirname(os.path.abspath('.')) + 'Selenium/screenshots/'rq = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))screen_name = file_path + rq + '.png'try:self.driver.get_screenshot_as_file(screen_name)logger.info("Had take screenshot and save to folder : /screenshots")except NameError as e:logger.error("Failed to take screenshot! %s" % e)self.get_windows_img()# 定位元素方法def find_element(self,loc):""":return: element"""return self.driver.find_element(*loc)# 输入def send_keys(self, selector, text):el = self.find_element(selector)el.clear()try:el.send_keys(text)logger.info("Had type \' %s \' in inputBox" % text)except NameError as e:logger.error("Failed to select in input box with %s" % e)self.get_windows_img()# 清除文本框def clear(self, selector):el = self.find_element(selector)try:el.clear()logger.info("Clear text in input box before typing.")except NameError as e:logger.error("Failed to clear in input box with %s" % e)self.get_windows_img()# 点击元素def click(self, selector):el = self.find_element(selector)try:el.click()logger.info("The element \'%s\' was clicked." % el.text)except NameError as e:logger.error("Failed to click the element with %s" % e)#鼠标事件(左键点击)def move_element(self,loc,sloc):mouse=self.find_element(loc)try:ActionChains(self.driver).move_to_element(mouse).perform()self.click(sloc)passexcept Exception as e:logger.error("Failed to click move_element with %s" % e)self.get_windows_img()# 强制等待@staticmethoddef sleep(seconds):time.sleep(seconds)logger.info("Sleep for %d seconds" % seconds)

 logger日志输入方法:


import loggingimport os.pathimport timeclass Logger(object):def __init__(self, logger):'''''指定保存日志的文件路径,日志级别,以及调用文件将日志存入到指定的文件中'''# 创建一个loggerself.logger = logging.getLogger(logger)self.logger.setLevel(logging.DEBUG)# 创建一个handler,用于写入日志文件rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))log_path = os.path.dirname(os.path.abspath('.')) + 'Selenium/logs/'log_name = log_path + rq + '.log'fh = logging.FileHandler(log_name)fh.setLevel(logging.INFO)# 再创建一个handler,用于输出到控制台ch = logging.StreamHandler()ch.setLevel(logging.INFO)# 定义handler的输出格式formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')fh.setFormatter(formatter)ch.setFormatter(formatter)# 给logger添加handlerself.logger.addHandler(fh)self.logger.addHandler(ch)def getlog(self):return self.logger

3、关于页面对象的写法参考:

页面对象继承于base_page基类


from framework.base_page import BasePagefrom selenium.webdriver.common.by import Byfrom framework.logger import Loggerlogger = Logger(logger="cloud_page").getlog()class Cloud(BasePage):#定位器input_box = (By.ID,'kw')search_submit = (By.XPATH,'//*[@id="su"]')def value_input(self, text):self.wait(self.input_box,5)self.send_keys(self.input_box, text)def submit_btn(self):self.click(self.search_submit)logger.info("show results!")self.sleep(2)

4、testsuite部分,每个用例都要执行的用例前的准备setup和清理teardown写在test_base文件里,单个测试用例文件继承于它


from selenium import webdriverimport unittestclass TestBase(unittest.TestCase):def setUp(self):self.driver=webdriver.Chrome() #驱动浏览器self.driver.implicitly_wait(10) #设置隐式等待self.driver.maximize_window() #最大化浏览器def tearDown(self):self.driver.quit()if __name__=='__main__':unittest.main()

测试用例参考,注意测试用例方法命名一定要以test开头


import timefrom testsuites.test_base import TestBasefrom pageobjects.baidu_page import Cloudclass BaiduSearch(TestBase):def test_baidu_search(self):"""这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。:return:"""input = Cloud(self.driver)input.open('https://www.baidu.com/')input.value_input('selenium') # 调用页面对象中的方法input.submit_btn() # 调用页面对象类中的点击搜索按钮方法time.sleep(2)input.get_windows_img() # 调用基类截图方法try:assert 'selenium' in 'selenium'print('Test Pass.')except Exception as e:print('Test Fail.', format(e))

5、最后就是核心代码,testrunner.py 用来批量执行测试用例,引用HTMLTestRunner模块生成测试报告。


import unittestfrom HTMLTestRunner import HTMLTestRunnerimport timeimport os# 定义输出的文件位置和名字DIR = os.path.dirname(os.path.abspath(__file__))now = time.strftime("%Y%m%d%H%M", time.localtime(time.time()))filename =now+"report.html"#discover方法执行测试套件testsuite = unittest.defaultTestLoader.discover(start_dir='./testsuites',pattern='*case.py',top_level_dir=None)with open(DIR+'/test_report/'+filename,'wb') as f:runner = HTMLTestRunner(stream=f,verbosity=2,title='gateway UI report',description='执行情况',tester='tester')runner.run(testsuite)

6、测试报告展示

总结

基于selenium实现的web自动化框架不仅轻量级而且灵活,可以快速的开发自动化测试用例。本篇中的框架设计比较简单,希望对大家以后的web自动化框架的设计和实现有所帮助,共同交流,共同进步!

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/388942.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AGV系统设计解析:布局-车体-对接-数量计算-路径规划

AGV AGV是实现柔性制造、装配及自动化物流的关键设备之一,近几年来,随着各国智能制造政策的不断实施,促进了AGV产业的快速发展。 目前,AGV系统广泛应用于各个行业之中,比如物流行业、新能源行业、汽车行业、制药行业等…

Python爬虫入门02:Fiddler下载使用教程

文章目录 手机抓包全攻略:Fiddler 工具深度解析引言Fiddler 工具简介为什么选择 Fiddler? 安装与配置 Fiddler步骤一:下载与安装步骤二:配置浏览器代理步骤三:安装 HTTPS 证书 配置手机以使用 Fiddler步骤一&#xff1…

堆的创建和说明

文章目录 目录 文章目录 前言 小堆: 大堆: 二、使用步骤 1.创建二叉树 2.修改为堆 3.向上调整 结果实现 总结 前言 我们已经知道了二叉树的样子,但是一般的二叉树是没有什么意义的,所以我们会使用一些特殊的二叉树来进行实现&a…

码农职场:一本专为IT行业求职者量身定制的指南

目录 写在前面 推荐图书 推荐理由 写在后面 写在前面 本期博主给大家推荐一本专为IT行业求职者量身定制的指南:《码农职场》。 推荐图书 https://item.jd.com/14716160.html 内容简介 这是一本专为广大IT 行业求职者量身定制的指南,提供了从职前…

Netty 必知必会(四)—— Channel-Pipeline 责任链

一、责任链模式 适用场景: 对于一个请求来说,如果每个对象都有机会处理它,而且不明确到底是哪个对象会处理请求时,我们可以考虑使用责任链模式实现它,让请求从链的头部往后移动,直到链上的一个节点成功处理了它为止 …

python爬虫初识

一、什么互联网 互联网(Internet)是全球范围内最大的计算机网络,它将数以百万计的私人、公共、学术、商业和政府网络通过一系列标准通信协议(如TCP/IP)连接起来形成的一个庞大的国际网络。 互联网的起源可以追溯到196…

Java 后端已经过时的技术,也是我逝去的青春

最近这段时间收到了一些读者的私信,问我某个技术要不要学,还有一些的同学竟然对 Java 图形化很感兴趣,还想找这方面的工作。 我接触 Java 已近 10多年了,见证了许多 Java 技术变迁,包括: JavaEE 框架&…

常见的应急救援设备有哪些_鼎跃安全

在我们的生活中,应急事件的发生常常是突如其来的,它们对人民的生命财产安全构成重大威胁,同时也对社会稳定提出严峻挑战。在这样的紧急情况下,迅速开展有效的救援工作显得尤为重要。而在整个救援过程中,应急设备的使用…

1-4章节复习总结

1-4章节总结 章节重点回顾-第一章-中央处理单元练习题 章节重点回顾-第一章-进制章节重点回顾-第一章-校验码奇偶校验码CRC循环冗余校验码海明码练习题 多草节重点回顾-第一草-计算机体系结构分类章节重点回顾-第一章-计算机指令练习题 章节重点回顾-第一章-指令流水线练习题 章…

canvas绘制表格

canvas绘制表格 最近在为公司产品做技术预研,经理让用canvas做一个表格,于是就有了这篇博客。 我们的数据是后端通过MQTT推送过来的 我在代码中也直接使用了 具体MQTT的实现代码,可见博客 在vue使用MQTT 在这里为了方便实用我直接封装成组件…

POI 快速入门 Excel导入导出

Excel导入导出 1 什么是POI POI简介(Apache POI),Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI官网http://poi.apache.org/ HSSF - 提…

攻防世界之《这个按钮做什么》题解

下载解压后,发现只有一个文件。 放入exeinfope软件里看看 根据activity猜测可能是安卓软件,修改文件后缀为.apk 然后用模拟器打开这个软件并会自动安装。 打开软件界面如下: 看得出来只有一个密码输入框,应该找到对应的密码就会…

每日一面系列之美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以

ConcurrentHashMap 为什么 key 和 value 不能为 null? ConcurrentHashMap 的 key 和 value 不能为 null 主要是为了避免二义性。null 是一个特殊的值,表示没有对象或没有引用。如果你用 null 作为键,那么你就无法区分这个键是否存在于 Concu…

仓颉语言 -- 网络编程

使用新版本 (2024-07-19 16:10发布的) 1、网络编程概述 网络通信是两个设备通过计算机网络进行数据交换的过程。通过编写软件达成网络通信的行为即为网络编程。 仓颉为开发者提供了基础的网络编程功能,在仓颉标准库中,用户可使用…

资源|Python入门必看书籍,适合零基础小白,附PDF

小编为初学Python的朋友们汇总了7本零基础入门书籍,包括Python三剑客等,都是在编程届多年畅销的书籍,也是众多从业者的选择,全文详细介绍了书籍主要内容,有需要的宝子根据自身情况自取 需要书籍PDF的宝子评论区留言哦 …

IIS解析漏洞~IIS6.X漏洞分析

类型代码量作用一句话木马代码量极少配合webshell管理工具使用小马代码量比小马多大马代码量最多功能比较完善(执行命令,文件操作等)图片马里面传有一句话木马 文件解析漏洞是由于中间件错误的将特殊格式的文件解析成可执行网页文件(脚本)&am…

我在高职教STM32——串口通信(4)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思的教学设计分享…

Python机器学习实战:分类算法之支持向量机-垃圾邮件识别

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。 目录 支持向量机算法介绍 练习题 Python代码与分析 支持向量机和朴素贝叶斯的联系 支持向量机算法介绍 支持向量机&#…

Notepad++ 安装 compare 插件

文章目录 文章介绍对比效果安装过程参考链接 文章介绍 compare 插件用于对比文本差异 对比效果 安装过程 搜索compare插件 参考链接 添加链接描述

企业邮箱如何支持免费试用?

企业邮箱如何支持免费试用?Zoho企业邮箱提供多种版本,支持免费试用,具备权威认证、信息安全、全球部署等特点。试用步骤包括访问官网、选择版本、输入信息、验证域名等。特色功能包括定制化界面、搜索、日程安排等。支持多种设备和操作系统。…