Python教程:一文了解PageObject模式

简介: PageObject 模式通常用于 Web 应用程序的 UI 自动化测试,尤其是在使用 Selenium、Appium 、Airtest等工具进行测试时非常有效。但是,它并不局限于特定类型的应用或工具,而是一种通用的设计模式,可以用于任何需要进行 UI 自动化测试的场景。

PageObject 模式是一种用于测试自动化的设计模式,它将页面的功能和页面的实现分开,提高了代码的可维护性和可重用性。本文将从基础概念开始,逐步介绍 Python 中的 PageObject 模式,并提供详细的代码示例。

1. 什么是 PageObject 模式?

PageObject 模式是一种测试自动化的设计模式,它将页面的功能封装在一个对象中,使得测试代码可以专注于页面的行为而不必关心页面的实现细节。这种模式通过将页面的元素和操作封装在一个对象中,提高了测试代码的可维护性和可重用性。

2. PageObject 模式的基本原理

在 PageObject 模式中,每个页面都有一个对应的 PageObject 类,该类包含页面的元素定位器和操作方法。测试代码通过调用 PageObject 类的方法来执行操作和断言,而不直接操作页面的元素。

from selenium.webdriver.common.by import By
class LoginPage:
    """登录页面的 PageObject 类"""
    # 页面元素定位器
    USERNAME_INPUT = (By.ID, 'username')
    PASSWORD_INPUT = (By.ID, 'password')
    LOGIN_BUTTON = (By.ID, 'login-button')
    def __init__(self, driver):
        self.driver = driver
    # 页面操作方法
    def enter_username(self, username):
        self.driver.find_element(*self.USERNAME_INPUT).send_keys(username)
    def enter_password(self, password):
        self.driver.find_element(*self.PASSWORD_INPUT).send_keys(password)
    def click_login_button(self):
        self.driver.find_element(*self.LOGIN_BUTTON).click()

image.gif

在这个示例中,LoginPage 类封装了登录页面的元素定位器和操作方法。

3. 使用 PageObject 进行测试

在测试代码中,我们可以通过实例化 PageObject 类来执行页面操作。

from selenium import webdriver
# 创建 WebDriver 实例
driver = webdriver.Chrome()
# 导入 PageObject 类
from login_page import LoginPage
# 实例化 LoginPage 类
login_page = LoginPage(driver)
# 执行页面操作
login_page.enter_username('username')
login_page.enter_password('password')
login_page.click_login_button()

image.gif

在这个示例中,我们通过实例化 LoginPage 类并调用其方法来执行登录页面的操作。

4. PageObject 模式的优点

  • 提高代码的可维护性: 将页面的元素和操作封装在 PageObject 类中,使得测试代码更加清晰和易于维护。
  • 提高代码的可重用性: 可以在多个测试用例中重复使用同一个 PageObject 类,避免了代码的重复编写。
  • 降低测试代码的耦合度: 测试代码不直接操作页面元素,而是通过调用 PageObject 类的方法来执行操作,降低了代码的耦合度。

5. PageObject 模式的最佳实践

  • 命名规范: PageObject 类的命名应该与页面的功能相关,并且使用驼峰命名法。
  • 封装原则: 将页面的元素和操作封装在一个对象中,避免暴露页面的实现细节。
  • 维护更新: 随着页面的变化,及时更新 PageObject 类中的元素定位器和操作方法。

6. Airtest示例

首先,我们需要安装 Airtest 库。你可以使用以下命令来安装:

pip install airtest

然后,我们来更新示例代码。

# login_page.py
from airtest.core.api import *
class LoginPage:
    """登录页面的 PageObject 类"""
    def __init__(self):
        connect_device("Android:///")  # 连接到 Android 设备,具体根据你的设备情况修改
    # 页面操作方法
    def enter_username(self, username):
        touch(Template("username_input.png"))  # 使用模板匹配元素
        input_text(username)
    def enter_password(self, password):
        touch(Template("password_input.png"))  # 使用模板匹配元素
        input_text(password)
    def click_login_button(self):
        touch(Template("login_button.png"))  # 使用模板匹配元素

image.gif

# test_login.py
import unittest
from login_page import LoginPage
class TestLoginPage(unittest.TestCase):
    def setUp(self):
        self.login_page = LoginPage()
    def tearDown(self):
        pass
    def test_login(self):
        self.login_page.enter_username('username')
        self.login_page.enter_password('password')
        self.login_page.click_login_button()
        # 添加断言...

image.gif

在这个更新后的示例中,我们使用 Airtest 库来代替 Selenium,实现了相同的页面操作。注意,在实际使用中,你需要根据你的设备情况,修改连接设备的代码。

PageObject 模式通常用于 Web 应用程序的 UI 自动化测试,尤其是在使用 Selenium、Appium 、Airtest等工具进行测试时非常有效。但是,它并不局限于特定类型的应用或工具,而是一种通用的设计模式,可以用于任何需要进行 UI 自动化测试的场景。

虽然 PageObject 最初是针对 Web 应用程序开发的,但其基本原则可以应用于其他类型的应用,包括桌面应用程序、移动应用程序等。只要应用程序有页面或视图,就可以使用 PageObject 模式来组织测试代码。

总的来说,PageObject 模式是一种通用的设计模式,适用于各种类型的 UI 自动化测试场景,但需要根据具体的应用和工具进行相应的调整和实现。

目录
相关文章
|
20天前
|
数据采集 存储 搜索推荐
打造个性化网页爬虫:从零开始的Python教程
【8月更文挑战第31天】在数字信息的海洋中,网页爬虫是一艘能够自动搜集网络数据的神奇船只。本文将引导你启航,用Python语言建造属于你自己的网页爬虫。我们将一起探索如何从无到有,一步步构建一个能够抓取、解析并存储网页数据的基础爬虫。文章不仅分享代码,更带你理解背后的逻辑,让你能在遇到问题时自行找到解决方案。无论你是编程新手还是有一定基础的开发者,这篇文章都会为你打开一扇通往数据世界的新窗。
|
3天前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
11天前
|
Python Windows
Python交互模式
Python交互模式。
8 1
|
15天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【9月更文挑战第5天】性能测试是确保应用在高负载下稳定运行的关键。本文介绍Apache JMeter和Locust两款常用性能测试工具,帮助识别并解决性能瓶颈。JMeter适用于测试静态和动态资源,而Locust则通过Python脚本模拟HTTP请求。文章详细讲解了安装、配置及使用方法,并提供了实战案例,帮助你掌握性能测试技巧,提升应用性能。通过分析测试结果、模拟并发、检查资源使用情况及代码优化,确保应用在高并发环境下表现优异。
42 5
|
1月前
|
XML 程序员 数据格式
豆瓣评分8.6!Python社区出版的Python故事教程,太强了!
Python 是活力四射的语言,是不断发展中的语言。就连使用 Python 多年的行者也不敢说对 Python 的方方面面都了解并可以自由运用,想必读者可能更加无法快速掌握所有重点技巧了。 今天给小伙伴们分享的这份手册是用互动的开发故事来探讨Pyfhonic开发的故事书籍,是一本Python语言详解书籍,由Python的行者根据自身经验组织而成,是为从来没有听说过Python的其他语言程序员准备的一份实用的导学性质的书,笔者试图将优化后的学习体验,通过故事的方式传达给读者。对于零基础的小白来说更建议入门后再来品读。
|
23天前
|
前端开发 JavaScript 数据库
python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
|
29天前
|
数据采集 数据可视化 Ruby
GitHub星标破万!Python学习教程(超详细),真的太强了!
Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。 Python 的设计哲学之一就是简单易学,体现在两个方面: 1. 语法简洁明了:相对 Ruby 和 Perl,它的语法特性不多不少,大多数都很简单直接,不玩儿玄学。 2. 切入点很多:Python 可以让你可以做很多事情,科学计算和数据分析、爬虫、Web 网站、游戏、命令行实用工具等等等等,总有一个是你感兴趣并且愿意投入时间的。
|
22天前
|
Unix Python
python 的标准库模块glob使用教程,主要为glob.glob()使用与glob.iglob()使用
python 的标准库模块glob使用教程,主要为glob.glob()使用与glob.iglob()使用
11 0
|
23天前
|
存储 中间件 PHP
Python编程入门:从零到一的代码实践深入理解 PHP 中的中间件模式
【8月更文挑战第28天】本文旨在通过浅显易懂的方式,向初学者介绍Python编程的基础知识,并结合具体代码示例,带领读者一步步实现从零基础到能够独立编写简单程序的转变。文章将围绕Python语言的核心概念进行讲解,并通过实例展示如何应用这些概念解决实际问题。无论你是编程新手还是希望扩展技能的专业人士,这篇文章都将为你打开编程世界的大门。 【8月更文挑战第28天】在PHP的世界中,设计模式是构建可维护和可扩展软件的重要工具。本文将通过浅显易懂的语言和生动的比喻,带领读者深入理解中间件模式如何在PHP应用中发挥魔力,实现请求处理的高效管理。我们将一步步揭开中间件的神秘面纱,从它的定义、工作原理到
|
23天前
|
SQL Shell API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API