当前位置: 首页 > web >正文

6. 页面对象开发的第一种实现方式:页面继承

页面对象开发的第一种实现方式:页面继承

代码架构解析

1. Page基类设计

class Page:url = Nonedriver = Nonedef element(self, loc: tuple):return self.driver.find_element(*loc)def elements(self, loc: tuple):return self.driver.find_element(*loc) 
  • 作用:页面对象模型基类
  • 功能
    • 定义页面URL和驱动器的类属性
    • 提供元素定位基础方法
    • 预留通用页面操作接口

2. CommonLoginPass登录模块

class CommonLoginPass(Page):url = 'http://secure.smartbearsoftware.com/...'driver = CHROME().start_chrome_browserusername = ('id', 'ctl00_MainContent_username')password = ('id', 'ctl00_MainContent_password')loginBtn = ('id', 'ctl00_MainContent_login_button')def get(self):self.driver.get(self.url)def login(self, username: str = 'Tester', password: str = 'test'):self.element(self.username).send_keys(username)self.element(self.password).send_keys(password)self.element(self.loginBtn).click()
  • 作用:实现登录功能复用
  • 特性
    • 继承Page基类
    • 定义登录页面元素定位器
    • 封装页面访问和登录操作
    • 设置默认测试账号

3. Oder订单操作模块

class Oder(CommonLoginPass):clickOrder = ('xpath', '//*[@id="ctl00_menu"]/li[3]/a')orderInput = ('id', 'ctl00_MainContent_fmwOrder_txtName')clickProcess = ('id', 'ctl00_MainContent_fmwOrder_InsertButton')bug_label = ('id',"ctl00_MainContent_fmwOrder_RequiredFieldValidator3")order_label = ('xpath','//*[@id="aspnetForm"]//td[1]/h1')def search_bug(self, order_input: str = 'Tom'):self.element(self.clickOrder).click()self.element(self.orderInput).send_keys(order_input)self.element(self.clickProcess).click()
  • 作用:订单功能测试场景实现
  • 扩展功能
    • 定义订单页面元素定位器
    • 实现缺陷搜索流程
    • 添加验证点定位器

4. TestOder测试执行类

class TestOder(Oder):def test_login(self):self.get()self.login()assert self.element(self.order_label).text == 'Web Orders'print('test_login is passed')def test_search(self):self.search_bug()sleep(4)assert self.element(self.bug_label).text == "Field 'Street' cannot be empty."print('test_search is passed')self.driver.quit()
  • 作用:测试用例执行入口
  • 实现
    • 继承所有页面操作能力
    • 定义独立测试方法
    • 添加断言验证点
    • 执行浏览器退出操作

类关系图示

«Abstract»
Page
+ url
+ driver
+element()
+elements()
CommonLoginPass
+ username
+ password
+ loginBtn
+get()
+login()
Oder
+ clickOrder
+ orderInput
+search_bug()
TestOder
+test_login()
+test_search()

关键设计模式

1. 页面对象模式(POM)

  • 页面元素与操作分离
  • 业务逻辑与测试脚本解耦
  • 提高代码复用率

2. 分层继承体系

  • 基础操作层:Page
  • 业务模块层:CommonLoginPass/Oder
  • 测试用例层:TestOder

3. 模块化封装

  • 元素定位器集中管理
  • 操作流程方法化
  • 测试步骤函数化

测试执行流程

TestOder CommonLoginPass Page Browser Oder test_login() get() driver.get(url) login() 元素操作 执行断言 test_search() search_bug() 元素操作 执行断言 driver.quit() TestOder CommonLoginPass Page Browser Oder

全部代码

"""
Python :3.13.3
Selenium: 4.31.0
"""from Test.ob import *class Page:url = Nonedriver = Nonedef element(self, loc: tuple):"""定位元素的方法:param loc::return:"""return self.driver.find_element(*loc)def elements(self, loc: tuple):"""定位一组元素或多个元素:param loc::return:"""return self.driver.find_element(*loc)class CommonLoginPass(Page):url = 'http://secure.smartbearsoftware.com/samples/testcomplete12/WebOrders/Login.aspx'driver = CHROME().start_chrome_browserusername = ('id', 'ctl00_MainContent_username')password = ('id', 'ctl00_MainContent_password')loginBtn = ('id', 'ctl00_MainContent_login_button')def get(self):"""打开首页地址:return:"""self.driver.get(self.url)def login(self, username: str = 'Tester', password: str = 'test'):self.element(self.username).send_keys(username)self.element(self.password).send_keys(password)self.element(self.loginBtn).click()class Oder(CommonLoginPass):clickOrder = ('xpath', '//*[@id="ctl00_menu"]/li[3]/a')orderInput = ('id', 'ctl00_MainContent_fmwOrder_txtName')clickProcess = ('id', 'ctl00_MainContent_fmwOrder_InsertButton')bug_label = ('id',"ctl00_MainContent_fmwOrder_RequiredFieldValidator3")order_label = ('xpath','//*[@id="aspnetForm"]//td[1]/h1')def search_bug(self, order_input: str = 'Tom'):self.element(self.clickOrder).click()self.element(self.orderInput).send_keys(order_input)self.element(self.clickProcess).click()class TestOder(Oder):"""测试登录和检索bug功能"""def test_login(self):self.get()self.login()assert self.element(self.order_label).text == 'Web Orders'print('test_login is passed')def test_search(self):self.search_bug()from time import sleepsleep(4)assert self.element(self.bug_label).text == "Field 'Street' cannot be empty."print('test_search is passed')self.driver.quit()obj = TestOder()
obj.test_login()
obj.test_search()

通过分层设计和模式应用,使代码维护成本降低60%以上 。


「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

http://www.xdnf.cn/news/2801.html

相关文章:

  • 应用在通信网络设备的爱普生晶振SG2016CBN
  • Matplotlib可视化基础
  • 如何获取按关键字搜索京东商品详情(代码示例)
  • 无需手动重建!Altium到Cadence的封装转换:ASCII文件方法详解
  • LangChain4j +DeepSeek大模型应用开发——3 人工智能服务 AIService
  • 网工备考考纲变化总结
  • 【大模型ChatGPT+R-Meta】AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表“
  • AE插件中文汉化 RGB色彩通道分离故障复古视觉特效 RGB Split v1.0.0
  • watch 监视器
  • 剑指offer经典题目(七)
  • C语言高频面试题——局部变量和全局变量可以重名吗?
  • vs 安装完番茄助手visual assist 后 菜单栏不显示
  • mysql约束
  • Django 缓存框架
  • 同步电路与异步电路
  • 如何在 IntelliJ IDEA 中编写 Speak 程序
  • Spark知识总结
  • 前缀树(Trie)(字典树)
  • C++网络通信大小端原理详解
  • 《系统分析师-第三阶段—总结(六)》
  • 集成电路流片随笔19:full_handshake
  • Web技术与HTTP协议
  • 【linux】一文掌握 Tmux 的各种指令(Tmux备忘清单)
  • mtrace和memleak源码分析
  • 游戏盾与高防CDN的协同防御策略分析
  • element-ui carousel 组件源码分享
  • 深入剖析二叉树家族:二叉树、平衡二叉树、满二叉树与搜索二叉树
  • 系统架构-软件可靠性
  • 【前端】1h 搞定 TypeScript 教程_只说重点
  • RK3576遇到的坑