高效易懂,打造维护性好的Web自动化测试框架PO模式精讲

news/2024/11/9 9:51:10/

目录

前言:

一、 PO概述

二、PO何实现于Web框架素自动化测试重中之重。

1.为了保证易维护性和易读性,我们可以在项目中定义一个统一的库,用来存放所有的定位器类。

2.定义一个基础的类,该类用于针对PO的元素定位进行封装。

3.基础类之后,我们就可以定义具体的PO元素了。

总结:


前言:

随着SaaS、PaaS、IaaS等“云服务”在企业中广泛应用,企业的软件开发也日益向云平台迁移。而WEB应用程序是目前最广泛使用的应用程序之一。在WEB开发中,动框架为常态封装自动框架为重要。

一、 PO概述

随着SaaS、PaaS、IaaS等“云服务”在企业中广泛应用,企业的软件开发也日益向云平台迁移。而Web应用程序是目前最广泛使用的应用程序之一。在Web开发中,自动化测试框架成为常态,其中封装的自动化框架最为重要,这篇文章将介绍如何针对表现层的PO元素进行自动化定位。

Page Object模式是一种常用的自动化测试框架模式,目的是将Web页面抽象为一个对象,将业务流程功能尽量细分,避免冗余代码逻辑。同时,也为自动化测试提供了更好的可维护性、代码复用性。Page Object就是用来描述页面上的行为和数据,并封装为一个对象的。

在Page Object模式中,一个页面包含许多元素,如输入框、按钮、复选框等,我们把这些元素抽象为一个个组件,每个组件对应着页面中的一个元素。将用户在页面上的操作拆分为一个个组件,便于代码组织和代码复用。

由此可以看出,PageObject模式有两个核心点:

1.把页面上的每一个页面元素抽象出来,封装为一些方法(组件);
2.让测试用例去调用这些方法(组件),实现Web自动化测试。

二、PO何实现于Web框架素自动化测试重中之重。

在Selenium WebDriver中,元素定位有8种方式,分别是classname、css selector、id、link text、name、partial link text、tag name和xpath。

在进行页面元素自动定位时,需要考虑以下几个因素:

1.易维护性:代码逻辑精简,方便后期维护。
2.易读性:在写代码时,尽量保持代码的易读性,让代码可读性更好,便于后续修改。
3.鲁棒性:尽可能避免页面元素的变化带来的测试用例失败,降低维护成本。

基于这几个因素,我们可以封装一些方法来满足PO模式。具体步骤如下:

1.为了保证易维护性和易读性,我们可以在项目中定义一个统一的库,用来存放所有的定位器类。

例如:

class LoginPageLocators:

# 名称输入框定位器USERNAME_INPUT_LOC = ('id', 'username')# 密码输入框定位器PASSWORD_INPUT_LOC = ('id', 'password')# 登录按钮定位器LOGIN_BUTTON_LOC = ('xpath', '//*[@id="login-btn"]')

2.定义一个基础的类,该类用于针对PO的元素定位进行封装。

例如:

class BasePageElements:

locator = None # 元素定位器def __init__(self, driver: WebDriver):self.driver = driver # 初始化浏览器驱动self.element = Nonedef find(self, wait_time=5):"""元素查找"""WebDriverWait(self.driver, wait_time).until(EC.presence_of_element_located(self.locator))self.element = self.driver.find_element(*self.locator)return self.elementdef click(self):"""元素点击"""self.find().click()def send_keys(self, value):"""元素输入"""self.find().send_keys(value)def get_text(self):"""获取元素文本"""return self.find().text

3.基础类之后,我们就可以定义具体的PO元素了。

例如:

class UsernameInput(BasePageElements):locator = LoginPageLocators.USERNAME_INPUT_LOCclass PasswordInput(BasePageElements):locator = LoginPageLocators.PASSWORD_INPUT_LOCclass LoginButton(BasePageElements):locator = LoginPageLocators.LOGIN_BUTTON_LOC

在具体实现时,我们只需要在测试用例中引入这些类即可。

例如:

class TestLogin:

def setup_method(self):self.driver = webdriver.Chrome()self.driver.implicitly_wait(20)self.login_page = LoginPage(self.driver)self.login_page.open()def test_login(self):username_input = UsernameInput(self.driver)password
_input = PasswordInput(self.driver)login_button = LoginButton(self.driver)username_input.send_keys('example')password_input.send_keys('password')login_button.click()

在上述代码中,我们先初始化驱动对象,然后实例化LoginPage对象,并打开登录页面。接着我们通过实例化一个元素对象,来使用自定义的方法进行定位和操作。完成登录操作后,我们可以在测试用例中进行断言,以判断登录模块的正确性。

总结:

在这篇文章中,我们对PO模式进行了简单的介绍,并针对PO元素的自动定位进行了封装。以此来满足易维护、易读、鲁棒的原则,提高Web自动化测试的可靠性和可维护性。

作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些自动化测试的学习资源,如果你用得到的话可以直接拿走,希望能对你带来帮助。(包括Python编程、WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、性能测试、安全测试、大厂面试真题、简历模板等等),相信能使你更好的进步!

获取方式:留言【自动化测试学习】即可免费获取

【自动化测试交流】:574737577(进群备注ccc)http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=5Yy1aF4jOfrqXFA_eg14oG9EZ5fFbv5A&authKey=zYx3Zivwu55NOCM%2B%2BKqaZjoeTRS5xMdAmfqX%2FyzUm4lvrD4q75P5Ukeg%2FPBRMMbm&noverify=0&group_code=574737577


http://www.ppmy.cn/news/73670.html

相关文章

MySQL和Redis如何保证数据一致性?

前言 由于缓存的高并发和高性能已经在各种项目中被广泛使用,在读取缓存这方面基本都是一致的,大概都是按照下图的流程进行操作: 但是在更新缓存方面,是更新完数据库再更新缓存还是直接删除缓存呢?又或者是先删除缓存再…

RK3568平台开发系列讲解(LCD篇)快速了解RK LCD的使用

🚀返回专栏总目录 文章目录 一、内核Config配置二、MIPI配置2.1 引脚配置2.2 背光配置2.3 显示时序配置2.3.1 Power on/off sequence2.3.2 Display-Timings三、EDP配置3.1 引脚配置3.2 EDP背光配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇章带大家快速了…

Docker 常用命令及演示demo

Docker 常用命令及演示 以下是一些常用的 Docker 命令以及对应的演示示例。请注意,示例中的命令和参数可能需要根据您的实际环境和需求进行相应的修改。 容器生命周期管理 docker run: 创建并运行一个容器 docker run -d --name my_container nginxdocker start: …

C语言实现的简单线程池:基于pthread的轻量型Threadpool设计

目录 线程池(Threadpool)是什么? pthread库是什么? 如何在C语言中实现基于pthread的轻量型线程池? 你好,各位编程爱好者!今天,我将和大家分享一种在C语言中实现的简单线程池设计方…

失业五个月,终于有offer了!但这家公司的风评惨不忍睹,要接吗?

往年,程序员们找工作可以说是不怎么费力的,不少求职者还会比对几家offer,看薪酬、看加不加班、看通勤时间等等等等,最后选择自己最满意的那一家过去。 但是今年,情况确实完全不一样,用网友的话形容就是“往…

Flutter 笔记 | Flutter 核心原理(一)架构和生命周期

Flutter 架构 简单来讲,Flutter 从上到下可以分为三层:框架层、引擎层和嵌入层,下面我们分别介绍: 1. 框架层 Flutter Framework,即框架层。这是一个纯 Dart实现的 SDK,它实现了一套基础库,自…

探索Vue的组件世界-实现Vue插件

一个好的框架满足几大设计原则: 开闭原则:对修改源码关闭,对功能扩展开放 vue作为一个优秀的组件框架:满足开闭原则,提供良好的插件机制,以提供三方来扩展功能 Mixin模式 Vue.mixin(mixin) 全局注册的m…

安装Ubuntu18.04双系统、干净卸载,并在Ubuntu系统中安装CARLA模拟器

Ubuntu系统安装 Ubuntu系统安装参照流程 Ubuntu 双系统安装流程_ubuntu双系统_地球被支点撬走啦的博客-CSDN博客 Ubuntu系统卸载 1.将开机启动项设置默认为Windows,进入BIOS设置界面调整BootDevice中Windows和Ubuntu的顺序,将Windows调整在Ubuntu前边…