《一头扎进》系列之Python+Selenium框架设计篇3- 价值好几K的框架,狼来了,狼来了....,狼没来,框架真的来了
<h3>1. 简介</h3><p> 前边宏哥一边一边的喊框架,就如同一边一边的喊狼来了!狼来了!.....这回是狼没有来,框架真的来了。从本文开始宏哥将会一步一步介绍,如何从无到有地创建自己的第一个自动化测试框架。这一篇,我们介绍,如何封装自己的日志类和浏览器引擎类。</p>
<h3>2. 创建项目层级结构</h3>
<p> 如何创建,怎么创建。这个就需要我们前边介绍的框架概要设计以及框架的详细设计的思维导图,宏哥就是根据那个图,轻松地、清楚的、思路清晰地一步一步创建项目层级结构。</p>
<p>相关步骤:</p>
<p>1. 打开PyCharm,创建如下格式的项目层级结构,为了避免不必要的麻烦文件名称建议和宏哥保持一样;</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191219102824469-1792054724.png" alt=""></p>
<h3>3. 相关文件代码</h3>
<h4>3.1 config.ini 配置文件</h4>
<p>配置文件config.ini相关设计如下:</p>
<h5>3.1.1 代码实现:</h5>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191219104228731-1983638055.png" alt=""></p>
<h5>3.1.2 参考代码:</h5>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> this is config file, only store browser type and server URL</span>
<span style="color: rgba(0, 0, 0, 1)">
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">browserName = Firefox</span>
browserName =<span style="color: rgba(0, 0, 0, 1)"> Chrome
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">browserName = IE</span>
<span style="color: rgba(0, 0, 0, 1)">
URL </span>= https://<span style="color: rgba(0, 0, 0, 1)">www.baidu.com
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">URL = www.google.com</span></pre>
</div>
<h4>3.2 封装浏览器驱动(引擎)类</h4>
<h5>3.2.1 browser_engine.py 文件</h5>
<p>主要目前常用的Chrome、Firefox和IE三大浏览器引擎的封装。</p>
<p>浏览器引擎类browser_engine.py相关脚本代码如下:</p>
<h5>3.2.2 代码实现:</h5>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191219104449264-1698872308.png" alt=""></p>
<h5>3.2.3 参考代码:</h5>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> -*- coding:utf-8 -*-</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2.注释:包括记录创建时间,创建人,项目名称。</span>
<span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(128, 0, 0, 1)">
Created on 2019-12-19
@author: 北京-宏哥 QQ交流群:705269076
Project: 《《一头扎进》系列之Python+Selenium框架设计篇3- 价值好几K的框架,不看别后悔,过时不候
</span><span style="color: rgba(128, 0, 0, 1)">'''</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 3.导入模块</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> configparser
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> os.path
</span><span style="color: rgba(0, 0, 255, 1)">from</span> selenium <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> webdriver
</span><span style="color: rgba(0, 0, 255, 1)">from</span> automation_framework_demo.framework.logger <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> Logger
logger </span>= Logger(logger=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BrowserEngine</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).getlog()
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> BrowserEngine(object):
dir </span>= os.path.dirname(os.path.abspath(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span>))<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 注意相对路径获取方法</span>
chrome_driver_path = dir + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/tools/chromedriver.exe</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
ie_driver_path </span>= dir + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/tools/IEDriverServer.exe</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 0, 255, 1)">def</span> <span style="color: rgba(128, 0, 128, 1)">__init__</span><span style="color: rgba(0, 0, 0, 1)">(self, driver):
self.driver </span>=<span style="color: rgba(0, 0, 0, 1)"> driver
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> read the browser type from config.ini file, return the driver</span>
<span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> open_browser(self, driver):
config </span>=<span style="color: rgba(0, 0, 0, 1)"> configparser.ConfigParser()
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> file_path = os.path.dirname(os.getcwd()) + '/config/config.ini'</span>
file_path = os.path.dirname(os.path.abspath(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span>)) + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/config/config.ini</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
config.read(file_path)
browser </span>= config.get(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">browserType</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">browserName</span><span style="color: rgba(128, 0, 0, 1)">"</span>)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">获取浏览器类型、名字</span>
logger.info(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">You had select %s browser.</span><span style="color: rgba(128, 0, 0, 1)">"</span> % browser)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">日志打印你选择的浏览器</span>
url = config.get(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">testServer</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">URL</span><span style="color: rgba(128, 0, 0, 1)">"</span>) <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">获取测试的URL地址</span>
logger.info(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">The test server url is: %s</span><span style="color: rgba(128, 0, 0, 1)">"</span> % url) <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">日志打印测试的URL地址</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">判断你所选择的浏览器</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> browser == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Firefox</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
driver </span>=<span style="color: rgba(0, 0, 0, 1)"> webdriver.Firefox()
logger.info(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Starting firefox browser.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">elif</span> browser == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Chrome</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
driver </span>= webdriver.Chrome(self.chrome_driver_path)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">初始化一个实例</span>
logger.info(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Starting Chrome browser.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">elif</span> browser == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">IE</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
driver </span>=<span style="color: rgba(0, 0, 0, 1)"> webdriver.Ie(self.ie_driver_path)
logger.info(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Starting IE browser.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
driver.get(url)</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">访问URL</span>
logger.info(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Open url: %s</span><span style="color: rgba(128, 0, 0, 1)">"</span> %<span style="color: rgba(0, 0, 0, 1)"> url)
driver.maximize_window()</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">将窗口放大</span>
logger.info(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Maximize the current window.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
driver.implicitly_wait(</span>10<span style="color: rgba(0, 0, 0, 1)">)
logger.info(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Set implicitly wait 10 seconds.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(driver)
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> driver
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">关闭浏览器</span>
<span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> quit_browser(self):
logger.info(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Now, Close and quit the browser.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
self.driver.quit()</span></pre>
</div>
<h4>3.3 封装日志类</h4>
<h5>3.3.1 logger.py文件</h5>
<p>日志类logger.py相关脚本代码如下:</p>
<h5>3.3.2 代码实现:</h5>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191219104704839-1087953088.png" alt=""></p>
<h5>3.3.3 参考代码:</h5>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> -*- coding:utf-8 -*-</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2.注释:包括记录创建时间,创建人,项目名称。</span>
<span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(128, 0, 0, 1)">
Created on 2019-12-19
@author: 北京-宏哥 QQ交流群:705269076
Project: 《《一头扎进》系列之Python+Selenium框架设计篇3- 价值好几K的框架,不看别后悔,过时不候
</span><span style="color: rgba(128, 0, 0, 1)">'''</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 3.导入模块</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> logging
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> logging.handlers
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> os.path
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> time
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Logger(object):
</span><span style="color: rgba(0, 0, 255, 1)">def</span> <span style="color: rgba(128, 0, 128, 1)">__init__</span><span style="color: rgba(0, 0, 0, 1)">(self, logger):
</span><span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(128, 0, 0, 1)">''
指定保存日志的文件路径,日志级别,以及调用文件
将日志存入到指定的文件中
</span><span style="color: rgba(128, 0, 0, 1)">'''</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 创建一个日志器logger,并设置其日志级别为DEBUG</span>
self.logger =<span style="color: rgba(0, 0, 0, 1)"> logging.getLogger(logger)
self.logger.setLevel(logging.DEBUG)
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 创建一个handler,用于写入日志文件</span>
rq = time.strftime(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%Y%m%d%H%M</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, time.localtime(time.time()))
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> log_path = os.path.dirname(os.getcwd()) + '/Logs/'# 项目根目录下/Logs 保存日志</span>
log_path = os.path.dirname(os.path.abspath(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">'</span>)) + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/logs/</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 如果case组织结构式 /testsuit/featuremodel/xxx.py , 那么得到的相对路径的父路径就是项目根目录</span>
log_name = log_path + rq + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.log</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 创建一个文件处理器handler并设置其日志级别为INFO</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">fh = logging.FileHandler(log_name, maxBytes=1024 * 1024, backupCount=5,</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> encoding='utf-8')</span>
<span style="color: rgba(0, 0, 0, 1)">
fh </span>= logging.handlers.RotatingFileHandler(log_name, maxBytes=1024 * 1024, backupCount=5<span style="color: rgba(0, 0, 0, 1)">,
encoding</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span>)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 实例化handler</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">fh = logging.FileHandler(log_name)</span>
<span style="color: rgba(0, 0, 0, 1)"> fh.setLevel(logging.INFO)
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 再创建一个handler,用于输出到控制台</span>
<span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(128, 0, 0, 1)">
创建一个流处理器handler并设置其日志级别为INFO
</span><span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(0, 0, 0, 1)">
ch </span>=<span style="color: rgba(0, 0, 0, 1)"> logging.StreamHandler()
ch.setLevel(logging.INFO)
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 定义handler的输出格式</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">handler = logging.handlers.RotatingFileHandler(fh, maxBytes=1024 * 1024, backupCount=5,</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> encoding='utf-8')# 实例化handler</span>
<span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(128, 0, 0, 1)">
创建一个格式器formatter并将
</span><span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(0, 0, 0, 1)">
formatter </span>= logging.Formatter(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%(asctime)s - %(name)s - %(levelname)s - %(message)s</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 给日志处理器logger添加上面创建的handler</span>
<span style="color: rgba(0, 0, 0, 1)"> self.logger.addHandler(fh)
self.logger.addHandler(ch)
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> getlog(self):
</span><span style="color: rgba(0, 0, 255, 1)">return</span> self.logger</pre>
</div>
<p>页面对象pageobject这里暂不用,其实上一篇微博那个小例子已经介绍过了,计划下一篇宏哥再做详细地介绍。</p>
<h3>4. 新建测试脚本</h3>
<h4>4.1 测试脚本baidu_search.py</h4>
<p>测试脚本baidu_search.py相关脚本如下:</p>
<h4>4.2 代码实现:</h4>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191219110010059-1235020726.png" alt=""></p>
<h4>4.3 参考代码:</h4>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> -*- coding:utf-8 -*-</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2.注释:包括记录创建时间,创建人,项目名称。</span>
<span style="color: rgba(128, 0, 0, 1)">'''</span><span style="color: rgba(128, 0, 0, 1)">
Created on 2019-12-19
@author: 北京-宏哥 QQ交流群:705269076
Project: 《《一头扎进》系列之Python+Selenium框架设计篇3- 价值好几K的框架,不看别后悔,过时不候
</span><span style="color: rgba(128, 0, 0, 1)">'''</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 3.导入模块</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> time
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> unittest
</span><span style="color: rgba(0, 0, 255, 1)">from</span> automation_framework_demo.framework.browser_engine <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> BrowserEngine
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> BaiduSearch(unittest.TestCase):
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> setUp(self):
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">
测试固件的setUp()的代码,主要是测试的前提准备工作
:return:
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(0, 0, 0, 1)">
browse </span>=<span style="color: rgba(0, 0, 0, 1)"> BrowserEngine(self)
self.driver </span>=<span style="color: rgba(0, 0, 0, 1)"> browse.open_browser(self)
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> tearDown(self):
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">
测试结束后的操作,这里基本上都是关闭浏览器
:return:
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(0, 0, 0, 1)">
self.driver.quit()
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> test_baidu_search(self):
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">
这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
:return:
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(0, 0, 0, 1)">
self.driver.find_element_by_id(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">kw</span><span style="color: rgba(128, 0, 0, 1)">'</span>).send_keys(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">selenium</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
time.sleep(</span>1<span style="color: rgba(0, 0, 0, 1)">)
self.driver.find_element_by_id(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">su</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">).click()
time.sleep(</span>5<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 0, 255, 1)">assert</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">selenium</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> self.driver.title
</span><span style="color: rgba(0, 0, 255, 1)">print</span> (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Test Pass.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)"> Exception as e:
</span><span style="color: rgba(0, 0, 255, 1)">print</span> (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Test Fail.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, format(e))
</span><span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
unittest.main()</span></pre>
</div>
<h4>4.4 运行结果:</h4>
<p>运行代码后,控制台打印如下图的结果</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191219110117708-1479082179.png" alt=""></p>
<p>工具包,这里把三个浏览器的driver文件都放根目录一个文件夹里,这样别人拷贝这个项目也不需要去下载这些文件。</p>
<p>运行测试脚本baidu_search.py,会在根目录下的logs文件生成日志文件,例如宏哥的文件内容:</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191219110245337-169792140.png" alt=""></p>
<h3>5.小结</h3>
<h5>5.1 遇到的一个小问题</h5>
<p>问题描述:主要是在断言的时候fail的了,原因是输入selenium后,没有点击查询,于是宏哥加上这段代码</p>
<div class="cnblogs_code">
<pre>self.driver.find_element_by_id(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">su</span><span style="color: rgba(128, 0, 0, 1)">'</span>).click()</pre>
</div>
<p>运行后仍然fail的,宏哥猜测是点击后没有出现元素,就去断言,因此又加上了等待的出现的代码,结果pass了</p>
<div class="cnblogs_code">
<pre> time.sleep(5)</pre>
</div>
<p>在实践和写代码,运行的过程中,遇到问题就出现在下边的代码里。有兴趣的小伙伴或者童鞋们可以自己注释掉实验一下</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> test_baidu_search(self):
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">
这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
:return:
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(0, 0, 0, 1)">
self.driver.find_element_by_id(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">kw</span><span style="color: rgba(128, 0, 0, 1)">'</span>).send_keys(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">selenium</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
time.sleep(</span>1<span style="color: rgba(0, 0, 0, 1)">)
self.driver.find_element_by_id(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">su</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">).click()
time.sleep(</span>5<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 0, 255, 1)">assert</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">selenium</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> self.driver.title
</span><span style="color: rgba(0, 0, 255, 1)">print</span> (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Test Pass.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)"> Exception as e:
</span><span style="color: rgba(0, 0, 255, 1)">print</span> (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Test Fail.</span><span style="color: rgba(128, 0, 0, 1)">'</span>, format(e))</pre>
</div>
<p> </p>
<p>好了,今天的分享就到这里吧!!!谢谢各位的耐心阅读。有问题加群交流讨论</p>
<p> </p>
<p style="text-align: center"><span style="font-size: 14pt">您的肯定就是我进步的动力。如果你感觉还不错,就请鼓励一下吧!记得随手点波<strong> <span style="font-size: 18pt; color: rgba(255, 0, 0, 1)">推荐</span> </strong>不要忘记哦!!!</span></p>
<p style="text-align: center"><span style="font-size: 14pt">别忘了点 <span style="font-size: 18pt; color: rgba(255, 0, 0, 1)"><strong>推荐 </strong></span>留下您来过的痕迹</span></p>
<p style="text-align: center"><span style="font-size: 14pt"> </span></p>
<p><span style="font-size: 14pt"><img src="https://img2018.cnblogs.com/blog/1232840/201908/1232840-20190816135641371-1314831001.gif" alt="" style="display: block; margin-left: auto; margin-right: auto"></span></p>
</div>
<div id="MySignature" role="contentinfo">
<div id="MySignature" style="display: block">
<div style="font-size: 13px; border: 1px dashed rgb(45, 161, 45); padding: 10px 15px; background-color: rgb(248, 248, 248)">
<label style="font-weight: bold">
为了方便大家在移动端也能看到我分享的博文,现已注册个人微信公众号,扫描左下方二维码即可,欢迎大家关注,提前解锁更多测试干货!有时间会及时分享相关技术博文。
</label>
<br>
<label style="font-weight: bold">
为了方便大家互动讨论相关技术问题,刚刚建立了咱们的专门的微信群交流互动群,群内会分享交流测试领域前沿知识。请您扫描中间的微信二维码进群
</label>
<br>
<label style="font-weight: bold">
为了方便大家互动讨论相关技术问题,现已组建专门的微信群,由于微信群满100,请您扫描右下方宏哥个人微信二维码拉你进群
<label style="font-weight: bold; color: red; font-size: 15px">
(请务必备注:已关注公众号进群)平时上班忙(和你一样),所以加好友不及时,请稍安勿躁~
</label>
,欢迎大家加入这个大家庭,我们一起畅游知识的海洋。
</label>
<br>
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
<br>
如果您觉得阅读本文对您有帮助,请点一下左下角
“推荐”
按钮,您的
<label style="font-weight: bold; color: red; font-size: 15px">
“推荐”
</label>
将是我最大的写作动力!另外您也可以选择
【
<strong>
关注我
</strong>
】
,可以很方便找到我!
<br>
本文版权归作者和博客园共有,来源网址:
https://www.cnblogs.com/du-hong
欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
</div>
<div style="text-align: center; margin-top: 10px">
<p style=" font-weight: bolder; color: red; ">
公众号(关注宏哥)     
        
       
       
微信群(扫码进群)    
       
       
    
      
      客服微信
</p>
<img style="width: 200px;padding-right: 50px;" alt="个人微信公众号" src="https://img2018.cnblogs.com/common/1741949/201911/1741949-20191119095948011-608816619.png">
<img style="width: 200px;padding-right: 65px;" alt="微信群" src="https://img2024.cnblogs.com/blog/1232840/202506/1232840-20250610113707419-637869921.png">
<img style="width: 200px" alt="个人微信" src="https://img2018.cnblogs.com/common/1741949/201911/1741949-20191106101257091-849954564.png">
</div>
</div><br><br>
来源:https://www.cnblogs.com/du-hong/p/12066269.html
頁:
[1]