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()
- 作用:测试用例执行入口
- 实现:
- 继承所有页面操作能力
- 定义独立测试方法
- 添加断言验证点
- 执行浏览器退出操作
类关系图示
关键设计模式
1. 页面对象模式(POM)
- 页面元素与操作分离
- 业务逻辑与测试脚本解耦
- 提高代码复用率
2. 分层继承体系
- 基础操作层:Page
- 业务模块层:CommonLoginPass/Oder
- 测试用例层:TestOder
3. 模块化封装
- 元素定位器集中管理
- 操作流程方法化
- 测试步骤函数化
测试执行流程
全部代码
"""
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%以上 。
「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀