selenium自动化测试框架之PO设计模式
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,面向对象的特性:封装、继承、多态。在自动化中一样适用,Selenium自动化测试中有一个名字常常被提及PageObject(思想与面向对象的特性相同),通过PO模式可以大大提高测试用例的维护效率。##
千家信息网最后更新 2026年11月02日selenium自动化测试框架之PO设计模式
面向对象的特性:封装、继承、多态。在自动化中一样适用,Selenium自动化测试中有一个名字常常被提及PageObject(思想与面向对象的特性相同),通过PO模式可以大大提高测试用例的维护效率。
##传统测试脚本的弊端
- 测试脚本分离,维护成本高
- 可扩展性差
- 复用性低等
PageObject设计模式
PO的核心要素:
- 在PO模式中抽象封装成一个BasePage类,该基类应该拥有一个只实现webdriver实例的属性。
- 每个一个page都继承BasePage,通过driver来管理本page中元素,将page中的操作封装成一个个的方法。
- TestCase继承unittest.Testcase类,并且依赖page类,从而实现相应的测试步骤。
案例
基础案例
前面基础场景选取的是baidu搜索页面(baidu页面简单,不需要搭建测试环境)baidu.py
from selenium import webdriverfrom time import sleepdriver = webdriver.Firefox()driver.get("http://www.baidu.com")driver.find_element_by_xpath("//input[@id='kw']").send_keys("Bela")driver.find_element_by_xpath("//input[@id='su']").click()sleep(5)driver.quit()将上面的脚本放在baidu.py文件中。
分析
通过对baidu.py脚本的分析,可以提取到:
- 不同的运行脚本环境,浏览器不同:驱动webdriver.Firefox()可以剥离,
- 请求地址的变化(生产环境与测试环境):url==http://www.baidu.com可以剥离
- 操作元素时,常常需要等待元素加载完毕后方可进行操作:是否可以把webdriver提供的findelement* 方法封装下,才操作元素前,先判断元素的是否可操作。
===================================================
实际测试场景中,可能有多个测试场景,如果每个测试场景都需要维护url、浏览器驱动、元素定位等,效率会非常低。
- 因此基于对上面的分析,是否可以设计一个所有测试页面(selenium本身是对B/S系统开展测试)的基类,来维护一些公共的方法。此处先定义个名字哦BasePage.py,用于存放页面公共方法及webdriver原有方法二次封装等。
BasePage.py内容如下:
from selenium.webdriver.support.wait import WebDriverWaitfrom selenium import webdriverfrom selenium.webdriver.support import expected_conditions as ECclass BasePage(object): """ BasePage封装所有页面都公用的方法,例如driver, Find_Element等 """ # 实例化BasePage类时,最先执行的就是__init__方法,该方法的入参,其实就是BasePage类的入参。 # __init__方法不能有返回值,只能返回None def __init__(self,selenium_driver,base_url): self.driver = selenium_driver self.base_url = base_url # self.pagetitle = pagetitle def on_page(self,pagetitle): return pagetitle in self.driver.title def _open(self,url): self.driver.get(url) self.driver.maximize_window() def open(self): self._open(self.base_url,self.pagetitle) def find_element(self,*loc): #*loc任意数量的位置参数(带单个星号参数) # return self.driver.find_element(*loc) try: WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc)) return self.driver.find_element(*loc) except: print("%s 页面未能找到 %s 元素"%(self,loc)) def script(self,src): self.driver.excute_script(src) def send_keys(self, loc, vaule, clear_first=True, click_first=True): try: loc = getattr(self, "_%s" % loc) # getattr相当于实现self.loc if click_first: self.find_element(*loc).click() if clear_first: self.find_element(*loc).clear() self.find_element(*loc).send_keys(vaule) except AttributeError: print("%s 页面中未能找到 %s 元素" % (self, loc))测试脚本的优化
BasePage.py提取完毕,其中设计了BasePage类,对一些webdriver的方法进行了二次封装。
baidu.py基于BasePage.py进行优化(充分体现PO的设计思想,封装、继承)
# 基本测试场景# from selenium import webdriver# from time import sleep## driver = webdriver.Firefox()# driver.get("http://www.baidu.com")## driver.find_element_by_xpath("//input[@id='kw']").send_keys("Bela") #输入框# driver.find_element_by_xpath("//input[@id='su']").click() #百度一下按钮## sleep(3)# driver.quit()# 优化后的测试场景from selenium.webdriver.common.by import Byfrom PODemo.BasePage import BasePage #假设baidu.py、BasePage.py均在PODemo.BasePage目录下from selenium import webdriverclass SearchPage(BasePage): # 定位元素 search_loc = (By.ID,"kw") btn_loc = (By.ID,"su") def open(self): self._open(self.base_url) def search_content(self,content): BaiduContent = self.find_element(*self.search_loc) BaiduContent.send_keys(content) def btn_click(self): BaiduBtn = self.find_element(*self.btn_loc) BaiduBtn.click()PageObject总结

- PO设计模式中的BasePage基类对应案例中的BasePage.py文件。
- PO模式中的page1或pageN对应案例中的Search.py
- PO设计模式中TestCase对应案例中的TestCase.py
如果你想系统学习,打个广告吧
推广下我的博客专栏,目前选定了一个主题《从零学Selenium自动化测试框架》,让我们从代码撸起,一步步实现Web自动化测试框架
该专题会从零带你搭建一个可用的自动化测试框架(基于python+selenium)
前提:你要掌握了python与selenium基础哦。要不你看不懂的。
测试
方法
元素
封装
页面
模式
设计
场景
脚本
自动化
案例
环境
框架
设计模式
基础
分析
不同
参数
名字
实例
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
瑰夏咖啡
为想互联网科技怎么样
互联网科技公司华为
河南真二互联网科技有限公司
互联网下的科技发展
金融科技 互联网金融
苏州互联网科技贷款公司
互联网科技视频素材
佩信高科技互联网
互联网巨头投资的硬核科技
济南华为互联网科技产业总部基地
互联网科技中介
杭州壁岐互联网科技有限公司
深圳育鹏互联网科技有限公司招聘
996高科技互联网公司
燊美集互联网科技有限公司
互联网方面的科技前沿
云鲸互联网络科技有限公司
求路客互联网科技电话
青岛易易互联网科技
厦门中拓互联网络科技有限公司
互联网公司 科技公司
上海亿帐通互联网科技
富国互联网科技创新基金
温州喔噻互联网科技有限公司
随着互联网科技发展
科技与互联网哪个更好
企晟互联网信息科技有限公司
明优互联网科技有限公司
每日互联网科技新闻