页面对象实现自动化测试,playwright框架

1. 页面对象模型的构成

页面对象是将特定网页(或其部分)的所有交互和元素封装在一个类中的一种设计模式。这种分离方式带来了三个主要组成部分:

  • • 元素选择器:指向网页中特定元素的定义。

  • • 方法:封装与网页元素交互的一个或多个函数。

  • • 属性:与页面相关的附加信息或属性,例如其URL。 POM的核心在于抽象。您不仅是在编写测试,而是在为应用程序的用户界面创建一个直观的接口。

2. 理解页面对象模型的重要性

使用POM确保了测试脚本创建的有序性。其核心思想是将UI交互和元素抽象为易于管理的对象。这种抽象使得UI的变化只需在一个地方进行更新,从而使测试脚本对频繁的应用更新保持韧性。

例如,考虑登录到 https://ray.run/ 的Web应用。与其在每个测试中编写原始的Playwright命令,不如将它们封装在 SignInPage 类中。

2.1 确定属性

以登录表单为例,首先确定页面的属性:

import { type Page } from '@playwright/test';

class SignInPage {
  readonly page: Page;
  readonly url: string = 'https://ray.run/signin';

  public constructor(page: Page) {
    this.page = page;
  }
}

2.2 确定选择器

接下来,确定元素选择器:

import { type Page, type Locator } from '@playwright/test';

class SignInPage {
  readonly page: Page;
  readonly url: string = 'https://ray.run/signin';
  readonly emailInputLocator: Locator;
  readonly passwordInputLocator: Locator;
  readonly signinButtonLocator: Locator;

  public constructor(page: Page) {
    this.page = page;
    this.emailInputLocator = page.getByLabel('Email');
    this.passwordInputLocator = page.getByLabel('Password');
    this.signInButtonLocator = page.getByRole('button', { name: 'Sign In' });
  }
}

2.3 确定动作

接着,识别页面上的操作:

async visit() {
    await this.page.goto(this.url);
}

async login(email: string, password: string) {
    await this.emailInputLocator.fill(email);
    await this.passwordInputLocator.fill(password);
    await this.signInButtonLocator.click();
}

2.4 确定断言

最后,识别断言:

async isSignedIn() {
    await expect(this.page.getByTestId('status')).toHaveText('Signed In');
}

这种结构确保了任何UI更改只需在 SignInPage 类中更新,而不需修改多个测试脚本。

3. 在测试中使用页面对象

有了页面对象,我们可以编写使用封装功能的测试。以下是一个使用之前定义的页面对象的示例测试:

import { test, expect } from '@playwright/test';
import { SignInPage } from './SignInPage';

test('用户登录', async ({ page }) => {
    const signInPage = new SignInPage(page);
    await signInPage.visit();
    await signInPage.login('foo@ray.run', 'bar');
    await signInPage.isSignedIn();
});

3.1 使用Fixtures创建页面对象

Playwright测试框架中的Fixtures概念非常重要。Fixtures用于设置测试环境,并提供对浏览器和页面对象的访问。它们还可以用于创建可以在多个测试中使用的页面对象。

import { test as base } from '@playwright/test';
import { SignInPage } from './SignInPage';

export const test = base.extend<{ signInPage: SignInPage }>({
    signInPage: async ({ page }, use) => {
        const signInPage = new SignInPage(page);
        await use(signInPage);
    },
});

现在我们可以在测试中使用 signInPage Fixture 访问页面对象:

test('用户登录', async ({ signInPage }) => {
    await signInPage.visit();
    await signInPage.login('foo@ray.run', 'bar');
    await signInPage.isSignedIn();
});

3.2. 页面对象的最佳实践

了解了页面对象模型及其在Playwright中的实现后,接下来我们来看一些创建页面对象的最佳实践。

为每个页面创建单独的页面对象:每个应用页面应有其对应的页面对象,以确保代码的有序性和可维护性。

  • • 分离动作和断言:在页面对象中分开动作和断言,便于理解测试流程,确保页面对象可重用。

  • • 避免扩展页面对象:应避免扩展页面对象,避免导致页面对象臃肿,难以维护。

  • • 保持页面对象小巧:页面对象应专注于单个页面或页面的一小部分,确保代码清晰且易于维护。

  • • 不在页面对象中使用状态:避免在页面对象中使用状态,以提高其可重用性并简化测试流程。

3.3 优秀页面对象的原则

Playwright中实施页面对象模型时,遵循以下原则是至关重要的:

  • • 单一职责原则(SRP):每个页面对象应负责一个单一页面或页面的小部分。

  • • 抽象:页面对象应抽象出与页面交互的细节。

  • • 封装:页面对象应封装页面的状态和行为。

  • • 可重用性:设计为可在不同测试中重用,减少代码重复。

  • • 易于理解:方法和变量的命名应清晰易懂,提升可读性。

  • • 关注分离:测试代码应专注于页面的高层行为,而页面对象处理低层细节。

3.4 页面对象模型的优势

POMQA工程师提供了明显的优势:

  • • 可重用性:常见的页面交互只需定义一次,可以在多个测试脚本中使用。

  • • 可读性:测试代码变得自解释,同事无需深入UI细节即可理解流程。

  • • 可维护性:UI更改时,只需更新相关的页面对象,轻松应对变化。

小要点

  • • 页面对象模型(POM`)是一种设计模式,抽象出页面特定的属性、选择器、操作和断言。

  • • 在Playwright中实施POM涉及为每个页面创建单独的类,实施用户操作的方法,并在测试中使用这些页面对象。

  • • 避免常见的陷阱,例如扩展页面对象、混合操作和断言以及创建臃肿的页面对象。 在Playwright中实施页面对象模型只是全面测试自动化策略的一部分。继续探索学习更多设计模式和最佳实践,提升您的测试自动化工作。

4. Playwright框架简介

Playwright框架是由微软开发的开源测试自动化工具,旨在为现代Web应用程序提供可靠且一致的测试环境。Playwright支持多种编程语言,能够自动化ChromiumFirefoxWebKit等浏览器,使其成为跨浏览器测试的多功能工具。

4.1 为什么选择Playwright自动化

Playwright框架具备多项功能,使其在Web应用程序测试自动化中具有强大优势。以下是使Playwright与其他测试自动化框架不同的关键特性:

  • • 跨浏览器支持 Playwright框架最大的优势之一是其跨浏览器支持。它能够自动化Chromium(如Google ChromeMicrosoft Edge)、FirefoxWebKitSafari背后的引擎)。这种广泛的支持确保了您的Web应用程序在不同浏览器环境下进行测试,提供全面的测试覆盖,确保一致的用户体验。

  • • 多语言支持 Playwright支持多种编程语言。这种多语言支持使Playwright能够被更广泛的受众使用,允许不同语言偏好的团队利用其强大的功能。无论您是JavaScript爱好者还是Python开发者,Playwright都能提供有效的测试自动化工具。

  • • 无头模式 Playwright允许在无头模式下运行测试,意味着浏览器无需图形用户界面。这种模式对于持续集成和持续部署(CI/CD)流程尤其有益,效率和速度至关重要。无头测试可加快测试执行速度并节省资源,使其成为自动化测试环境的理想选择。

  • • 自动等待 测试自动化中的一个常见挑战是处理动态内容,并确保在执行操作之前元素已准备好。Playwright框架通过自动等待机制解决了这一挑战。Playwright智能地等待元素变得可操作后再进行交互,减少了对显式等待的需求,从而降低了测试的不稳定性。这一特性确保了您的测试更加可靠和易于维护。

  • • 强大的API Playwright提供了一个强大且全面的API,简化了复杂交互和场景的自动化。其API支持多种功能,包括处理框架和弹出窗口、模拟地理位置、操控网络条件等。Playwright框架的丰富API使得创建详细和准确的测试脚本变得更加简单,能够覆盖您Web应用程序的各个方面。

  • • 浏览器上下文 Playwright的浏览器上下文允许您在单个浏览器实例中创建隔离环境。每个浏览器上下文独立运行,能够同时模拟多个用户与应用程序的交互。这一特性非常适合测试涉及多个用户场景的情况,如并发登录和协作功能。浏览器上下文确保测试之间互不干扰,更准确地反映真实的使用情况。

5. 开始使用Playwright框架

要开始使用Playwright框架,请按照以下步骤操作:

5.1安装:

根据您偏好的编程语言使用npmpip安装Playwright

npm install playwright

或者对于Python:

pip install playwright

5.2 设置:

创建一个新的测试脚本并导入Playwright库。

const { chromium } = require('playwright');
(async () => {
    const browser = await chromium.launch();
    const context = await browser.newContext();
    const page = await context.newPage();
    await page.goto('https://example.com');
    console.log(await page.title());
    await browser.close();
})();

5.3 编写测试:

使用PlaywrightAPIWeb元素交互并验证应用程序的行为。

await page.click('text=Login');
await page.fill('input[name="username"]', 'user');
await page.fill('input[name="password"]', 'password');
await page.click('text=Submit');
const welcomeText = await page.textContent('.welcome-message');
console.assert(welcomeText === 'Welcome, user!');

6. Playwright框架的优势

Playwright框架提供了若干优势,使其在其他测试自动化框架中更具竞争力。以下是这些优势的详细说明:

6.1 统一API

Playwright框架最大的优势之一是其针对所有浏览器类型的统一API。这意味着您可以使用相同的命令和方法来自动化对Chromium浏览器的测试。这种一致性简化了测试过程,并降低了开发人员和测试人员的学习曲线。

6.2 跨浏览器和跨平台测试

Playwright框架在跨浏览器和跨平台测试方面表现出色。它支持所有主要浏览器和操作系统,确保您的Web应用程序的全面覆盖。这一能力对于验证您的应用程序在不同环境中的一致性至关重要。

6.3 网络拦截和监控

Playwright允许您拦截和监控网络请求和响应,这对于依赖API交互的应用程序测试尤其有用。此功能使高级测试场景成为可能,如模拟API响应、网络条件(如延迟和带宽限制)以及验证应用程序如何优雅地处理网络故障。

6.4 浏览器上下文

Playwright引入的浏览器上下文功能使您能够在单个浏览器实例中创建隔离的环境。每个上下文可以具有其cookie、存储和设置,允许您同时模拟多个用户与应用程序的交互。

6.5 设备仿真

Playwright支持设备仿真,使您能够测试应用程序在不同设备和屏幕尺寸上的表现。这确保了一致的用户体验,包括桌面、平板和移动设备。

6.6 自动等待和不稳定性减少

Playwright的自动等待机制确保仅在必要元素准备好时才执行操作。这显著减少了显式等待和重试的需求,提升了测试的可靠性和稳定性。

7. 使用Playwright框架的最佳实践

在利用Playwright框架进行测试自动化时,遵循最佳实践可以确保您的测试可维护、高效和可靠。以下是一些关键的最佳实践:

  • • 模块化测试 将测试脚本分解为更小的可重用模块和函数,以提高可维护性和可读性。

  • • 有效使用断言 断言对于验证应用程序在每一步的预期行为至关重要。

  • • 实现并行测试 并行运行测试显著减少测试执行时间,加快CI/CD管道中的反馈循环。

  • • 与持续集成(CI)集成 将Playwright测试集成到CI/CD管道中,确保应用程序的持续测试和验证。

  • • 有效管理测试数据 正确处理测试数据对于确保测试在一致且隔离的环境中运行至关重要。

  • • 使用浏览器上下文进行隔离 Playwright的浏览器上下文功能使您能够在单个浏览器实例中创建隔离环境,适用于多用户场景的测试。

结论

Playwright框架是一个强大的Web应用程序测试自动化工具。其跨浏览器支持、多语言能力和强大的API使其成为开发人员和测试人员的多功能选择。通过遵循最佳实践并将PlaywrightHeadSpin等平台集成,您可以增强测试自动化工作并确保应用程序的质量和可靠性。拥抱Playwright框架,让您的测试自动化提升到新的高度。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982027.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一周学会Flask3 Python Web开发-WTForms表单验证

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们可以通过WTForms表单类属性的validators属性来实现表单验证。 常用的WTForms验证器 验证器说明DataRequired(messageNo…

C 语 言 --- 猜 数 字 游 戏

C 语 言 --- 猜 数 字 游 戏 代 码 全 貌 与 功 能 介 绍游 戏 效 果 展 示游 戏 代 码 详 解头 文 件 引 入菜单函数游 戏 逻 辑 函 数 gamerand 函 数 详 解逻 辑 函 数 game 主 函 数 总结 &#x1f4bb;作 者 简 介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验…

深入探索C++17文件系统库:std::filesystem全面解析

前言 在C编程中&#xff0c;文件系统操作是许多应用程序的基础功能之一。无论是读写文件、创建目录&#xff0c;还是遍历文件系统&#xff0c;文件系统操作几乎无处不在。然而&#xff0c;在C17之前&#xff0c;标准库并没有提供一个统一、高效且易用的文件系统操作接口。开发…

C++学习之C++初识、C++对C语言增强、对C语言扩展

一.C初识 1.C简介 2.第一个C程序 //#include <iostream> //iostream 相当于 C语言下的 stdio.h i - input 输入 o -output 输出 //using namespace std; //using 使用 namespace 命名空间 std 标准 &#xff0c;理解为打开一个房间&#xff0c;房间里有我们所需…

transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3

目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…

【大模型基础_毛玉仁】1.3 基于Transformer 的语言模型

【大模型基础_毛玉仁】1.3 基于Transformer 的语言模型 1.3 基于Transformer 的语言模型1.3.1 Transformer1&#xff09;注意力层&#xff08;AttentionLayer&#xff09;2&#xff09;全连接前馈层&#xff08;Fully-connected Feedforwad Layer&#xff09;3&#xff09;层正…

Beeline的使用和Hive JDBC

目录 1. 引言1.1 Hadoop1.2 HBase1.3 Hive 2. Beeline2.1 使用Beeline访问Hive2.1.1 通过beeline直接连接Hive2.1.2 先进入beeline客户端再连接Hive2.1.3 先进入beeline客户端再连接MySQL 2.2 Beeline命令 3. Hive JDBC3.1 pom.xml中依赖配置3.2 Util工具类3.3 代码3.4 结果 参…

分布式多卡训练(DDP)踩坑

多卡训练最近在跑yolov10版本的RT-DETR&#xff0c;用来进行目标检测。 单卡训练语句&#xff08;正常运行&#xff09;&#xff1a; python main.py多卡训练语句&#xff1a; 需要通过torch.distributed.launch来启动&#xff0c;一般是单节点&#xff0c;其中CUDA_VISIBLE…

30秒从零搭建机器人管理系统(Trae)

1. 安装 [Trae官网】(https://www.trae.com.cn/) 2. 提示词 创建一个BS架构的机器人远程操控系统&#xff0c;具备机器人状态及位置实时更新&#xff0c;可以实现机器人远程遥控&#xff0c;可以对机器人工作日志进行统计分析&#xff0c;以及其它管理系统的常用功能3. 模型…

软考-数据库开发工程师-3.1-数据结构-线性结构

第3章内容比较多&#xff0c;内容考试分数占比较大&#xff0c;6分左右 线性表 1、线性表的定义 一个线性表是n个元素的有限序列(n≥0)&#xff0c;通常表示为(a1&#xff0c;a2, a3,…an). 2、线性表的顺序存储(顺序表) 是指用一组地址连续的存储单元依次存储线性表中的数据元…

解锁数据潜能,永洪科技以数据之力简化中粮可口可乐决策之路

企业数字化转型是指企业利用数字技术和信息通信技术来改变自身的商业模式、流程和增值服务&#xff0c;以提高企业的竞争力和创新能力。数字化转型已经成为企业发展的重要战略&#xff0c;尤其在当前信息技术高速发展的时代。数字化转型还涉及到企业与消费者之间的互动和沟通。…

Vue 3 整合 WangEditor 富文本编辑器:从基础到高级实践

本文将详细介绍如何在 Vue 3 项目中集成 WangEditor 富文本编辑器&#xff0c;实现图文混排、自定义扩展等高阶功能。 一、为什么选择 WangEditor&#xff1f; 作为国内流行的开源富文本编辑器&#xff0c;WangEditor 具有以下优势&#xff1a; 轻量高效&#xff1a;压缩后仅…

游戏引擎学习第137天

演示资产系统中的一个 bug 我们留下了个问题&#xff0c;你现在可以看到&#xff0c;移动时它没有选择正确的资产。我们知道问题的原因&#xff0c;就在之前我就预见到这个问题会出现。问题是我们的标签系统没有处理周期性边界的匹配问题。当处理像角度这种周期性的标签时&…

监听 RabbitMQ 延时交换机的消息数、OpenFeign 路径参数传入斜杠无法正确转义

背景 【MQ】一套为海量消息和高并发热点消息&#xff0c;提供高可用精准延时服务的解决方案 我现在有一个需求&#xff0c;就是监听 RabbitMQ 一个延时交换机的消息数&#xff0c;而 RabbitTemplate 是不存在对应的方法来获取的。 而我们在 RabbitMQ 的控制台却可以发现延时交…

大数据学习(56)-Impala

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

开发环境搭建-01.前端环境搭建

一.整体结构 Nginx目录必须放在没有中文的目录中才能正常运行&#xff01;&#xff01;&#xff01;

Redis 常见数据类型

官方文档 RedisCommands 1&#xff09;Redis 的命令有上百个&#xff0c;如果纯靠死记硬背比较困难&#xff0c;但是如果理解 Redis 的一些机制&#xff0c;会发现这些命令有很强的通用性。 2&#xff09;Redis 不是万金油&#xff0c;有些数据结构和命令必须在特定场景下使用…

Redis7——进阶篇(三)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

云原生时代的技术桥梁

在数字化转型的大潮中&#xff0c;企业面临着数据孤岛、应用间集成复杂、高成本与低效率等问题。这些问题不仅阻碍了企业内部信息的流通和资源的共享&#xff0c;也影响了企业对外部市场变化的响应速度。当前&#xff0c;这一转型过程从IT角度来看&#xff0c;已然迈入云原生时…

ICLR 2025|香港浸会大学可信机器学习和推理课题组专场

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; AITIME 01 ICLR 2025预讲会团队专场 AITIME 02 专场信息 01 Noisy Test-Time Adaptation in Vision-Language Models 讲者&#xff1a;曹晨涛&#xff0c;HKBU TMLR Group一年级博士生&#xff0c;目前关注基础…