当前位置: 首页 > news >正文

长沙模板网站建设导视设计原则

长沙模板网站建设,导视设计原则,wordpress站内私信,温州建站模板搭建目录 前言 【文章末尾给大家留下了大量的福利】 测试框架简介 首先管理时间 添加配置文件 conf.py config.ini 读取配置文件 记录操作日志 简单理解POM模型 简单学习元素定位 管理页面元素 封装Selenium基类 创建页面对象 简单了解Pytest pytest.ini 编写测试…目录 前言 【文章末尾给大家留下了大量的福利】 测试框架简介 首先管理时间 添加配置文件 conf.py config.ini 读取配置文件 记录操作日志 简单理解POM模型 简单学习元素定位 管理页面元素 封装Selenium基类 创建页面对象 简单了解Pytest pytest.ini 编写测试用例 conftest.py 执行用例 发送邮件 pytest使用allure测试报告 allure安装 allure初体验 allure装饰器介绍 报告的生成和展示 allure发生错误截图 开源地址 前言 selenium自动化 pytest测试框架allure报告 本章你需要 一定的python基础——至少明白类与对象封装继承 一定的selenium基础——本篇不讲selenium不会的可以自己去看selenium中文翻译网 文章末尾给大家留下了大量的福利】 测试框架简介 测试框架有什么优点呢 代码复用率高如果不使用框架的话代码会很冗余可以组装日志、报告、邮件等一些高级功能 提高元素等数据的可维护性元素发生变化时只需要更新一下配置文件使用更灵活的PageObject设计模式 测试框架的整体目录 这样一个简单的框架结构就清晰了。 知道了以上这些我们就开始吧 我们在项目中先按照上面的框架指引建好每一项目录。 注意python包为是的都需要添加一个__init__.py文件以标识此目录为一个python包。 首先管理时间 首先呢因为我们很多的模块会用到时间戳或者日期等等字符串所以我们先单独把时间封装成一个模块。 然后让其他模块来调用即可。在utils目录新建times.py模块 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span time span stylecolor:#7171bfimport/span datetime span stylecolor:#7171bffrom/span functools span stylecolor:#7171bfimport/span wrapsspan stylecolor:#7171bfdef/span span stylecolor:#61aeeetimestamp/span():span stylecolor:#98c379时间戳/spanspan stylecolor:#7171bfreturn/span time.time()span stylecolor:#7171bfdef/span span stylecolor:#61aeeedt_strftime/span(fmtspan stylecolor:#98c379%Y%m/span):span stylecolor:#98c379datetime格式化时间:param fmt %Y%m%d %H%M%S/spanspan stylecolor:#7171bfreturn/span datetime.datetime.now().strftime(fmt)span stylecolor:#7171bfdef/span span stylecolor:#61aeeesleep/span(secondsspan stylecolor:#d19a661.0/span):span stylecolor:#98c379睡眠时间/spantime.sleep(seconds)span stylecolor:#7171bfdef/span span stylecolor:#61aeeerunning_time/span(func):span stylecolor:#98c379函数运行时间/spanspan stylecolor:#61aeee wraps(func)/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeewrapper/span(*args, **kwargs):start timestamp()res func(*args, **kwargs)span stylecolor:#7171bfprint/span(span stylecolor:#98c379校验元素done用时%.3f秒/span % (timestamp() - start))span stylecolor:#7171bfreturn/span resspan stylecolor:#7171bfreturn/span wrapperspan stylecolor:#7171bfif/span __name__ span stylecolor:#98c379__main__/span:span stylecolor:#7171bfprint/span(dt_strftime(span stylecolor:#98c379%Y%m%d%H%M%S/span))/code/span/span 添加配置文件 配置文件总是项目中必不可少的部分 将固定不变的信息集中在固定的文件中 conf.py 项目中都应该有一个文件对整体的目录进行管理我也在这个python项目中设置了此文件。 在项目config目录创建conf.py文件所有的目录配置信息写在这个文件里面。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span os span stylecolor:#7171bffrom/span selenium.webdriver.common.by span stylecolor:#7171bfimport/span By span stylecolor:#7171bffrom/span utils.times span stylecolor:#7171bfimport/span dt_strftimespan stylecolor:#7171bfclass/span span stylecolor:#61aeeeConfigManager/span(span stylecolor:#61aeeeobject/span):span stylecolor:#5c6370em# 项目目录/em/spanBASE_DIR os.path.dirname(os.path.dirname(os.path.abspath(__file__)))span stylecolor:#5c6370em# 页面元素目录/em/spanELEMENT_PATH os.path.join(BASE_DIR, span stylecolor:#98c379page_element/span)span stylecolor:#5c6370em# 报告文件/em/spanREPORT_FILE os.path.join(BASE_DIR, span stylecolor:#98c379report.html/span)span stylecolor:#5c6370em# 元素定位的类型/em/spanLOCATE_MODE {span stylecolor:#98c379css/span: By.CSS_SELECTOR,span stylecolor:#98c379xpath/span: By.XPATH,span stylecolor:#98c379name/span: By.NAME,span stylecolor:#98c379id/span: By.ID,span stylecolor:#98c379class/span: By.CLASS_NAME}span stylecolor:#5c6370em# 邮件信息/em/spanEMAIL_INFO {span stylecolor:#98c379username/span: span stylecolor:#98c3791084502012qq.com/span, span stylecolor:#5c6370em# 切换成你自己的地址/em/spanspan stylecolor:#98c379password/span: span stylecolor:#98c379QQ邮箱授权码/span,span stylecolor:#98c379smtp_host/span: span stylecolor:#98c379smtp.qq.com/span,span stylecolor:#98c379smtp_port/span: span stylecolor:#d19a66465/span}span stylecolor:#5c6370em# 收件人/em/spanADDRESSEE [span stylecolor:#98c3791084502012qq.com/span,]span stylecolor:#61aeee property/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeelog_file/span(self):span stylecolor:#98c379日志目录/spanlog_dir os.path.join(self.BASE_DIR, span stylecolor:#98c379logs/span)span stylecolor:#7171bfif/span span stylecolor:#7171bfnot/span os.path.exists(log_dir):os.makedirs(log_dir)span stylecolor:#7171bfreturn/span os.path.join(log_dir, span stylecolor:#98c379{}.log/span.span stylecolor:#7171bfformat/span(dt_strftime()))span stylecolor:#61aeee property/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeeini_file/span(self):span stylecolor:#98c379配置文件/spanini_file os.path.join(self.BASE_DIR, span stylecolor:#98c379config/span, span stylecolor:#98c379config.ini/span)span stylecolor:#7171bfif/span span stylecolor:#7171bfnot/span os.path.exists(ini_file):span stylecolor:#7171bfraise/span FileNotFoundError(span stylecolor:#98c379配置文件%s不存在/span % ini_file)span stylecolor:#7171bfreturn/span ini_filecm ConfigManager() span stylecolor:#7171bfif/span __name__ span stylecolor:#98c379__main__/span:span stylecolor:#7171bfprint/span(cm.BASE_DIR) /code/span/span 这个conf文件我模仿了Django的settings.py文件的设置风格但是又有些许差异。 在这个文件中我们可以设置自己的各个目录也可以查看自己当前的目录。 遵循了约定不变的常量名全部大写函数名小写。看起来整体美观。 config.ini 在项目config目录新建一个config.ini文件里面暂时先放入我们的需要测试的URL span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-inispan stylecolor:#e06c75[HOST]/span span stylecolor:#d19a66HOST/span https://www.baidu.com /code/span/span 读取配置文件 配置文件创建好了接下来我们需要读取这个配置文件以使用里面的信息。 我们在common目录中新建一个readconfig.py文件 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span configparser span stylecolor:#7171bffrom/span config.conf span stylecolor:#7171bfimport/span cmHOST span stylecolor:#98c379HOST/spanspan stylecolor:#7171bfclass/span span stylecolor:#61aeeeReadConfig/span(span stylecolor:#61aeeeobject/span):span stylecolor:#98c379配置文件/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeee__init__/span(self):self.config configparser.RawConfigParser() span stylecolor:#5c6370em# 当有%的符号时请使用Raw读取/em/spanself.config.read(cm.ini_file, encodingspan stylecolor:#98c379utf-8/span)span stylecolor:#7171bfdef/span span stylecolor:#61aeee_get/span(self, section, option):span stylecolor:#98c379获取/spanspan stylecolor:#7171bfreturn/span self.config.get(section, option)span stylecolor:#7171bfdef/span span stylecolor:#61aeee_set/span(self, section, option, value):span stylecolor:#98c379更新/spanself.config.span stylecolor:#7171bfset/span(section, option, value)span stylecolor:#7171bfwith/span span stylecolor:#7171bfopen/span(cm.ini_file, span stylecolor:#98c379w/span) span stylecolor:#7171bfas/span f:self.config.write(f)span stylecolor:#61aeee property/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeeurl/span(self):span stylecolor:#7171bfreturn/span self._get(HOST, HOST)ini ReadConfig()span stylecolor:#7171bfif/span __name__ span stylecolor:#98c379__main__/span:span stylecolor:#7171bfprint/span(ini.url) /code/span/span 可以看到我们用python内置的configparser模块对config.ini文件进行了读取。 对于url值的提取我使用了高阶语法property属性值写法更简单。 记录操作日志 日志大家应该都很熟悉这个名词就是记录代码中的动作。 在utils目录中新建logger.py文件。 这个文件就是我们用来在自动化测试过程中记录一些操作步骤的。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span logging span stylecolor:#7171bffrom/span config.conf span stylecolor:#7171bfimport/span cmspan stylecolor:#7171bfclass/span span stylecolor:#61aeeeLog/span:span stylecolor:#7171bfdef/span span stylecolor:#61aeee__init__/span(self):self.logger logging.getLogger()span stylecolor:#7171bfif/span span stylecolor:#7171bfnot/span self.logger.handlers:self.logger.setLevel(logging.DEBUG)span stylecolor:#5c6370em# 创建一个handle写入文件/em/spanfh logging.FileHandler(cm.log_file, encodingspan stylecolor:#98c379utf-8/span)fh.setLevel(logging.INFO)span stylecolor:#5c6370em# 创建一个handle输出到控制台/em/spanch logging.StreamHandler()ch.setLevel(logging.INFO)span stylecolor:#5c6370em# 定义输出的格式/em/spanformatter logging.Formatter(self.fmt)fh.setFormatter(formatter)ch.setFormatter(formatter)span stylecolor:#5c6370em# 添加到handle/em/spanself.logger.addHandler(fh)self.logger.addHandler(ch)span stylecolor:#61aeee property/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeefmt/span(self):span stylecolor:#7171bfreturn/span span stylecolor:#98c379%(levelname)s\t%(asctime)s\t[%(filename)s:%(lineno)d]\t%(message)s/spanlog Log().loggerspan stylecolor:#7171bfif/span __name__ span stylecolor:#98c379__main__/span:log.info(span stylecolor:#98c379hello world/span) /code/span/span 在终端中运行该文件就看到命令行打印出了 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-shellINFO    2020-12-01 16:00:05,467    [logger.py:38]    hello world /code/span/span然后在项目logs目录下生成了当月的日志文件。 简单理解POM模型 由于下面要讲元素相关的所以首先理解一下POM模型 Page Object模式具有以下几个优点。 该观点来自 《Selenium自动化测试——基于Python语言》 抽象出对象可以最大程度地降低开发人员修改页面代码对测试的影响 所以 你仅需要对页 面对象进行调整 而对测试没有影响可以在多个测试用例中复用一部分测试代码测试代码变得更易读、 灵活、 可维护 Page Object模式图 basepage ——selenium的基类对selenium的方法进行封装pageelements——页面元素把页面元素单独提取出来放入一个文件中searchpage ——页面对象类把selenium方法和页面元素进行整合testcase ——使用pytest对整合的searchpage进行测试用例编写   通过上图我们可以看出通过POM模型思想我们把 selenium方法页面元素页面对象测试用例 以上四种代码主体进行了拆分虽然在用例很少的情况下做会增加代码但是当用例多的时候意义很大代码量会在用例增加的时候显著减少。我们维护代码变得更加直观明显代码可读性也变得比工厂模式强很多代码复用率也极大的得到了提高。 简单学习元素定位 在日常的工作中我见过很多在浏览器中直接在浏览器中右键Copy Xpath复制元素的同学。这样获得的元素表达式放在 webdriver 中去运行往往是不够稳定的像前端的一些微小改动都会引起元素无法定位的NoSuchElementException报错。 所以在实际工作和学习中我们应该加强自己的元素定位能力尽可能的采用xpath和CSS selector 这种相对稳定的定位语法。由于CSS selector的语法生硬难懂对新手很不友好而且相比xpath缺少一些定位语法。所以我们选择xpath进行我们的元素定位语法。   xpath# 语法规则 定位工具 chropath 优点这是一个Chrome浏览器的测试定位插件类似于firepath本人试用了一下整体感觉非常好。对小白的友好度很好。缺点安装这个插件需要FQ。 Katalon录制工具 录制出来的脚本里面也会有定位元素的信息自己写——本人推荐这种 优点本人推荐的方式因为当熟练到一定程度的时候写出来的会更直观简洁并且在运行自动化测试中出现问题时能快速定位。缺点需要一定xpath和CSS selector语法积累不太容易上手。 管理页面元素 本教程选择的测试地址是百度首页所以对应的元素也是百度首页的。 项目框架设计中有一个目录page_element就是专门来存放定位元素的文件的。 通过对各种配置文件的对比我在这里选择的是YAML文件格式。其易读交互性好。 我们在page_element中新建一个search.yaml文件。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-yamlspan stylecolor:#98c379搜索框:/span span stylecolor:#98c379idkw/span span stylecolor:#98c379候选:/span span stylecolor:#98c379css.bdsug-overflow/span span stylecolor:#98c379搜索候选:/span span stylecolor:#98c379css#form div li/span span stylecolor:#98c379搜索按钮:/span span stylecolor:#98c379idsu/span /code/span/span 元素定位文件创建好了下来我们需要读取这个文件。 在common目录中创建readelement.py文件。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span os span stylecolor:#7171bfimport/span yaml span stylecolor:#7171bffrom/span config.conf span stylecolor:#7171bfimport/span cmspan stylecolor:#7171bfclass/span span stylecolor:#61aeeeElement/span(span stylecolor:#61aeeeobject/span):span stylecolor:#98c379获取元素/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeee__init__/span(self, name):self.file_name span stylecolor:#98c379%s.yaml/span % nameself.element_path os.path.join(cm.ELEMENT_PATH, self.file_name)span stylecolor:#7171bfif/span span stylecolor:#7171bfnot/span os.path.exists(self.element_path):span stylecolor:#7171bfraise/span FileNotFoundError(span stylecolor:#98c379%s 文件不存在/span % self.element_path)span stylecolor:#7171bfwith/span span stylecolor:#7171bfopen/span(self.element_path, encodingspan stylecolor:#98c379utf-8/span) span stylecolor:#7171bfas/span f:self.data yaml.safe_load(f)span stylecolor:#7171bfdef/span span stylecolor:#61aeee__getitem__/span(self, item):span stylecolor:#98c379获取属性/spandata self.data.get(item)span stylecolor:#7171bfif/span data:name, value data.split(span stylecolor:#98c379/span)span stylecolor:#7171bfreturn/span name, valuespan stylecolor:#7171bfraise/span ArithmeticError(span stylecolor:#98c379{}中不存在关键字{}/span.span stylecolor:#7171bfformat/span(self.file_name, item))span stylecolor:#7171bfif/span __name__ span stylecolor:#98c379__main__/span:search Element(span stylecolor:#98c379search/span)span stylecolor:#7171bfprint/span(search[span stylecolor:#98c379搜索框/span]) /code/span/span 通过特殊方法__getitem__实现调用任意属性读取yaml中的值。 这样我们就实现了定位元素的存储和调用。 但是还有一个问题我们怎么样才能确保我们写的每一项元素不出错人为的错误是不可避免的但是我们可以通过代码来运行对文件的审查。当前也不能所有问题都能发现。 所以我们编写一个文件在script脚本文件目录中创建inspect.py文件对所有的元素yaml文件进行审查。   span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span os span stylecolor:#7171bfimport/span yaml span stylecolor:#7171bffrom/span config.conf span stylecolor:#7171bfimport/span cm span stylecolor:#7171bffrom/span utils.times span stylecolor:#7171bfimport/span running_timespan stylecolor:#61aeeerunning_time/span span stylecolor:#7171bfdef/span span stylecolor:#61aeeeinspect_element/span():span stylecolor:#98c379检查所有的元素是否正确只能做一个简单的检查/spanspan stylecolor:#7171bffor/span files span stylecolor:#7171bfin/span os.listdir(cm.ELEMENT_PATH):_path os.path.join(cm.ELEMENT_PATH, files)span stylecolor:#7171bfwith/span span stylecolor:#7171bfopen/span(_path, encodingspan stylecolor:#98c379utf-8/span) span stylecolor:#7171bfas/span f:data yaml.safe_load(f)span stylecolor:#7171bffor/span k span stylecolor:#7171bfin/span data.values():span stylecolor:#7171bftry/span:pattern, value k.split(span stylecolor:#98c379/span)span stylecolor:#7171bfexcept/span ValueError:span stylecolor:#7171bfraise/span Exception(span stylecolor:#98c379元素表达式中没有/span)span stylecolor:#7171bfif/span pattern span stylecolor:#7171bfnot/span span stylecolor:#7171bfin/span cm.LOCATE_MODE:span stylecolor:#7171bfraise/span Exception(span stylecolor:#98c379%s中元素【%s】没有指定类型/span % (_path, k))span stylecolor:#7171bfelif/span pattern span stylecolor:#98c379xpath/span:span stylecolor:#7171bfassert/span span stylecolor:#98c379///span span stylecolor:#7171bfin/span value,\span stylecolor:#98c379%s中元素【%s】xpath类型与值不配/span % (_path, k)span stylecolor:#7171bfelif/span pattern span stylecolor:#98c379css/span:span stylecolor:#7171bfassert/span span stylecolor:#98c379///span span stylecolor:#7171bfnot/span span stylecolor:#7171bfin/span value, \span stylecolor:#98c379%s中元素【%s]css类型与值不配/span % (_path, k)span stylecolor:#7171bfelse/span:span stylecolor:#7171bfassert/span value, span stylecolor:#98c379%s中元素【%s】类型与值不匹配/span % (_path, k)span stylecolor:#7171bfif/span __name__ span stylecolor:#98c379__main__/span:inspect_element() /code/span/span 执行该文件 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-powershell校验元素done用时span stylecolor:#d19a660.002/span秒 /code/span/span 可以看到很短的时间内我们就对所填写的YAML文件进行了审查。 现在我们基本所需要的组件已经大致完成了。 接下来我们将进行最重要的一环封装selenium。 封装Selenium基类 在工厂模式种我们是这样写的 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span time span stylecolor:#7171bffrom/span selenium span stylecolor:#7171bfimport/span webdriverdriver webdriver.Chrome() driver.get(span stylecolor:#98c379https://www.baidu.com/span) driver.find_element_by_xpath(span stylecolor:#98c379//input[idkw]/span).send_keys(span stylecolor:#98c379selenium/span) driver.find_element_by_xpath(span stylecolor:#98c379//input[idsu]/span).click() time.sleep(span stylecolor:#d19a665/span) driver.quit() /code/span/span 很直白简单又明了。 创建driver对象打开百度网页搜索selenium点击搜索然后停留5秒查看结果最后关闭浏览器。 那我们为什么要封装selenium的方法呢。首先我们上述这种较为原始的方法基本不适用于平时做UI自动化测试的因为在UI界面实际运行情况远远比较复杂可能因为网络原因或者控件原因我们元素还没有显示出来就进行点击或者输入。所以我们需要封装selenium方法通过内置的显式等待或一定的条件语句才能构建一个稳定的方法。而且把selenium方法封装起来有利于平时的代码维护。 我们在page目录创建webpage.py文件。   span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#98c379 selenium基类 本文件存放了selenium基类的封装方法 /span span stylecolor:#7171bffrom/span selenium.webdriver.support span stylecolor:#7171bfimport/span expected_conditions span stylecolor:#7171bfas/span EC span stylecolor:#7171bffrom/span selenium.webdriver.support.ui span stylecolor:#7171bfimport/span WebDriverWait span stylecolor:#7171bffrom/span selenium.common.exceptions span stylecolor:#7171bfimport/span TimeoutExceptionspan stylecolor:#7171bffrom/span config.conf span stylecolor:#7171bfimport/span cm span stylecolor:#7171bffrom/span utils.times span stylecolor:#7171bfimport/span sleep span stylecolor:#7171bffrom/span utils.logger span stylecolor:#7171bfimport/span logspan stylecolor:#7171bfclass/span span stylecolor:#61aeeeWebPage/span(span stylecolor:#61aeeeobject/span):span stylecolor:#98c379selenium基类/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeee__init__/span(self, driver):span stylecolor:#5c6370em# self.driver webdriver.Chrome()/em/spanself.driver driverself.timeout span stylecolor:#d19a6620/spanself.wait WebDriverWait(self.driver, self.timeout)span stylecolor:#7171bfdef/span span stylecolor:#61aeeeget_url/span(self, url):span stylecolor:#98c379打开网址并验证/spanself.driver.maximize_window()self.driver.set_page_load_timeout(span stylecolor:#d19a6660/span)span stylecolor:#7171bftry/span:self.driver.get(url)self.driver.implicitly_wait(span stylecolor:#d19a6610/span)log.info(span stylecolor:#98c379打开网页%s/span % url)span stylecolor:#7171bfexcept/span TimeoutException:span stylecolor:#7171bfraise/span TimeoutException(span stylecolor:#98c379打开%s超时请检查网络或网址服务器/span % url)span stylecolor:#61aeee staticmethod/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeeelement_locator/span(func, locator):span stylecolor:#98c379元素定位器/spanname, value locatorspan stylecolor:#7171bfreturn/span func(cm.LOCATE_MODE[name], value)span stylecolor:#7171bfdef/span span stylecolor:#61aeeefind_element/span(self, locator):span stylecolor:#98c379寻找单个元素/spanspan stylecolor:#7171bfreturn/span WebPage.element_locator(span stylecolor:#7171bflambda/span *args: self.wait.until(EC.presence_of_element_located(args)), locator)span stylecolor:#7171bfdef/span span stylecolor:#61aeeefind_elements/span(self, locator):span stylecolor:#98c379查找多个相同的元素/spanspan stylecolor:#7171bfreturn/span WebPage.element_locator(span stylecolor:#7171bflambda/span *args: self.wait.until(EC.presence_of_all_elements_located(args)), locator)span stylecolor:#7171bfdef/span span stylecolor:#61aeeeelements_num/span(self, locator):span stylecolor:#98c379获取相同元素的个数/spannumber span stylecolor:#7171bflen/span(self.find_elements(locator))log.info(span stylecolor:#98c379相同元素{}/span.span stylecolor:#7171bfformat/span((locator, number)))span stylecolor:#7171bfreturn/span numberspan stylecolor:#7171bfdef/span span stylecolor:#61aeeeinput_text/span(self, locator, txt):span stylecolor:#98c379输入(输入前先清空)/spansleep(span stylecolor:#d19a660.5/span)ele self.find_element(locator)ele.clear()ele.send_keys(txt)log.info(span stylecolor:#98c379输入文本{}/span.span stylecolor:#7171bfformat/span(txt))span stylecolor:#7171bfdef/span span stylecolor:#61aeeeis_click/span(self, locator):span stylecolor:#98c379点击/spanself.find_element(locator).click()sleep()log.info(span stylecolor:#98c379点击元素{}/span.span stylecolor:#7171bfformat/span(locator))span stylecolor:#7171bfdef/span span stylecolor:#61aeeeelement_text/span(self, locator):span stylecolor:#98c379获取当前的text/span_text self.find_element(locator).textlog.info(span stylecolor:#98c379获取文本{}/span.span stylecolor:#7171bfformat/span(_text))span stylecolor:#7171bfreturn/span _textspan stylecolor:#61aeee property/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeeget_source/span(self):span stylecolor:#98c379获取页面源代码/spanspan stylecolor:#7171bfreturn/span self.driver.page_sourcespan stylecolor:#7171bfdef/span span stylecolor:#61aeeerefresh/span(self):span stylecolor:#98c379刷新页面F5/spanself.driver.refresh()self.driver.implicitly_wait(span stylecolor:#d19a6630/span) /code/span/span 在文件中我们对主要用了显式等待对selenium的clicksend_keys等方法做了二次封装。提高了运行的成功率。 好了我们完成了POM模型的一半左右的内容。接下来我们们进入页面对象。 创建页面对象 在page_object目录下创建一个searchpage.py文件。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bffrom/span page.webpage span stylecolor:#7171bfimport/span WebPage, sleep span stylecolor:#7171bffrom/span common.readelement span stylecolor:#7171bfimport/span Elementsearch Element(span stylecolor:#98c379search/span)span stylecolor:#7171bfclass/span span stylecolor:#61aeeeSearchPage/span(span stylecolor:#61aeeeWebPage/span):span stylecolor:#98c379搜索类/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeeinput_search/span(self, content):span stylecolor:#98c379输入搜索/spanself.input_text(search[span stylecolor:#98c379搜索框/span], txtcontent)sleep()span stylecolor:#61aeee property/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeeimagine/span(self):span stylecolor:#98c379搜索联想/spanspan stylecolor:#7171bfreturn/span [x.text span stylecolor:#7171bffor/span x span stylecolor:#7171bfin/span self.find_elements(search[span stylecolor:#98c379候选/span])]span stylecolor:#7171bfdef/span span stylecolor:#61aeeeclick_search/span(self):span stylecolor:#98c379点击搜索/spanself.is_click(search[span stylecolor:#98c379搜索按钮/span]) /code/span/span 在该文件中我们对输入搜索关键词点击搜索搜索联想进行了封装。 并配置了注释。 在平时中我们应该养成写注释的习惯因为过一段时间后没有注释代码读起来很费劲。 好了我们的页面对象此时业已完成了。下面我们开始编写测试用例。在开始测试用了之前我们先熟悉一下pytest测试框架。 简单了解Pytest 打开pytest框架的官网。pytest: helps you write better programs — pytest documentation span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em# content of test_sample.py/em/span span stylecolor:#7171bfdef/span span stylecolor:#61aeeeinc/span(x):span stylecolor:#7171bfreturn/span x span stylecolor:#d19a661/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeetest_answer/span():span stylecolor:#7171bfassert/span inc(span stylecolor:#d19a663/span) span stylecolor:#d19a665/span /code/span/span pytest.ini pytest项目中的配置文件可以对pytest执行过程中操作做全局控制。 在项目根目录新建pytest.ini文件。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-inispan stylecolor:#e06c75[pytest]/span span stylecolor:#d19a66addopts/span --htmlreport.html --self-contained-html /code/span/span addopts 指定执行时的其他参数说明 --htmlreport/report.html --self-contained-html 生成pytest-html带样式的报告-s 输出我们用例中的调式信息 -q 安静的进行测试-v 可以输出用例更加详细的执行信息比如用例所在的文件及用例名称等 编写测试用例 我们将使用pytest编写测试用例。 在TestCase目录中创建test_search.py文件。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span re span stylecolor:#7171bfimport/span pytest span stylecolor:#7171bffrom/span utils.logger span stylecolor:#7171bfimport/span log span stylecolor:#7171bffrom/span common.readconfig span stylecolor:#7171bfimport/span ini span stylecolor:#7171bffrom/span page_object.searchpage span stylecolor:#7171bfimport/span SearchPagespan stylecolor:#7171bfclass/span span stylecolor:#61aeeeTestSearch/span: span stylecolor:#61aeee pytest.fixture(scopespan stylecolor:#3388aafunction/span, autousespan stylecolor:#56b6c2True/span)/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeeopen_baidu/span(self, drivers):span stylecolor:#98c379打开百度/spansearch SearchPage(drivers)search.get_url(ini.url)span stylecolor:#7171bfdef/span span stylecolor:#61aeeetest_001/span(self, drivers):span stylecolor:#98c379搜索/spansearch SearchPage(drivers)search.input_search(span stylecolor:#98c379selenium/span)search.click_search()result re.search(span stylecolor:#98c379rselenium/span, search.get_source)log.info(result)span stylecolor:#7171bfassert/span resultspan stylecolor:#7171bfdef/span span stylecolor:#61aeeetest_002/span(self, drivers):span stylecolor:#98c379测试搜索候选/spansearch SearchPage(drivers)search.input_search(span stylecolor:#98c379selenium/span)log.info(span stylecolor:#7171bflist/span(search.imagine))span stylecolor:#7171bfassert/span span stylecolor:#7171bfall/span([span stylecolor:#98c379selenium/span span stylecolor:#7171bfin/span i span stylecolor:#7171bffor/span i span stylecolor:#7171bfin/span search.imagine])span stylecolor:#7171bfif/span __name__ span stylecolor:#98c379__main__/span:pytest.main([span stylecolor:#98c379TestCase/test_search.py/span])/code/span/span 我们测试用了就编写好了。 pytest.fixture 这个实现了和unittest的setupteardown一样的前置启动后置清理的装饰器。 第一个测试用例 我们实现了在百度selenium关键字并点击搜索按钮并在搜索结果中用正则查找结果页源代码返回数量大于10我们就认为通过。 第二个测试用例 我们实现了搜索selenium然后断言搜索候选中的所有结果有没有selenium关键字。 最后我们的在下面写一个执行启动的语句。 这时候我们应该进入执行了但是还有一个问题我们还没有把driver传递。 conftest.py 我们在项目根目录下新建一个conftest.py文件。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span pytest span stylecolor:#7171bffrom/span py.xml span stylecolor:#7171bfimport/span html span stylecolor:#7171bffrom/span selenium span stylecolor:#7171bfimport/span webdriverdriver span stylecolor:#56b6c2None/spanspan stylecolor:#61aeeepytest.fixture(scopespan stylecolor:#3388aasession/span, autousespan stylecolor:#56b6c2True/span)/span span stylecolor:#7171bfdef/span span stylecolor:#61aeeedrivers/span(request):span stylecolor:#7171bfglobal/span driverspan stylecolor:#7171bfif/span driver span stylecolor:#7171bfis/span span stylecolor:#56b6c2None/span:driver webdriver.Chrome()driver.maximize_window()span stylecolor:#7171bfdef/span span stylecolor:#61aeeefn/span():driver.quit()request.addfinalizer(fn)span stylecolor:#7171bfreturn/span driverspan stylecolor:#61aeeepytest.hookimpl(hookwrapperspan stylecolor:#56b6c2True/span)/span span stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_runtest_makereport/span(item):span stylecolor:#98c379当测试失败的时候自动截图展示到html报告中:param item:/spanpytest_html item.config.pluginmanager.getplugin(span stylecolor:#98c379html/span)outcome span stylecolor:#7171bfyield/spanreport outcome.get_result()report.description span stylecolor:#7171bfstr/span(item.function.__doc__)extra span stylecolor:#7171bfgetattr/span(report, span stylecolor:#98c379extra/span, [])span stylecolor:#7171bfif/span report.when span stylecolor:#98c379call/span span stylecolor:#7171bfor/span report.when span stylecolor:#98c379setup/span:xfail span stylecolor:#7171bfhasattr/span(report, span stylecolor:#98c379wasxfail/span)span stylecolor:#7171bfif/span (report.skipped span stylecolor:#7171bfand/span xfail) span stylecolor:#7171bfor/span (report.failed span stylecolor:#7171bfand/span span stylecolor:#7171bfnot/span xfail):file_name report.nodeid.replace(span stylecolor:#98c379::/span, span stylecolor:#98c379_/span) span stylecolor:#98c379.png/spanscreen_img _capture_screenshot()span stylecolor:#7171bfif/span file_name:html span stylecolor:#98c379divimg srcdata:image/png;base64,%s altscreenshot stylewidth:1024px;height:768px; /span \span stylecolor:#98c379onclickwindow.open(this.src) alignright//div/span % screen_imgextra.append(pytest_html.extras.html(html))report.extra extraspan stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_html_results_table_header/span(cells):cells.insert(span stylecolor:#d19a661/span, html.th(span stylecolor:#98c379用例名称/span))cells.insert(span stylecolor:#d19a662/span, html.th(span stylecolor:#98c379Test_nodeid/span))cells.pop(span stylecolor:#d19a662/span)span stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_html_results_table_row/span(report, cells):cells.insert(span stylecolor:#d19a661/span, html.td(report.description))cells.insert(span stylecolor:#d19a662/span, html.td(report.nodeid))cells.pop(span stylecolor:#d19a662/span)span stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_html_results_table_html/span(report, data):span stylecolor:#7171bfif/span report.passed:span stylecolor:#7171bfdel/span data[:]data.append(html.div(span stylecolor:#98c379通过的用例未捕获日志输出./span, class_span stylecolor:#98c379empty log/span))span stylecolor:#7171bfdef/span span stylecolor:#61aeee_capture_screenshot/span():span stylecolor:#98c379截图保存为base64:return:/spanspan stylecolor:#7171bfreturn/span driver.get_screenshot_as_base64()/code/span/span conftest.py测试框架pytest的胶水文件里面用到了fixture的方法封装并传递出了driver。 执行用例 以上我们已经编写完成了整个框架和测试用例。 我们进入到当前项目的主目录执行命令 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-powershellpytest /code/span/span 命令行输出 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-powershellTest session starts (platform: win32, Python span stylecolor:#d19a663.7/span.span stylecolor:#d19a667/span, pytest span stylecolor:#d19a665.3/span.span stylecolor:#d19a662/span, pyspan stylecolor:#7171bftest-sugar/span span stylecolor:#d19a660.9/span.span stylecolor:#d19a662/span) cachedir: .pytest_cache metadata: {span stylecolor:#98c379Python/span: span stylecolor:#98c3793.7.7/span, span stylecolor:#98c379Platform/span: span stylecolor:#98c379Windows-10-10.0.18362-SP0/span, span stylecolor:#98c379Packages/span: {span stylecolor:#98c379pytest/span: span stylecolor:#98c3795.3.2/span, span stylecolor:#98c379py/span: span stylecolor:#98c3791.8.0/span, span stylecolor:#98c379pluggy/span: span stylecolor:#98c3790.13.1/span}, span stylecolor:#98c379Plugins/span: {span stylecolor:#98c379forked/span: span stylecolor:#98c3791.1.3/span, span stylecolor:#98c379html/span: span stylecolor:#98c3792.0.1/span, span stylecolor:#98c379metadata/span: span stylecolor:#98c3791.8.0/span, span stylecolor:#98c379ordering/span: span stylecolor:#98c3790.6/span, span stylecolor:#98c379rerunfailures/span: span stylecolor:#98c3798.0/span, span stylecolor:#98c379sugar/span: span stylecolor:#98c3790.9.2/span, span stylecolor:#98c379xdist/span: span stylecolor:#98c3791.31.0/span}, span stylecolor:#98c379JAVA_HOME/span: span stylecolor:#98c379D:\\Program Files\\Java\\jdk1.8.0_131/span} rootdir: C:\Users\hoou\PycharmProjects\webspan stylecolor:#56b6c2-demotest/span, inifile: pytest.ini plugins: forkedspan stylecolor:#56b6c2-1/span.span stylecolor:#d19a661.3/span, htmlspan stylecolor:#56b6c2-2/span.span stylecolor:#d19a660.1/span, metadataspan stylecolor:#56b6c2-1/span.span stylecolor:#d19a668.0/span, orderingspan stylecolor:#56b6c2-0/span.span stylecolor:#d19a666/span, rerunfailuresspan stylecolor:#56b6c2-8/span.span stylecolor:#d19a660/span, sugarspan stylecolor:#56b6c2-0/span.span stylecolor:#d19a669.2/span, xdistspan stylecolor:#56b6c2-1/span.span stylecolor:#d19a6631.0/span collecting ... DevTools listening on ws://span stylecolor:#d19a66127.0/span.span stylecolor:#d19a660.1/span:span stylecolor:#d19a6610351/span/devtools/browser/span stylecolor:#d19a6678/spanbef34dspan stylecolor:#56b6c2-b94c-4087-b724-34fb6b2ef6d1/spanTestCase\test_search.py::TestSearch.test_001 ✓ span stylecolor:#d19a6650/span% █████ TestCase\test_search.py::TestSearch.test_002 ✓ span stylecolor:#d19a66100/span% ██████████ span stylecolor:#56b6c2-------------------------------/span generated html file: file://C:\Users\hoou\PycharmProjects\webspan stylecolor:#56b6c2-demotest/span\report\report.html span stylecolor:#56b6c2--------------------------------/span Results (span stylecolor:#d19a6612.90/spans):span stylecolor:#d19a662/span passed /code/span/span 可以看到两条用例已经执行成功了。 项目的report目录中生成了一个report.html文件。 这就是生成的测试报告文件。 发送邮件 当项目执行完成之后需要发送到自己或者其他人邮箱里查看结果。 我们编写发送邮件的模块。 在utils目录中新建send_mail.py文件 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span zmail span stylecolor:#7171bffrom/span config.conf span stylecolor:#7171bfimport/span cmspan stylecolor:#7171bfdef/span span stylecolor:#61aeeesend_report/span():span stylecolor:#98c379发送报告/spanspan stylecolor:#7171bfwith/span span stylecolor:#7171bfopen/span(cm.REPORT_FILE, encodingspan stylecolor:#98c379utf-8/span) span stylecolor:#7171bfas/span f:content_html f.read()span stylecolor:#7171bftry/span:mail {span stylecolor:#98c379from/span: span stylecolor:#98c3791084502012qq.com/span,span stylecolor:#98c379subject/span: span stylecolor:#98c379最新的测试报告邮件/span,span stylecolor:#98c379content_html/span: content_html,span stylecolor:#98c379attachments/span: [cm.REPORT_FILE, ]}server zmail.server(*cm.EMAIL_INFO.values())server.send_mail(cm.ADDRESSEE, mail)span stylecolor:#7171bfprint/span(span stylecolor:#98c379测试邮件发送成功/span)span stylecolor:#7171bfexcept/span Exception span stylecolor:#7171bfas/span e:span stylecolor:#7171bfprint/span(span stylecolor:#98c379Error: 无法发送邮件{}/span, span stylecolor:#7171bfformat/span(e))span stylecolor:#7171bfif/span __name__ span stylecolor:#98c379__main__/span:span stylecolor:#98c379请先在config/conf.py文件设置QQ邮箱的账号和密码/spansend_report() /code/span/span 执行该文件 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-shell测试邮件发送成功 /code/span/span 可以看到测试报告邮件已经发送成功了。打开邮箱。 成功收到了邮件。 这个demo项目就算是整体完工了是不是很有心得在发送邮件的那一刻很有成就感。 最后想必你已经对pytestselenium框架有了一个整体的认知了在自动化测试的道路上又上了一层台阶。 pytest使用allure测试报告 选用的项目为Selenium自动化测试Pytest框架实战在这个项目的基础上说allure报告。 allure安装 首先安装python的allure-pytest包 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-shellpip install allure-pytest /code/span/span 然后安装allure的command命令行程序 MacOS直接使用homebrew工具执行 brew install allure 即可安装不用配置下载包和配置环境 在GitHub下载安装程序https://github.com/allure-framework/allure2/releases 但是由于GitHub访问太慢我已经下载好并放在了群文件里面 下载完成后解压放到一个文件夹。我的路径是D:\Program Files\allure-2.13.3 然后配置环境变量 在系统变量path中添加D:\Program Files\allure-2.13.3\bin然后确定保存。 打开cmd输入allure如果结果显示如下则表示成功了 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-powershellC:\Users\hoouallure Usage: allure [span stylecolor:#d19a66options/span] [span stylecolor:#d19a66command/span] [span stylecolor:#d19a66command/span span stylecolor:#d19a66options/span]Options:span stylecolor:#56b6c2--help/spanPrint commandline help.span stylecolor:#56b6c2-q/span, span stylecolor:#56b6c2--quiet/spanspan stylecolor:#7171bfSwitch/span on the quiet mode.Default: falsespan stylecolor:#56b6c2-v/span, span stylecolor:#56b6c2--verbose/spanspan stylecolor:#7171bfSwitch/span on the verbose mode.Default: falsespan stylecolor:#56b6c2--version/spanPrint commandline version.Default: falseCommands:generate Generate the reportUsage: generate [span stylecolor:#d19a66options/span] The directories with allure resultsOptions:span stylecolor:#56b6c2-c/span, span stylecolor:#56b6c2--clean/spanClean Allure report directory before generating a new one.Default: falsespan stylecolor:#56b6c2--config/spanAllure commandline config path. span stylecolor:#7171bfIf/span specified overrides values fromspan stylecolor:#56b6c2--profile/span and span stylecolor:#56b6c2--configDirectory/span.span stylecolor:#56b6c2--configDirectory/spanAllure commandline configurations directory. By default usesALLURE_HOME directory.span stylecolor:#56b6c2--profile/spanAllure commandline configuration profile.span stylecolor:#56b6c2-o/span, span stylecolor:#56b6c2--report-dir/span, span stylecolor:#56b6c2--output/spanThe directory to generate Allure report into.Default: allurespan stylecolor:#56b6c2-report/spanserve Serve the reportUsage: serve [span stylecolor:#d19a66options/span] The directories with allure resultsOptions:span stylecolor:#56b6c2--config/spanAllure commandline config path. span stylecolor:#7171bfIf/span specified overrides values fromspan stylecolor:#56b6c2--profile/span and span stylecolor:#56b6c2--configDirectory/span.span stylecolor:#56b6c2--configDirectory/spanAllure commandline configurations directory. By default usesALLURE_HOME directory.span stylecolor:#56b6c2-h/span, span stylecolor:#56b6c2--host/spanThis host will be used to span stylecolor:#7171bfstart/span web server span stylecolor:#7171bffor/span the report.span stylecolor:#56b6c2-p/span, span stylecolor:#56b6c2--port/spanThis port will be used to span stylecolor:#7171bfstart/span web server span stylecolor:#7171bffor/span the report.Default: span stylecolor:#d19a660/spanspan stylecolor:#56b6c2--profile/spanAllure commandline configuration profile.open Open generated reportUsage: open [span stylecolor:#d19a66options/span] The report directoryOptions:span stylecolor:#56b6c2-h/span, span stylecolor:#56b6c2--host/spanThis host will be used to span stylecolor:#7171bfstart/span web server span stylecolor:#7171bffor/span the report.span stylecolor:#56b6c2-p/span, span stylecolor:#56b6c2--port/spanThis port will be used to span stylecolor:#7171bfstart/span web server span stylecolor:#7171bffor/span the report.Default: span stylecolor:#d19a660/spanplugin Generate the reportUsage: plugin [span stylecolor:#d19a66options/span]Options:span stylecolor:#56b6c2--config/spanAllure commandline config path. span stylecolor:#7171bfIf/span specified overrides values fromspan stylecolor:#56b6c2--profile/span and span stylecolor:#56b6c2--configDirectory/span.span stylecolor:#56b6c2--configDirectory/spanAllure commandline configurations directory. By default usesALLURE_HOME directory.span stylecolor:#56b6c2--profile/spanAllure commandline configuration profile. /code/span/span allure初体验 改造一下之前的测试用例代码 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span re span stylecolor:#7171bfimport/span pytest span stylecolor:#7171bfimport/span allure span stylecolor:#7171bffrom/span utils.logger span stylecolor:#7171bfimport/span log span stylecolor:#7171bffrom/span common.readconfig span stylecolor:#7171bfimport/span ini span stylecolor:#7171bffrom/span page_object.searchpage span stylecolor:#7171bfimport/span SearchPagespan stylecolor:#61aeeeallure.feature(span stylecolor:#3388aa测试百度模块/span)/span span stylecolor:#7171bfclass/span span stylecolor:#61aeeeTestSearch/span: span stylecolor:#61aeee pytest.fixture(scopespan stylecolor:#3388aafunction/span, autousespan stylecolor:#56b6c2True/span)/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeeopen_baidu/span(self, drivers):span stylecolor:#98c379打开百度/spansearch SearchPage(drivers)search.get_url(ini.url)span stylecolor:#61aeee allure.story(span stylecolor:#3388aa搜索selenium结果用例/span)/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeetest_001/span(self, drivers):span stylecolor:#98c379搜索/spansearch SearchPage(drivers)search.input_search(span stylecolor:#98c379selenium/span)search.click_search()result re.search(span stylecolor:#98c379rselenium/span, search.get_source)log.info(result)span stylecolor:#7171bfassert/span resultspan stylecolor:#61aeee allure.story(span stylecolor:#3388aa测试搜索候选用例/span)/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeetest_002/span(self, drivers):span stylecolor:#98c379测试搜索候选/spansearch SearchPage(drivers)search.input_search(span stylecolor:#98c379selenium/span)log.info(span stylecolor:#7171bflist/span(search.imagine))span stylecolor:#7171bfassert/span span stylecolor:#7171bfall/span([span stylecolor:#98c379selenium/span span stylecolor:#7171bfin/span i span stylecolor:#7171bffor/span i span stylecolor:#7171bfin/span search.imagine])span stylecolor:#7171bfif/span __name__ span stylecolor:#98c379__main__/span:pytest.main([span stylecolor:#98c379TestCase/test_search.py/span, span stylecolor:#98c379--alluredir/span, span stylecolor:#98c379./allure/span])os.system(span stylecolor:#98c379allure serve allure/span) /code/span/span 然后运行一下 注意如果你使用的是pycharm编辑器请跳过该运行方式直接使用.bat或.sh的方式运行 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-shell***------------------------------- generated html file: file://C:\Users\hoou\PycharmProjects\web-demotest\report.html -------------------------------- Results (12.97s):2 passed Generating report to temp directory... Report successfully generated to C:\Users\hoou\AppData\Local\Temp\112346119265936111\allure-report Starting web server... 2020-06-18 22:52:44.500:INFO::main: Logging initialized 1958ms to org.eclipse.jetty.util.log.StdErrLog Server started at http://172.18.47.241:6202/. Press CtrlC to exit /code/span/span 命令行会出现如上提示接着浏览器会自动打开 点击左下角En即可选择切换为中文。 是不是很清爽很友好比pytest-html更舒服。 allure装饰器介绍 报告的生成和展示 刚才的两个命令 生成allure原始报告到report/allure目录下生成的全部为json或txt文件。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-powershellpytest TestCase/test_search.py span stylecolor:#56b6c2--alluredir/span ./allure /code/span/span 在一个临时文件中生成报告并启动浏览器打开 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-powershellallure serve allure /code/span/span 但是在关闭浏览器之后这个报告就再也打不开了。不建议使用这种。 所以我们必须使用其他的命令让allure可以指定生成的报告目录。 我们在项目的根目录中创建run_case.py文件内容如下 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span sys span stylecolor:#7171bfimport/span subprocessWIN sys.platform.startswith(span stylecolor:#98c379win/span)span stylecolor:#7171bfdef/span span stylecolor:#61aeeemain/span():span stylecolor:#98c379主函数/spansteps [span stylecolor:#98c379venv\\Script\\activate/span span stylecolor:#7171bfif/span WIN span stylecolor:#7171bfelse/span span stylecolor:#98c379source venv/bin/activate/span,span stylecolor:#98c379pytest --alluredir allure-results --clean-alluredir/span,span stylecolor:#98c379allure generate allure-results -c -o allure-report/span,span stylecolor:#98c379allure open allure-report/span]span stylecolor:#7171bffor/span step span stylecolor:#7171bfin/span steps:subprocess.run(span stylecolor:#98c379call /span step span stylecolor:#7171bfif/span WIN span stylecolor:#7171bfelse/span step, shellspan stylecolor:#56b6c2True/span)span stylecolor:#7171bfif/span __name__ span stylecolor:#98c379__main__/span:main() /code/span/span 命令释义 1、使用pytest生成原始报告里面大多数是一些原始的json数据加入--clean-alluredir参数清除allure-results历史数据。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-powershellpytest span stylecolor:#56b6c2--alluredir/span allurespan stylecolor:#56b6c2-results/span span stylecolor:#56b6c2--clean-alluredir/span /code/span/span --clean-alluredir 清除allure-results历史数据 2、使用generate命令导出HTML报告到新的目录 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-powershellallure generate allurespan stylecolor:#56b6c2-results/span span stylecolor:#56b6c2-o/span allurespan stylecolor:#56b6c2-report/span /code/span/span 3、使用open命令在浏览器中打开HTML报告 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-powershellallure open allurespan stylecolor:#56b6c2-report/span /code/span/span 好了我们运行一下该文件。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-powershellResults (span stylecolor:#d19a6612.85/spans):span stylecolor:#d19a662/span passed Report successfully generated to c:\Users\hoou\PycharmProjects\webspan stylecolor:#56b6c2-demotest/span\allurespan stylecolor:#56b6c2-report/span Starting web server... span stylecolor:#d19a662020/spanspan stylecolor:#56b6c2-06-18/span span stylecolor:#d19a6623/span:span stylecolor:#d19a6630/span:span stylecolor:#d19a6624.122/span:INFO::main: Logging initialized span stylecolor:#d19a66260/spanms to org.eclipse.jetty.util.log.StdErrLog Server started at http://span stylecolor:#d19a66172.18/span.span stylecolor:#d19a6647.241/span:span stylecolor:#d19a667932/span/. Press CtrlC to span stylecolor:#7171bfexit/span /code/span/span 可以看到运行成功了。 在项目中的allure-report文件夹也生成了相应的报告。 allure发生错误截图 上面的用例全是运行成功的没有错误和失败的那么发生了错误怎么样在allure报告中生成错误截图呢我们一起来看看。 首先我们先在config/conf.py文件中添加一个截图目录和截图文件的配置。 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#7171bfclass/span span stylecolor:#61aeeeConfigManager/span(span stylecolor:#61aeeeobject/span):...span stylecolor:#61aeee property/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeescreen_path/span(self):span stylecolor:#98c379截图目录/spanscreenshot_dir os.path.join(self.BASE_DIR, span stylecolor:#98c379screen_capture/span)span stylecolor:#7171bfif/span span stylecolor:#7171bfnot/span os.path.exists(screenshot_dir):os.makedirs(screenshot_dir)now_time dt_strftime(span stylecolor:#98c379%Y%m%d%H%M%S/span)screen_file os.path.join(screenshot_dir, span stylecolor:#98c379{}.png/span.span stylecolor:#7171bfformat/span(now_time))span stylecolor:#7171bfreturn/span now_time, screen_file.../code/span/span 然后我们修改项目目录中的conftest.py span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-pythonspan stylecolor:#5c6370em#!/usr/bin/env python3/em/span span stylecolor:#5c6370em# -*- coding:utf-8 -*-/em/span span stylecolor:#7171bfimport/span base64 span stylecolor:#7171bfimport/span pytest span stylecolor:#7171bfimport/span allure span stylecolor:#7171bffrom/span py.xml span stylecolor:#7171bfimport/span html span stylecolor:#7171bffrom/span selenium span stylecolor:#7171bfimport/span webdriverspan stylecolor:#7171bffrom/span config.conf span stylecolor:#7171bfimport/span cm span stylecolor:#7171bffrom/span common.readconfig span stylecolor:#7171bfimport/span ini span stylecolor:#7171bffrom/span utils.times span stylecolor:#7171bfimport/span timestamp span stylecolor:#7171bffrom/span utils.send_mail span stylecolor:#7171bfimport/span send_reportdriver span stylecolor:#56b6c2None/spanspan stylecolor:#61aeeepytest.fixture(scopespan stylecolor:#3388aasession/span, autousespan stylecolor:#56b6c2True/span)/span span stylecolor:#7171bfdef/span span stylecolor:#61aeeedrivers/span(request):span stylecolor:#7171bfglobal/span driverspan stylecolor:#7171bfif/span driver span stylecolor:#7171bfis/span span stylecolor:#56b6c2None/span:driver webdriver.Chrome()driver.maximize_window()span stylecolor:#7171bfdef/span span stylecolor:#61aeeefn/span():driver.quit()request.addfinalizer(fn)span stylecolor:#7171bfreturn/span driverspan stylecolor:#61aeeepytest.hookimpl(hookwrapperspan stylecolor:#56b6c2True/span)/span span stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_runtest_makereport/span(item):span stylecolor:#98c379当测试失败的时候自动截图展示到html报告中:param item:/spanpytest_html item.config.pluginmanager.getplugin(span stylecolor:#98c379html/span)outcome span stylecolor:#7171bfyield/spanreport outcome.get_result()report.description span stylecolor:#7171bfstr/span(item.function.__doc__)extra span stylecolor:#7171bfgetattr/span(report, span stylecolor:#98c379extra/span, [])span stylecolor:#7171bfif/span report.when span stylecolor:#98c379call/span span stylecolor:#7171bfor/span report.when span stylecolor:#98c379setup/span:xfail span stylecolor:#7171bfhasattr/span(report, span stylecolor:#98c379wasxfail/span)span stylecolor:#7171bfif/span (report.skipped span stylecolor:#7171bfand/span xfail) span stylecolor:#7171bfor/span (report.failed span stylecolor:#7171bfand/span span stylecolor:#7171bfnot/span xfail):screen_img _capture_screenshot()span stylecolor:#7171bfif/span screen_img:html span stylecolor:#98c379divimg srcdata:image/png;base64,%s altscreenshot stylewidth:1024px;height:768px; /span \span stylecolor:#98c379onclickwindow.open(this.src) alignright//div/span % screen_imgextra.append(pytest_html.extras.html(html))report.extra extraspan stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_html_results_table_header/span(cells):cells.insert(span stylecolor:#d19a661/span, html.th(span stylecolor:#98c379用例名称/span))cells.insert(span stylecolor:#d19a662/span, html.th(span stylecolor:#98c379Test_nodeid/span))cells.pop(span stylecolor:#d19a662/span)span stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_html_results_table_row/span(report, cells):cells.insert(span stylecolor:#d19a661/span, html.td(report.description))cells.insert(span stylecolor:#d19a662/span, html.td(report.nodeid))cells.pop(span stylecolor:#d19a662/span)span stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_html_results_table_html/span(report, data):span stylecolor:#7171bfif/span report.passed:span stylecolor:#7171bfdel/span data[:]data.append(html.div(span stylecolor:#98c379通过的用例未捕获日志输出./span, class_span stylecolor:#98c379empty log/span))span stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_html_report_title/span(report):report.title span stylecolor:#98c379pytest示例项目测试报告/spanspan stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_configure/span(config):config._metadata.clear()config._metadata[span stylecolor:#98c379测试项目/span] span stylecolor:#98c379测试百度官网搜索/spanconfig._metadata[span stylecolor:#98c379测试地址/span] ini.urlspan stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_html_results_summary/span(prefix, summary, postfix):span stylecolor:#5c6370em# prefix.clear() # 清空summary中的内容/em/spanprefix.extend([html.p(span stylecolor:#98c379所属部门: XX公司测试部/span)])prefix.extend([html.p(span stylecolor:#98c379测试执行人: 随风挥手/span)])span stylecolor:#7171bfdef/span span stylecolor:#61aeeepytest_terminal_summary/span(terminalreporter, exitstatus, config):span stylecolor:#98c379收集测试结果/spanresult {span stylecolor:#98c379total/span: terminalreporter._numcollected,span stylecolor:#98c379passed/span: span stylecolor:#7171bflen/span(terminalreporter.stats.get(span stylecolor:#98c379passed/span, [])),span stylecolor:#98c379failed/span: span stylecolor:#7171bflen/span(terminalreporter.stats.get(span stylecolor:#98c379failed/span, [])),span stylecolor:#98c379error/span: span stylecolor:#7171bflen/span(terminalreporter.stats.get(span stylecolor:#98c379error/span, [])),span stylecolor:#98c379skipped/span: span stylecolor:#7171bflen/span(terminalreporter.stats.get(span stylecolor:#98c379skipped/span, [])),span stylecolor:#5c6370em# terminalreporter._sessionstarttime 会话开始时间/em/spanspan stylecolor:#98c379total times/span: timestamp() - terminalreporter._sessionstarttime}span stylecolor:#7171bfprint/span(result)span stylecolor:#7171bfif/span result[span stylecolor:#98c379failed/span] span stylecolor:#7171bfor/span result[span stylecolor:#98c379error/span]:send_report()span stylecolor:#7171bfdef/span span stylecolor:#61aeee_capture_screenshot/span():span stylecolor:#98c379截图保存为base64/spannow_time, screen_file cm.screen_pathdriver.save_screenshot(screen_file)allure.attach.file(screen_file,span stylecolor:#98c379失败截图{}/span.span stylecolor:#7171bfformat/span(now_time),allure.attachment_type.PNG)span stylecolor:#7171bfwith/span span stylecolor:#7171bfopen/span(screen_file, span stylecolor:#98c379rb/span) span stylecolor:#7171bfas/span f:imagebase64 base64.b64encode(f.read())span stylecolor:#7171bfreturn/span imagebase64.decode() /code/span/span 来看看我们修改了什么 我们修改了_capture_screenshot函数 在里面我们使用了webdriver截图生成文件并使用allure.attach.file方法将文件添加到了allure测试报告中。 并且我们还返回了图片的base64编码这样可以让pytest-html的错误截图和allure都能生效。 运行一次得到两份报告一份是简单的一份是好看内容丰富的。 现在我们在测试用例中构建一个预期的错误测试一个我们的这个代码。   修改test_002测试用例 span stylecolor:#596172span stylebackground-color:#ffffffcode classlanguage-python span stylecolor:#7171bfassert/span span stylecolor:#7171bfnot/span span stylecolor:#7171bfall/span([span stylecolor:#98c379selenium/span span stylecolor:#7171bfin/span i span stylecolor:#7171bffor/span i span stylecolor:#7171bfin/span search.imagine]) /code/span/span 运行一下 可以看到allure报告中已经有了这个错误的信息。 再来看看pytest-html中生成的报告 可以看到两份生成的报告都附带了错误的截图真是鱼和熊掌可以兼得呢。 好了到这里可以说allure的报告就先到这里了以后发现allure其他的精彩之处我再来分享。 开源地址 为了方便学习交流本次的示例项目已经保存在网盘了直接点击下方小卡片免费获取。
http://www.zqtcl.cn/news/75746/

相关文章:

  • 手机网站建设需求做公众号app网站app吗
  • 广州萝岗区网站建设青岛网站建设公司效果
  • 温州专业营销网站湖北网站建设企业
  • 淮北建设机械网站陕西建设网官网app
  • 广州网站备案中企动力销售不好开单
  • 公司做网站需要准备什么条件建设门户网站的公司
  • 设计网站公司都选亿企邦wordpress跳转安装
  • 深圳企业网站建设设计最便宜的购物软件
  • 长沙网站设计培训wordpress注册填写密码
  • 个人做网站需要资质吗网页的制作教案
  • 高端的电影网站北京seo实训班学校
  • 个人网站有什么怎么下载自己做的网站
  • 做信息类网站怎么赚钱wordpress侧边栏美化
  • 建设银行电商网站WordPress登录提醒
  • 一个ip 做2个网站吗网站模板和定制
  • 邢台建网站公司系部网站建设需求分析
  • 地和网站建设优分销app下载
  • 能用pinduoduo做网站吗云上铺会员管理系统官网
  • 宅男做网站365建站网
  • 专业的营销型网站建设价格动画专业哪个大学最好
  • 网站的缺点有哪些晋江论坛怎么贴图
  • 公司做网站比较好的wordpress安装主题后找不到后台入口
  • 设计感 网站广东电子商务网站建设价格
  • 杭州网站建设求职简历七牛云配置wordpress
  • 现在中国空间站有几个人网站用视频做背景音乐
  • 网站开发用商城网站开发那家好
  • 专业建设英文网站厦门微网站建设
  • 开发网站需要多少资金南山做网站关于枪
  • asp网站安全wordpress修改图片
  • 如何选择网站定制公司电商网站建设基本流程图