🔥《手把手教你》系列进阶篇之15-python+ selenium自动化测试 - python基础扫盲(详细教程)

1. 简介

这篇文章主要是分享讲解一下,如何封装自己用到的方法和类。以便方便自己和别人的调用,这样就可以避免重复地再造轮子。

封装(Encapsulation)是面向对象的三大特征之一(另外两个是继承和多态),它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

就好比使用计算机,我们只需要使用计算机提供的键盘,就可以达到操作计算机的目的,至于在敲击键盘时计算机内部是如何工作,我们根本不需要知道。

封装机制保证了类内部数据结构的完整性,因为使用类的用户无法直接看到类中的数据结构,只能使用类允许公开的数据,很好地避免了外部对内部数据的影响,提高了程序的可维护性。总的来说,对一个类或对象实现良好的封装,可以达到以下目的:

  • 隐藏类的实现细节。
  • 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问。
  • 可进行数据检查,从而有利于保证对象信息的完整性。
  • 便于修改,提高代码的可维护性。

为了实现良好的封装,需要从以下两个方面来考虑:

  1. 将对象的属性和实现细节隐藏起来,不允许外部直接访问。
  2. 把方法暴露出来,让方法来控制对这些属性进行安全的访问和操作。

因此,实际上封装有两个方面的含义:把该隐藏的隐藏起来,把该暴露的暴露出来。

2. 二次封装Selenium中几个方法

本文来介绍,如何把常用的几个webdriver的方法封装到自己写的一个类中去,这个封装过程叫二次封装Selenium方法。我们把打开站点,浏览器前进和后退,关闭和退出浏览器这这个方法封装到一个新写的类中去。

我们按照如下层次结构在PyCharm中新建两个包和两个.py文件:

上图,baidu_search.py是我们编写测试脚本的python文件,具体测试代码写在这个文件。包test1下的basepage.py文件是这次我们介绍的二次封装selenium方法而新建的。这里提一下,python中默认规则,包名和文件名都是小写,类名称单词首字母大写,函数名称小写,多个字母下划线隔开。我们尽量遵守下这个不成文的约定。

来看看basepage.py的内容:

2.1 代码实现:

2.2 参考代码:

python 复制代码
# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-03-24
@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 参考代码:

python 复制代码
# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-03-24
@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

python 复制代码
# 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的值,去测试三大浏览器是否启动正常。

python 复制代码
# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2025-03-24
@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. 小结

好了,今天的分享就到这里吧!!!谢谢各位的耐心阅读。

您的肯定就是我进步的动力。 如果你感觉还不错,就请鼓励一下吧!记得随手点波 推荐 不要忘记哦!!!

相关推荐
程序小武16 分钟前
python编辑器如何选择?
后端·python
陈随易18 分钟前
薪资跳动,VSCode实时显示今日打工收入
前端·后端·程序员
七灵微22 分钟前
【前端】SPA v.s. MPA
前端
一叶知秋121125 分钟前
UV管理python项目
python
fqq330 分钟前
CSS级联样式(基础知识)备忘录
前端·css
前端小巷子30 分钟前
JS深拷贝与浅拷贝
前端·javascript·面试
AndrewHZ31 分钟前
【图像处理入门】2. Python中OpenCV与Matplotlib的图像操作指南
图像处理·python·opencv·计算机视觉·matplotlib·图像操作
用户214118326360231 分钟前
N8N教程-手把手教你搭建 N8N 自动化工作流:从安装到云部署全流程实战
前端·vue.js
Mintopia1 小时前
Three.js 环境贴图:给你的 3D 世界加个梦幻滤镜
前端·javascript·three.js
Mintopia1 小时前
JavaScript 里的光影魔术师:光线投射
前端·javascript·计算机图形学