Playwright-强大的自动化测试神器

2024-08-30 19:12

本文主要是介绍Playwright-强大的自动化测试神器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安装

Playwright是专门为满足端到端测试的需求创建的。Playwright支持目前所有的渲染引擎,包括:Chromium、WebKit和Firefox。在Windows、Linux和macOS上都可以使用。也可以在移动端浏览器进行测试。

pip安装

pip install palywright

测试示例

下面是一个简单的测试脚本示例。

import re
from playwright.sync_api import Page, expectdef test_has_title(page: Page):page.goto("https://playwright.dev/")# Expect a title "to contain" a substring.expect(page).to_have_title(re.compile("Playwright"))def test_get_started_link(page: Page):page.goto("https://playwright.dev/")# Click the get started link.page.get_by_role("link", name="Get started").click()# Expects page to have a heading with the name of Installation.expect(page.get_by_role("heading", name="Installation")).to_be_visible()

介绍

导航

打开被测URL

page.goto("https://playwright.dev/")

交互

执行交互操作,需要先定位元素。Playwright使用Locators API进行元素定位。

# 创建定位器
get_started = page.get_by_role("link", name="Get started")# 执行点击操作
get_started.click()

基本交互指令

下面为基本的交互指令,还有很多其他指令。

指令描述
locator.check()选中复选框
locator.click()单击元素
locator.uncheck()取消选中复选框
locator.hover()将鼠标悬浮在元素上
locator.fill()填写表单字段,输入文本
locator.focus()聚焦元素
locator.press()按单键
locator.set_input_files()选择要上传的文件
locator.select_option()在下拉菜单中选择选项

断言

下面示例为等待元素断言,将等待页面获得包含“Playwright”的标题。

import re
from playwright.sync_api import expectexpect(page).to_have_title(re.compile("Playwright"))

常用的断言方式:

断言描述
expect(locator).to_be_attached()元素已加载
expect(locator).to_be_checked()复选框已选中
expect(locator).to_be_disabled()元素已禁用
expect(locator).to_be_editable()元素是可编辑的
expect(locator).to_be_empty()容器为空
expect(locator).to_be_enabled()元素已启用
expect(locator).to_be_focused()元素被聚集
expect(locator).to_be_hidden()元素不可见
expect(locator).to_be_in_viewport()元素与视口相交
expect(locator).to_be_visible()元素可见
expect(locator).to_contain_text()元素包含文本
expect(locator).to_have_accessible_description()元素具有匹配的可访问描述
expect(locator).to_have_accessible_name()元素具有匹配的可访问名称
expect(locator).to_have_attribute()元素具有DOM属性
expect(locator).to_have_class()元素具有class属性
expect(locator).to_have_count()List具有精确的子项数量
expect(locator).to_have_css()元素具有css属性
expect(locator).to_have_id()元素有一个ID
expect(locator).to_have_js_property()元素有一个JavaScript属性
expect(locator).to_have_role()元素具有特定的ARIA角色
expect(locator).to_have_text()元素与文本匹配
expect(locator).to_have_value()输入有一个值
expect(locator).to_have_values()已选择选项
expect(page).to_have_title()页面有一个标题
expect(page).to_have_url()页面有一个url
expect(response).to_be_ok()响应的状态为ok

交互操作介绍

Playwright所有的交互操作都是支持异步操作的,与同步操作的区别就是在操作代码前面加awati,例如

# 同步操作
page.get_by_role("link", name="Get started").click()
# 异步操作
await page.get_by_role("link", name="Get started").click()
  • 同步模式:在同步模式下,代码按照从上到下的顺序执行。每个操作都会阻塞直到完成,然后再执行下一行代码。这意味着在等待某个操作(如页面加载)完成之前,程序不会继续往下执行。
  • 异步模式:异步模式利用Python的asyncio库(或其他编程语言的异步机制),允许非阻塞的并发操作。这意味着在等待某个耗时操作(如网络请求)的同时,程序可以继续执行其他任务。你需要使用await关键字来等待异步操作的结果。

文本输入

使用locator.fill()是填写表单字段的最简单方法。它聚焦元素并使用输入的文本触发输入事件。它适用于、和[contenteditable]元素。

# 文本输入
page.get_by_role("textbox").fill("Peter")# 日期输入
page.get_by_label("Birth date").fill("2020-02-02")# 时间输入
page.get_by_label("Appointment time").fill("13:15")# 本地时间输入
page.get_by_label("Local time").fill("2020-03-02T05:15")

复选框和单选按钮

使用locator.set_checked()是选中和取消选中复选框或单选按钮的最简单方法。此方法可以与input[type=checkbox]、input[type=radio]和[role=checkbox]element一起使用。

# 选中复选框
page.get_by_label('I agree to the terms above').check()# 确定选中状态
expect(page.get_by_label('Subscribe to newsletter')).to_be_checked()# 选中单选按钮
page.get_by_label('XL').check()

鼠标点击

# 单击
page.get_by_role("button").click()# 双击
page.get_by_text("Item").dblclick()# 右击
page.get_by_text("Item").click(button="right")# Shift + 点击
page.get_by_text("Item").click(modifiers=["Shift"])# 悬浮
page.get_by_text("Item").hover()# 坐标点击
page.get_by_text("Item").click(position={ "x": 0, "y": 0})# 强制点击 
page.get_by_role("button").click(force=True)

键盘操作

# 回车
page.get_by_text("Submit").press("Enter")# Ctrl + 方向键右
page.get_by_role("textbox").press("Control+ArrowRight")# 键盘$符键
page.get_by_role("textbox").press("$")

上传文件

使用locator.set_input_files()方法选择要上传的输入文件。第一个参数指向类型为“file”的输入元素。数组中可以传递多个文件。如果某些文件路径是相对的,则它们将相对于当前工作目录进行解析。空数组清除所选文件。

# 上传一个文件
page.get_by_label("Upload file").set_input_files('myfile.pdf')# 上传多个文件
page.get_by_label("Upload files").set_input_files(['file1.txt', 'file2.txt'])# 上传文件夹
page.get_by_label("Upload directory").set_input_files('mydir')# 删除所有选定文件
page.get_by_label("Upload file").set_input_files([])# 从内存上传缓冲区
page.get_by_label("Upload file").set_input_files(files=[{"name": "test.txt", "mimeType": "text/plain", "buffer": b"this is a test"}],
)

拖拽

使用locator.drag_to()执行拖放操作。此方法将:
将鼠标悬停在要拖动的元素上。
按下鼠标左键。
将鼠标移动到将接收拖放的元素上。
松开鼠标左键。

page.locator("#item-to-be-dragged").hover()
page.mouse.down()
page.locator("#item-to-drop-at").hover()
page.mouse.up()

滚动

Playwright在执行任何操作前都会自动滚动,因此不需要编写滚动代码。

# 如果按钮不可见,将自动滚动到可见后执行点击
page.get_by_role("button").click()

事件

介绍

Playwright允许监听网页上发生的各种类型的事件,如网络请求、创建子页面、专用工作人员等。订阅此类事件有几种方法,如等待事件或添加或删除事件监听器。

等待事件

大多数时候,脚本需要等待特定的事件发生。下面事一些典型的事件等待模式。

使用page.expect_request()等待具有指定url的请求:

with page.expect_request("**/*logo*.png") as first:page.goto("https://wikipedia.org")
print(first.value.url)

等待弹窗窗口:

with page.expect_popup() as popup:page.get_by_text("open the popup").click()
popup.value.goto("https://wikipedia.org")

添加/删除事件监听器

有时候事件发生在随机时间,而不是等待他们。Playwright支持添加和删除事件监听:

print_request_sent()和print_request_finished()为实现的监听方法。当page进行交互操作时,会对page进行监听。监听方法也可以传参。对于事件监听,是可以监听到前端页面的部分Ajax请求。

def print_request_sent(request):print("Request sent: " + request.url)def print_request_finished(request):print("Request finished: " + request.url)page.on("request", print_request_sent)
page.on("requestfinished", print_request_finished)
page.goto("https://wikipedia.org")page.remove_listener("requestfinished", print_request_finished)
page.goto("https://www.openstreetmap.org/")

一次性监听器

page.once("dialog", lambda dialog: dialog.accept("2021"))
page.evaluate("prompt('Enter a number:')")

对于所有的事件和监听器,都支持异步方法。事件前面加async,监听器前面加await就是异步方法。例如:

async with page.expect_request("**/*logo*.png") as first:await page.goto("https://wikipedia.org")
first_request = await first.value
print(first_request.url)def print_request_sent(request):print("Request sent: " + request.url)def print_request_finished(request):print("Request finished: " + request.url)page.on("request", print_request_sent)
page.on("requestfinished", print_request_finished)
await page.goto("https://wikipedia.org")page.remove_listener("requestfinished", print_request_finished)
await page.goto("https://www.openstreetmap.org/")

总结

Playwright是一个功能十分强大的框架,不仅可以进行UI自动化测试,还可以进行API测试和爬虫相关工作。

Playwright作为一个由微软开发的开源自动化测试工具,具有多个显著的优点,主要包括以下几个方面:

  1. 跨浏览器和跨平台支持
    • Playwright支持所有现代渲染引擎,包括Chromium、WebKit和Firefox,因此可以兼容包括Chrome、Firefox、Safari等在内的主流浏览器。
    • 它能在Windows、Linux和MacOS等多个操作系统上运行,提供广泛的平台支持。
  2. 多语言支持
    • Playwright提供了统一的API,并支持多种编程语言,如TypeScript、JavaScript、Python、.NET和Java等。这使得开发人员能够使用他们熟悉的语言来编写自动化测试脚本,方便集成到现有项目中。
  3. 性能和效率
    • Playwright专为速度和性能而设计,能够优化测试执行,实现更快、更高效的测试。
    • 它支持本机并行测试执行,可以在多个浏览器和平台上同时运行测试,显著减少测试执行时间。
  4. 内置功能丰富
    • Playwright具有内置的等待机制,可以自动等待页面加载、网络请求和元素可见性,减少了编写稳定测试时所需的手动等待时间。
    • 它还提供了截图和视频记录功能,这对于调试测试失败的情况非常有用。
    • 支持元素截图、模拟输入、拦截网络请求等多种高级功能。
  5. 易于使用和调试
    • Playwright提供了简洁、直观的API,使得编写可靠、可扩展的浏览器自动化脚本变得非常容易。
    • 它还提供了Playwright Inspector这样的GUI工具,可以帮助开发人员调试脚本,包括检查页面、生成选择器、逐步执行测试等。
  6. 代码生成和记录
    • Playwright支持通过记录浏览器操作来生成测试代码,并支持将测试结果保存为多种语言,这大大提高了编写测试脚本的效率。
  7. 测试隔离和稳定性
    • Playwright为每个测试创建一个独立的浏览器上下文,相当于一个全新的浏览器配置文件,提供了完全的测试隔离。
    • 它的自动等待和丰富的内置事件相结合,消除了人为超时的可能性,从而提高了测试的稳定性。
  8. 社区和生态
    • 尽管Playwright是一个相对较新的框架,但它已经获得了广泛的关注和使用,社区逐渐壮大。
    • 微软的支持也保证了Playwright的长期维护和更新,使其能够持续适应Web技术的发展。

更多的内容可以访问官网查看:Playwright

这篇关于Playwright-强大的自动化测试神器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121697

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

如何使用Ansible实现CI/CD流水线的自动化

如何使用Ansible实现CI/CD流水线的自动化 持续集成(CI)和持续交付(CD)是现代软件开发过程中的核心实践,它们帮助团队更快地交付高质量的软件。Ansible,作为一个强大的自动化工具,可以在CI/CD流水线中发挥关键作用。本文将详细介绍如何使用Ansible实现CI/CD流水线的自动化,包括设计流水线的结构、配置管理、自动化测试、部署、以及集成Ansible与CI/CD工具(如Jen

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

IntelliJ IDEA - 强大的编程工具

哪个编程工具让你的工作效率翻倍? 在日益繁忙的工作环境中,选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度,甚至让团队协作更加顺畅。那么,哪款编程工具让你的工作效率翻倍?是智能的代码编辑器,强大的版本控制工具,还是那些让你事半功倍的自动化脚本?在这里我推荐一款好用的编程工具:IntelliJ IDEA。 方向一:工具介绍 Int

BIRT 报表的自动化测试

来源:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-birttest/如何为 BIRT 报表编写自动化测试用例 BIRT 是一项很受欢迎的报表制作工具,但目前对其的测试还是以人工测试为主。本文介绍了如何对 BIRT 报表进行自动化测试,以及在实际项目中的一些测试实践,从而提高了测试的效率和准确性 -------

可测试,可维护,可移植:上位机软件分层设计的重要性

互联网中,软件工程师岗位会分前端工程师,后端工程师。这是由于互联网软件规模庞大,从业人员众多。前后端分别根据各自需求发展不一样的技术栈。那么上位机软件呢?它规模小,通常一个人就能开发一个项目。它还有必要分前后端吗? 有必要。本文从三个方面论述。分别是可测试,可维护,可移植。 可测试 软件黑盒测试更普遍,但很难覆盖所有应用场景。于是有了接口测试、模块化测试以及单元测试。都是通过降低测试对象