selenium自动化测试框架之PO设计模式
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,面向对象的特性:封装、继承、多态。在自动化中一样适用,Selenium自动化测试中有一个名字常常被提及PageObject(思想与面向对象的特性相同),通过PO模式可以大大提高测试用例的维护效率。##
千家信息网最后更新 2025年01月31日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安全错误
数据库的锁怎样保障安全
网络安全与信息化小组成立
app一般用什么服务器
各种数据库连接池
网络技术创世纪愿景
从属数据库
网站可以挂移动的服务器吗
云服务器安全防护等级
软件开发屏幕分辨率多少合适
数据库主从同步数据验证
天津通用软件开发价格表格
河北系统软件开发哪里好
飞机信息数据库
关于我与网络安全的画
法规关于网络安全经费
信息软件开发的步骤
做一个上位机软件开发
耐药基因数据库是哪个
网络安全守护绿色校园
把数据库连接到内存卡
服务器和光纤的连接方法
键 数据库
黑魂三最捏脸数据库
近年网络技术的发展
意识形态网络安全培训课件
烟台慕彤网络技术有限公司
魔兽世界单机人物数据库
office全版数据库
软件开发面试知识点
怀旧服可以直接换服务器吗
体育对冲软件开发