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

Python+Selenium+PO设计模式实战指南

1. PO设计模式概述

PO设计模式将网页的页面元素和操作封装到类中,每个页面对应一个类,每个类中的方法代表与页面交互的操作。这种方式有助于将页面元素的定位和操作与测试脚本的逻辑解耦,从而提高代码的可维护性。

2. PO设计模式的核心思想

  • 页面与测试代码分离:页面类只关心页面元素的定位和操作,而测试类只关注测试逻辑。
  • 封装页面元素和操作:页面对象类封装了页面中的所有元素以及对这些元素的操作。
  • 提高复用性:相同页面的不同测试用例可以重用相同的页面对象类。

3. Page Object模型的优缺点

优点:

  • 代码复用:多个测试用例可以共享一个页面对象,避免重复代码。
  • 易于维护:当页面发生变化时,只需要修改页面对象类,不需要改动所有的测试用例。
  • 清晰的层次结构:测试脚本关注测试逻辑,页面对象关注页面交互,职责分离。

缺点:

  • 学习曲线:对于初学者来说,理解和实现PO模式需要一定的学习时间。
  • 类的数量增加:每个页面都需要一个页面对象类,可能导致类文件过多。

4. PO设计模式的结构

PO设计模式通常包括三个部分:

  • Page Object:页面对象类,封装了页面元素和操作。
  • Test Case:测试用例类,调用页面对象进行测试。
  • Test Driver:测试驱动脚本,运行测试用例。

5. 如何使用Selenium + unittest结合PO设计模式

使用Selenium和unittest框架编写自动化测试时,可以按照以下步骤实现PO设计模式。

封装基类

from selenium.common import TimeoutException
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWaitclass Base:def __init__(self):self.driver = webdriver.Chrome()self.driver.maximize_window()self.driver.get(r'http://localhost:8080/')def base_find_element(self, loc, timeout=10, poll=0.5):"""定位元素:param loc: 元组 (By.ID,属性值) (By.CLASS_NAME,属性值) (By.XPATH,属性值):param timeout: 超时时间:param poll: 轮询间隔:return: 元素定位对象"""return WebDriverWait(self.driver, timeout, poll).until(lambda x: x.find_element(*loc))def base_click(self, loc):self.base_find_element(loc).click()def base_input(self, loc, value):el = self.base_find_element(loc)el.clear()el.send_keys(value)def base_get_info(self, loc, path):try:self.base_find_element(loc)return Trueexcept TimeoutException:self.base_get_image(path)return Falsedef base_get_image(self, path):return self.driver.get_screenshot_as_file(path)

步骤1:定义页面对象类

页面对象类封装了与页面元素的交互,常见的操作包括点击按钮、输入文本、获取页面内容等。

from selenium.webdriver.common.by import By"""登录页数据"""
login_login_link = By.XPATH, "/html/body/header/div/div/nav/div/div/a[1]"
login_username = By.NAME, 'username'
login_password = By.NAME, 'password'
login_login_button = By.XPATH, "/html/body/div[1]/div/div[2]/form/button"
login_login_info = By.XPATH, "/html/body/header/div/div/nav/div/div/div/button"
from v4.base import Base
from v4 import pageclass PageLogin(Base):def page_click_login(self):"""点击登录链接"""self.base_click(page.login_login_link)def page_input_username(self, username):"""输入用户名"""self.base_input(page.login_username, username)def page_input_password(self, password):"""输入密码"""self.base_input(page.login_password, password)def page_click_login_button(self):"""点击登录按钮"""self.base_click(page.login_login_button)def page_get_info(self, path, username, password):"""获取登录信息"""if self.base_get_info(page.login_login_info, path):print(f"账号:{username} 密码:{password} 登录成功")else:print(f"账号:{username} 密码:{password} 登录失败")def page_login(self, username, password, path):"""登录操作"""self.page_click_login()self.page_input_username(username)self.page_input_password(password)self.page_click_login_button()self.page_get_info(path, username, password)

步骤2:编写测试用例

测试用例类继承unittest.TestCase,在其中编写具体的测试逻辑。页面对象类的实例化和方法调用将在测试用例中进行。

import unittest
from parameterized import parameterized
from v4.page.page_login import PageLoginclass TestLogin(unittest.TestCase):def setUp(self):self.login = PageLogin()def tearDown(self):self.login.driver.quit()@parameterized.expand([("demo", "demo123", "demo_demo123.png"),("falamo1", "falamo1", "falamo1_falamo1.png")])def test_login(self, username, password, path):self.login.page_login(username, password, path)if __name__ == '__main__':unittest.main()

6. 总结

PO设计模式可以让自动化测试更加模块化、易于维护和扩展。通过将页面操作封装到页面对象类中,我们可以让测试用例更加简洁,便于理解和修改。此外,PO模式能够有效地提高自动化测试的复用性和可扩展性。

http://www.gsyq.cn/news/64168.html

相关文章:

  • 数据泄露已成为现实威胁,你的Salesforce安全做好了吗?
  • 2025年11月SEM扫描电镜厂家推荐榜:进口/国产/日立/国仪/钨灯丝/FIB/日立冷场/电子/场发射/高分子/超高分辨率/扫描电镜品牌综合参考指南,上海富泰微——微观视界的硬核担当
  • 2025年11月深圳网站建设公司TOP榜:知名网站建售/外贸网站建设公司后保障双维度解析
  • 机器学习在医疗领域的创新应用
  • 2025年橡塑保温板直销厂家权威推荐榜单:B1级橡塑板/橡塑隔音棉‌/橡塑海绵板‌源头厂家精选
  • 2025年煤矿刮板机供货厂家权威推荐榜单:刮板机/刮板机链轮/刮板机输送机源头厂家精选
  • Branch-GAN:一种高质量写作对抗模型生成方法
  • Vue 3 + Vite + Router + Pinia + Element Plus + Monorepo + qiankun 构建企业级中后台前端框架
  • 涂鸦智能:扫地机器人一体化解决方案
  • 2025年中国十大GEO全域搜索营销专业公司推荐:靠谱的GE
  • 2025年11月电磁吸盘厂家推荐榜:五大厂家综合对比与权威评价
  • 2025年度十大AI手机推荐,有高刷新率屏幕的AI手机、AI
  • 数组和张量
  • 2025年十大AI获客手机服务排行榜,新测评精选AI获客手机
  • 佛山口碑好的桶装水配送专业公司推荐:本地靠谱的桶装水配送品牌
  • PostgreSQL里的JSONB到底怎么玩
  • Castle.core AOP
  • 05.再修改一次网站练习Git使用流程
  • 2025年沈阳大连天津石家庄郑州高性价比的自助KTV场所、服
  • 成都火锅团建2025年口碑榜,吃货们都在推荐这些店,四川火锅/市井火锅/川渝火锅/特色美食成都本地人推荐的火锅
  • 2025 年气相防锈膜厂家最新推荐榜,技术实力与市场口碑深度解析防锈热收缩膜/防锈抗静电膜/防锈纸/防锈干燥剂/防锈母粒/防锈粉末/防锈盒/防锈管/防锈液公司推荐
  • 习题解析之:完美立方数
  • pandas 处理带有 合并的单元格
  • 代码跑通算复现成功吗
  • 2025年工业无氧烘箱设备厂家TOP5推荐:HMDS 无氧烘箱、真空无氧烘箱、充氮无氧烘箱、高温无氧烘箱、HMDS 真空无氧烘箱、从精密制造到行业适配的务实之选
  • 大模型实验室Lab4AI QA 第一期:Flash Attention 安装 OOM、文件上传失败?解决方法在这
  • 2025 年酚醛复合风管厂家推荐:廊坊康杰通风材料有限公司专业解决方案与工程实践优势解析酚醛复合风管连接铝合金法兰/酚醛复合风管连接铝合金断桥法兰/酚醛复合风管夹心板材厂家推荐
  • NeurlPS2025!香港大学等联合推出Concerto框架 突破单模态局限,为三维场景理解注入新范式
  • 03.修改网站并再次使用Git
  • 2025广州知名留学中介机构有哪些