《手把手教你》系列进阶篇之1-python+ selenium自动化测试 - python基础扫盲(详细教程)
<h3>1. 简介</h3><p> 如果你从一开始就跟着宏哥看博客文章到这里,基础篇和练习篇的文章。如果你认真看过,并且手动去敲过每一篇的脚本代码,那边恭喜你,至少说你算真正会利用Python+Selenium编写自动化脚本了,你基本掌握了Selenium中webdriver的大部分常用的方法函数。有大佬曾经说过,自动化测试大概可以分三个层次:</p>
<p>1. 手工测试用例转换成自动化测试脚本的过程</p>
<p>2. 能设计自动化测试框架,至少能够维护自动化测试框架。</p>
<p>3. 流程自动化方案设计,例如,一键打包,自动开始测试,自动发送测试报告,自动运维部署上线等。</p>
<p>通过前边文章的基础和练习讲解,学习到这个时间节点,应该是完整介绍了手工测试用例装换成自动化测试脚本这一个初级水平,学到这里,你已经具备了能够编写自动化测试脚本的能力。</p>
<p>在开始介绍设计简单的自动化测试框架之前,我想在这个节点,插入一个新章节,叫Python+Selenium进阶篇,主要是介绍一些设计框架的前提技能和基本Python编写代码的能力。这些能力包括但不限于以下内容:</p>
<p>1. 主流Python开发IDE工具的基本使用,例如Pycharm</p>
<p>2. Python中模块,类和对象的具体代码讲解。</p>
<p>3. Selenium 常见方法的二次封装。</p>
<p>4. 自定义方法的封装和方法的调用-浏览器引擎类。</p>
<p>5. Python读写配置文件介绍</p>
<p>6. Python如何获取系统时间和时间的格式化处理。</p>
<p>7. Python中常见字符串切割处理。</p>
<p>8. Python自定义一个日志生成方法封装。</p>
<p>9. Selenium中一个截图方法的封装。</p>
<p>10. Python中继承的使用。</p>
<p>通过介绍以上进阶技能学习后,我们才可以,或者有能力去思考和动手去设计一个简单的自动化测试框架。</p>
<h3>2. pycharm安装</h3>
<p> 在Python开发过程中,比较流行,很优秀的一款IDE工具-PyCharm,这里关于它的介绍就一句话,它就相当于Java开发中的Eclipse软件一样。有些人说,Eclipse上可以通过安装插件扩展来支持Python的代码编写,虽然可以这样,但是我强烈建议,你本来就是</p>
<p>学习,为啥不选择一个符合大众的选择工具呢,不管你用没有用户Eclipse,在这里,你将要用PyCharm进行自动化测试框架的开发。</p>
<p>这里宏哥就不废话也不啰嗦了,可以参考宏哥这篇文章:手把手的教你安装PyCharm --Pycharm安装详细教程(一)(非常详细,非常实用)里边有详细的安装步骤。</p>
<h3>3. pycharm简单使用</h3>
<h4>3.1 创建一个包,或者文件夹,或者python文件</h4>
<p>如何创建一个包,或者文件夹,或者python文件,请看下图:</p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191211113055856-127473304.png" alt=""></p>
<h4>3.2 设置工作面板中的字体</h4>
<p>如何设置工作面板中的字体:</p>
<p>点击File-Settings,调出设置面板:</p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191211113106988-338809005.png" alt=""></p>
<h4>3.3 设置代码面板中背景颜色</h4>
<p>如何设置代码面板中背景颜色成绿豆色,据说绿豆色养眼,护眼,绿豆色用RGB表示:C7EDCC</p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191211113117929-1734382007.png" alt=""></p>
<h4>3.4 多行注释快捷键</h4>
<p>在PyCharm如何多行注释: 选中多行代码,ctrl+/</p>
<h4>3.5 运行代码</h4>
<p>在PyCharm如何运行代码:点击菜单栏绿色三角 或者,在代码面板,右键,选中Run xxx</p>
<p>好了这里就简单的介绍一下,自己慢慢的用着用着熟练就好了。用一时一时爽,一直用一直爽!!!</p>
<h3 class="title-article">4. Python中类/函数/模块的简单介绍和方法调用</h3>
<p> 前边小章节介绍了PyCharm的基本使用,接下来我们的脚本代码都在这个PyCharm这个编辑器里写。好处有很多,项目文件结构层次清晰,写代码的时候会自动化提示和补全。这里,我们在昨天创建的项目下,新建一个包,然后在包下面新建一个demo.py文</p>
<p>件。抄写以下代码到你的环境里,尝试运行下,看看有没有问题。</p>
<p>关于Python中类和函数及方法的调用,我们写在这个demo.py文件,具体代码如下:</p>
<h4>4.1 代码实现:</h4>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191211142600258-1375633874.png" alt=""></p>
<h4>4.2 参考代码:</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-11
@author: 北京-宏哥 QQ交流群:705269076
Project: 《手把手教你》系列进阶篇之1-python+ selenium自动化测试 - python基础扫盲
</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)">class</span><span style="color: rgba(0, 0, 0, 1)"> ClassA(object):
string1 </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, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> instancefunc(self):
</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)">这是一个实例方法。</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)"> (self)
@classmethod
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> classfunc(cls):
</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)">这是一个类方法。</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)"> (cls)
@staticmethod
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> staticfun():
</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)">这是一个静态方法。</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
test </span>= ClassA() <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 初始化一个ClasssA的对象,test是类ClassA的实例对象</span>
test.instancefunc() <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 对象调用实例方法</span>
<span style="color: rgba(0, 0, 0, 1)">
test.staticfun() </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, 0, 1)">
test.classfunc() </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)">print</span> (test.string1) <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 对象调用类变量</span>
<span style="color: rgba(0, 0, 0, 1)">
ClassA.instancefunc(test) </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 类调用实例方法,需要带参数,这里的test是一个对象参数</span>
ClassA.instancefunc(ClassA) <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 类调用实例方法,需要带参数,这里的ClassA是一个类参数</span>
ClassA.staticfun() <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 类调用静态方法</span>
ClassA.classfunc() <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 类调用类方法</span></pre>
</div>
<h4>4.3 运行结果:</h4>
<p>运行代码后,控制台打印如下图的结果</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191211142654270-819091659.png" alt=""></p>
<p>备注:</p>
<p>先运行下代码是否会报错,然后尝试自己去理解下。主要有以下几点内容</p>
<p>1. 类的定义,class开头的就表示这是一个类,小括号里面的,表示这个类的父类,涉及到继承,默认object是所有类的父类。python中定义类,小括号内主要有三种:1. 具体一个父类,2. object 3. 空白</p>
<p>2. 函数或方法的定义, def开头就表示定义一个函数,方法包括,实例方法,类方法,静态方法,注意看类方法和静态方法定义的时候上面有一个@标记。</p>
<p>3. 对象调用方法和类调用方法的使用。</p>
<p> 这篇讲的东西,确实比较难理解。如果学过java的人,可能会好理解类和对象,以及面向对象的概念。Python同时支持面向过程变成和面向对象编程,所有python中也有类和对象等概念。一般来说,概念的东西比较绕,如果你Python基础没有看到这部分,那边</p>
<p>请回去《看笨方法学python》中关于这块的介绍。如果有看过了,还是不理解,我只能告诉你,继续学下去,你现在哪怕死记住这些概念和他们的基本使用。等到后面,框架设计部分,你会慢慢体会到这些基本概念的实际用法,你跟着写了代码后,会有助于你自己</p>
<p>的理解和提高。</p>
<p> 最后,来说下python中的模块,在python中,你新建一个demo.py文件,那么一个.py文件可以说是一个模块,一个模块中,可以定义多个class,模块中也可以直接定义函数。和java一样,访问不同包下的类和方法之前,需要导入相关路径下的包。例如from</p>
<p>selenium import webdriver 这个导入语句,我们知道webdriver这个接口是在selenium的模块下。</p>
<p>本小章节的学习目的,就是会用函数或者类来编写我们之前写过的脚本。那么接下来就和宏哥来体验一下吧。</p>
<h3>5. 趁热打铁or牛刀小试</h3>
<p> 这里宏哥以下用百度搜索举例,模仿上面用类调用实例的方法来写这个脚本,可能看起来比较啰嗦,但是代码多了,你就会体会到类的作用,注意这里self指的是当前BaiduSearch这个类本身:</p>
<h4>5.1 代码实现:</h4>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191211143714980-1280346234.png" alt=""></p>
<h4>5.2 参考代码:</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-11
@author: 北京-宏哥 QQ交流群:705269076
Project: 《手把手教你》系列进阶篇之1-python+ selenium自动化测试 - python基础扫盲
</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)">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)">class</span><span style="color: rgba(0, 0, 0, 1)"> BaiduSearch(object):
driver </span>=<span style="color: rgba(0, 0, 0, 1)"> webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(</span>10<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> open_baidu(self):
self.driver.get(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://www.baidu.com</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)">)
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> test_search(self):
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)">)
</span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)"> (self.driver.title)
</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)">)
self.driver.quit()
baidu </span>=<span style="color: rgba(0, 0, 0, 1)"> BaiduSearch()
baidu.open_baidu()
baidu.test_search()</span></pre>
</div>
<h4>5.3 运行结果:</h4>
<p>运行代码后,控制台打印如下图的结果</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1232840/201912/1232840-20191211144116797-541029423.png" alt=""></p>
<h3>6. 小结</h3>
<p> 好了,今天的分享就到这里吧!!!谢谢各位的耐心阅读。</p>
<p> </p>
<p style="text-align: center"><span style="font-size: 18px"><strong><strong>您的肯定就是我进步的动力。</strong>如果你感觉还不错,就请鼓励一下吧!记得点波 <span style="font-size: 18pt; color: rgba(255, 0, 0, 1)">推荐</span> 不要忘记哦!!!</strong></span></p>
<p> </p>
<p><img style="display: block; margin-left: auto; margin-right: auto" src="https://img2018.cnblogs.com/blog/1232840/201908/1232840-20190816135641371-1314831001.gif" alt=""></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/12016099.html
頁:
[1]