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

山东省交通厅建设网站首页开业时网站可以做哪些活动

山东省交通厅建设网站首页,开业时网站可以做哪些活动,沛县网站定制,wordpress更改mysqli前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象#xff0c;封装继承 一定的selenium基础——本篇不讲selenium#xff0c;不会的可以自己去看selenium中文翻译网 测试框架简介 测试框架有什么优点呢#xff1a; 代码复用率高 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象封装继承 一定的selenium基础——本篇不讲selenium不会的可以自己去看selenium中文翻译网 测试框架简介 测试框架有什么优点呢 代码复用率高如果不使用框架的话代码会很冗余可以组装日志、报告、邮件等一些高级功能提高元素等数据的可维护性元素发生变化时只需要更新一下配置文件使用更灵活的PageObject设计模式 测试框架的整体目录 目录/文件说明是否为python包common这个包中存放的是常见的通用的类如读取配置文件是config配置文件目录是logs日志目录page对selenium的方放进行深度的封装是page_element页面元素存放目录page_object页面对象POM设计模式本人对这个的理解来自于苦叶子的博客是TestCase所有的测试用例集是utils工具类是script脚本文件conftest.pypytest胶水文件pytest.inipytest配置文件 这样一个简单的框架结构就清晰了。 知道了以上这些我们就开始吧 我们在项目中先按照上面的框架指引建好每一项目录。 注意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 注意QQ邮箱授权码点击查看生成教程 这个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模式图 selenium方法页面元素页面对象测试用例 以上四种代码主体进行了拆分虽然在用例很少的情况下做会增加代码但是当用例多的时候意义很大代码量会在用例增加的时候显著减少。我们维护代码变得更加直观明显代码可读性也变得比工厂模式强很多代码复用率也极大的得到了提高。 简单学习元素定位 在日常的工作中我见过很多在浏览器中直接在浏览器中右键Copy Xpath复制元素的同学。这样获得的元素表达式放在 webdriver 中去运行往往是不够稳定的像前端的一些微小改动都会引起元素无法定位的NoSuchElementException报错。 所以在实际工作和学习中我们应该加强自己的元素定位能力尽可能的采用xpath和CSS selector 这种相对稳定的定位语法。由于CSS selector的语法生硬难懂对新手很不友好而且相比xpath缺少一些定位语法。所以我们选择xpath进行我们的元素定位语法。 xpath 语法规则 对于 xpath 的介绍是一门在 XML 文档中查找信息的语言。 表达式介绍备注/根节点绝对路径//当前节点的所有子节点相对路径*所有节点元素的属性名的前缀class   id*[1][] 下标运算符[][ ]谓词表达式//input[idkw]Following-sibling当前节点之后的同级preceding-sibling当前节点之前的同级parent当前节点的父级节点 定位工具 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框架有了一个整体的认知了在自动化测试的道路上又上了一层台阶。 B站最完整Python接口自动化测试进阶教程合集真实模拟企业项目实战看完这套就够了
http://www.pierceye.com/news/928392/

相关文章:

  • 学什么可以做网站免费qq空间网站
  • 网站套餐到期啥意思电子商务电商网站饿建设
  • 电商网站零售客户重庆旅游景点
  • 建设银行成都官网招聘网站自主建网站
  • 云南省建设厅定额网站房地产开发公司是做什么的
  • 哪个网站卖自己做的手工艺品有哪些好的做网站公司好
  • 做电影网站用什么主机好最新网站域名
  • 唐山做网站公司汉狮价格搜索引擎禁止的方式优化网站
  • 做视频网站视频常见网站安全漏洞
  • 苏州企业名录黄页新乡网站自然优化
  • 有哪些建设网站公司网站建设需求单
  • 招聘网站做销售用手机网站做app
  • 做一个网站 多少钱撤销网站备案
  • 建设网站的流程图企业工资管理系统软件
  • 个人网站空间大小可以做网站的语言
  • 网站设计需要哪些技术wap购物网站源码
  • 一个空间两个php网站新能源车排名前十名
  • 如何建设公司门户网站建站仅向商家提供技术服务
  • 全国城建中心官方网站广州市品牌网站建设怎么样
  • 做百度移动端网站排名软件有哪些漫画做的好的网站好
  • 网站建设的基本条件crm和erp的区别
  • 网站关键词优化费用wordpress开发架构
  • 都安网站建设南宁网站建设哪家公司实
  • 廊坊企业网站团队莱芜做网站
  • 如何让百度收录网站用什么软件开发手机app
  • 郑州哪里有做网站wordpress编辑页面模板
  • 网站定制要花多少钱电商设计类插画
  • 手把手做网站wordpress secondary title
  • 服装网站建设课程品牌网站怎么建立
  • 广州市网站建设怎么样企业网站上的二维码怎么获得