1. 简介
这篇文章主要是分享讲解一下, 如何封装自己用到的方法和类. 以便方便自己和别人的调用, 这样就可以避免重复地再造轮子.
封装 (Encapsulation) 是面向对象的三大特征之一(另外两个是继承和多态), 它指的是将对象的状态信息隐藏在对象内部, 不允许外部程序直接访问对象内部信息, 而是通过该类所提供的方法来实现对内部信息的操作和访问.
就好比使用计算机, 我们只需要使用计算机提供的键盘, 就可以达到操作计算机的目的, 至于在敲击键盘时计算机内部是如何工作, 我们根本不需要知道.
封装机制保证了类内部数据结构的完整性, 因为使用类的用户无法直接看到类中的数据结构, 只能使用类允许公开的数据, 很好地避免了外部对内部数据的影响, 提高了程序的可维护性. 总的来说, 对一个类或对象实现良好的封装, 可以达到以下目的:
隐藏类的实现细节.
让使用者只能通过事先预定的方法来访问数据, 从而可以在该方法里加入控制逻辑, 限制对属性的不合理访问.
可进行数据检查, 从而有利于保证对象信息的完整性.
便于修改, 提高代码的可维护性.
为了实现良好的封装, 需要从以下两个方面来考虑:
将对象的属性和实现细节隐藏起来, 不允许外部直接访问.
把方法暴露出来, 让方法来控制对这些属性进行安全的访问和操作.
因此, 实际上封装有两个方面的含义: 把该隐藏的隐藏起来, 把该暴露的暴露出来.
2. 二次封装 Selenium 中几个方法
本文来介绍, 如何把常用的几个 webdriver 的方法封装到自己写的一个类中去, 这个封装过程叫二次封装 Selenium 方法. 我们把打开站点, 浏览器前进和后退, 关闭和退出浏览器这这个方法封装到一个新写的类中去.
我们按照如下层次结构在 PyCharm 中新建两个包和两个. py 文件:
上图, baidu_search.py 是我们编写测试脚本的 python 文件, 具体测试代码写在这个文件. 包 test1 下的 basepage.py 文件是这次我们介绍的二次封装 selenium 方法而新建的. 这里提一下, python 中默认规则, 包名和文件名都是小写, 类名称单词首字母大写, 函数名称小写, 多个字母下划线隔开. 我们尽量遵守下这个不成文的约定.
来看看 basepage.py 的内容:
2.1 代码实现:
2.2 参考代码:
- # coding=utf-8
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-12
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: 《手把手教你》系列进阶篇之 2-python+ selenium 自动化测试 - python 基础扫盲
- '''
- # 3. 导入模块
- class BasePage(object):
- """
- 主要是把常用的几个 Selenium 方法封装到 BasePage 这个类, 我们这里演示以下几个方法
- back()
- forward()
- get()
- quit()
- """
- def __init__(self, driver):
- """
- 写一个构造函数, 有一个参数 driver
- :param driver:
- """
- self.driver = driver
- def back(self):
- """
- 浏览器后退按钮
- :param none:
- """
- self.driver.back()
- def forward(self):
- """
- 浏览器前进按钮
- :param none:
- """
- self.driver.forward()
- def open_url(self, url):
- """
- 打开 url 站点
- :param url:
- """
- self.driver.get(url)
- def quit_browser(self):
- """
- 关闭并停止浏览器服务
- :param none:
- """
- self.driver.quit()
上面的''''''是文档注释, 一般在类的开始和函数的开始, 用两个''''''括起来, 简单描述下这个类或者函数的功能.
3. 调用自己封装过的方法
接下来看看, 我们脚本文件中如何去调用我们自己封装过的方法.
baidu_search.py 的内容如下:
3.1 代码实现:
3.2 参考代码:
- # coding=utf-8
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-12
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: 《手把手教你》系列进阶篇之 2-python+ selenium 自动化测试 - python 基础扫盲
- '''
- # 3. 导入模块
- import time
- from selenium import webdriver
- from blog.basepage import BasePage
- class BaiduSearch(object):
- driver = webdriver.Chrome()
- driver.maximize_window()
- driver.implicitly_wait(10)
- basepage = BasePage(driver)
- def open_baidu(self):
- self.basepage.open_url("https://www.baidu.com")
- time.sleep(1)
- def test_search(self):
- self.driver.find_element_by_id('kw').send_keys("Selenium")
- time.sleep(1)
- self.basepage.back()
- self.basepage.forward()
- self.basepage.quit_browser()
- baidu = BaiduSearch()
- baidu.open_baidu()
- baidu.test_search()
3.3 运行结果:
运行代码后, 控制台打印如下图的结果
上面 self.basepage 的几行代码就是调用我们自己封装的方法去执行相关 webdriver 操作. 这个只是一个简单的封装介绍, 等后面, 我们介绍了字符串切割, 我们会再次介绍二次封装 Selenium 方法, 例如将会把八大 find_element 方法封装到一个方法里去.
4. 封装一个自己的类 - 浏览器引擎类
通过上边的一小节我们知道了, 如何去封装几个简单的 Selenium 方法到我们自定义的类, 所以我们趁热打铁: 这次我们编写一个类, 叫浏览器引擎类, 通过更改一个字符串的值, 利用 if 语句去判断和控制启动那个浏览器. 这里我们暂时, 支持三大浏览器
(IE,Chrome,Firefox). 这里有一个前提条件, 在基础篇中, 启动三大浏览器的 driver 文件, 检查下你的 Python 安装路径下有没有这三个 driver 插件, 如果没有, 请回到基础篇的如何启动火狐和 IE 浏览器文章去看看如何做.
我们继续在 test1 这个包下新建一个 browser_engine.py 文件, 然后在另外一个包下新建一个 test.py 文件去测试这个浏览器引擎类是否工作正常. 这个浏览器引擎类, 我们一开始写简单一点, 只写启动浏览器.
先看看 browser_engine.py 中的代码:
4.1 代码实现:
4.1.1 browser_engine.py
4.1.2 test.py
4.2 参考代码:
4.2.1 browser_engine.py
- # coding=utf-8
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-12
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: 《手把手教你》系列进阶篇之 2-python+ selenium 自动化测试 - python 基础扫盲
- '''
- # 3. 导入模块
- from selenium import webdriver
- class BrowserEngine(object):
- """
- 定义一个浏览器引擎类, 根据 browser_type 的值去, 控制启动不同的浏览器, 这里主要是 IE,Firefox, Chrome
- """
- def __init__(self, driver):
- self.driver = driver
- browser_type = "IE" # maybe Firefox, Chrome, IE
- def get_browser(self):
- """
- 通过 if 语句, 来控制初始化不同浏览器的启动, 默认是启动 Chrome
- :return: driver
- """ if self.browser_type =='Firefox':
- driver = webdriver.Firefox()
- elif self.browser_type == 'Chrome':
- driver = webdriver.Chrome()
- elif self.browser_type == 'IE':
- driver = webdriver.IE()
- else: driver = webdriver.Chrome()
- driver.maximize_window()
- driver.implicitly_wait(10)
- return driver
4.2.2 test.py
再看看 test.py 代码, 进行测试, 更改 browser_engine.py 中 browser_type 的值, 去测试三大浏览器是否启动正常.
- # coding=utf-8
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-12
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: 《手把手教你》系列进阶篇之 2-python+ selenium 自动化测试 - python 基础扫盲
- '''
- # 3. 导入模块
- from test1.browser_engine import BrowserEngine
- class TestBrowserEngine(object):
- def open_browser(self):
- browserengine = BrowserEngine(self)
- driver = browserengine.get_browser()
- tbe = TestBrowserEngine()
- tbe.open_browser()
4.3 运行结果:
再看看 test.py 代码, 进行测试, 更改 browser_engine.py 中 browser_type 的值, 去测试三大浏览器是否启动正常.
运行代码后, 控制台打印如下图的结果
目前, 自定义的浏览器引擎类到这里就封装好了, 只支持打开不同浏览器, 需要手动修改, 引擎类中 browser_type 的值. 看起来功能简单, 但是我们只是需要学习这种做事的方式和思维, 在下一个部分, 框架设计的时候, 我会再告诉大家如何去加强这个引擎类
的功能, 到时候去修改配置文件中的浏览器类型, 而不是修改代码中的字段. 通过修改配置文件, 从而去打开不同浏览器, 并开始测试相关脚本.
5. 小结
好了, 今天的分享就到这里吧!!! 谢谢各位的耐心阅读.
您的肯定就是我进步的动力. 如果你感觉还不错, 就请鼓励一下吧! 记得随手点波 推荐 不要忘记哦!!!
来源: https://www.cnblogs.com/du-hong/p/12023115.html