自动化测试工具playwright中文文档-------1.编写测试

目录

介绍

第一个测试

操作

导航

交互(Interactions)

基本操作

断言

测试隔离

使用夹具(Fixtures)


介绍

Playwright 测试非常简单,它们

  • 执行操作,
  • 并断言状态是否符合预期。

在执行任何操作之前,无需等待任何内容:Playwright 在执行每个操作之前会自动等待一系列可操作性检查通过。

此外,在执行检查时也不需要处理竞态条件------Playwright 的断言设计方式能够描述最终需要满足的期望。

就这样!这些设计选择允许 Playwright 用户完全忘记他们测试中的不稳定超时和竞态检查。

您将学习

  • 如何编写第一个测试
  • 如何执行操作
  • 如何使用断言
  • 测试如何在隔离环境中运行
  • 如何使用测试钩子

第一个测试

请查看以下示例,了解如何编写测试。请注意文件名如何遵循以 test_ 为前缀的约定,以及每个测试名称的命名方式。

复制代码
# test_example.py
import re  
from playwright.sync_api import Page, expect  
  
def test_has_title(page: Page):  
    page.goto("https://playwright.dev/")  
  
    # 期待标题"包含"一个子字符串。  
    expect(page).to_have_title(re.compile("Playwright"))  
  
def test_get_started_link(page: Page):  
    page.goto("https://playwright.dev/")  
  
    # 点击"开始使用"链接。  
    page.get_by_role("link", name="Get started").click()  
  
    # 期待页面有一个标题为"Installation"的标题。  
    expect(page.get_by_role("heading", name="Installation")).to_be_visible()

定义了两个测试函数,分别用于检查 Playwright 官网的标题和点击"开始使用"链接后的页面内容。

  1. test_has_title 函数通过 page.goto 方法导航到 Playwright 官网,并使用 expect(page).to_have_title 方法来检查页面标题是否包含"Playwright"这个子字符串。这里使用了正则表达式 re.compile("Playwright") 来匹配标题。

  2. test_get_started_link 函数同样先导航到 Playwright 官网,然后使用 page.get_by_role 方法找到"开始使用"链接(假设该链接的角色是"link"且其名称是"Get started"),并执行点击操作。之后,再次使用 page.get_by_role 方法找到标题为"Installation"的标题,并使用 expect(...).to_be_visible 方法来检查该标题是否可见。这验证了点击"开始使用"链接后,用户被正确地导航到了安装指南页面。

操作

导航

大多数测试将从将页面导航到URL开始。之后,测试将能够与页面元素进行交互。

复制代码
page.goto("https://playwright.dev/")

Playwright 将在继续之前等待页面达到加载状态。了解更多关于page.goto() 选项的信息。

交互(Interactions)

执行操作始于定位元素。Playwright 使用 Locators API来实现这一点。Locator 表示在任何时刻在页面上查找元素(或多个元素)的一种方式,了解更多关于可用的不同类型 Locator 的信息。Playwright 将在执行操作之前等待元素变为可操作状态actionable,因此无需等待它变为可用状态。

复制代码
# Create a locator.
get_started = page.get_by_role("link", name="Get started")

# Click it.
get_started.click()

在大多数情况下,这行代码会写成一行:

复制代码
page.get_by_role("link", name="Get started").click()

使用Playwright的API来定位页面上角色(role)为"link",且其名称(name)为"Get started"的链接元素,并对该元素执行点击(click)操作。

基本操作

这是Playwright中最常用的操作列表。请注意,还有更多其他操作,因此请确保查阅Locator API部分以了解更多信息。

操作 描述
locator.check() 选中复选框
locator.click() 点击元素
locator.uncheck() 取消选中复选框
locator.hover() 鼠标悬停在元素上
locator.fill() 填写表单字段,输入文本
locator.focus() 使元素获得焦点
locator.press() 按下单个键
locator.set_input_files() 选择文件以进行上传
locator.select_option() 在下拉列表中选择选项

断言

Playwright 包含了断言功能,它会等待直到满足预期的条件。使用这些断言可以使测试更加稳定且不易出错。例如,以下代码将等待直到页面标题包含 "Playwright":

复制代码
import re  
from playwright.sync_api import expect  
  
expect(page).to_have_title(re.compile("Playwright"))

以下是最常用的异步断言列表。请注意,还有更多其他断言需要熟悉:

断言 描述
expect(locator).to_be_checked() 复选框被选中
expect(locator).to_be_enabled() 控件被启用
expect(locator).to_be_visible() 元素可见
expect(locator).to_contain_text() 元素包含文本
expect(locator).to_have_attribute() 元素具有某个属性
expect(locator).to_have_count() 元素列表具有给定长度
expect(locator).to_have_text() 元素匹配文本
expect(locator).to_have_value() 输入元素具有值
expect(page).to_have_title() 页面具有标题
expect(page).to_have_url() 页面具有URL

测试隔离

Playwright的Pytest插件基于测试夹具(fixtures)的概念,如内置的页面夹具(page fixture),它会被传递到您的测试中。由于浏览器上下文(Browser Context)的存在,测试之间的页面是隔离的。浏览器上下文相当于一个新的浏览器配置文件,每个测试都会获得一个全新的环境,即使在单个浏览器中运行多个测试也是如此。

复制代码
test_example.py

from playwright.sync_api import Page

def test_example_test(page: Page):
  pass
  # "page" belongs to an isolated BrowserContext, created for this specific test.

def test_another_test(page: Page):
  pass
  # "page" in this second test is completely isolated from the first test.

使用夹具(Fixtures)

您可以使用各种夹具(fixtures)在测试之前或之后执行代码,并在它们之间共享对象。一个函数作用域的夹具(如使用autouse=True)表现得像beforeEach/afterEach。而一个模块作用域的夹具(也使用autouse=True)则表现得像beforeAll/afterAll,它在所有测试之前运行一次,在所有测试之后也运行一次。

复制代码
import pytest  
from playwright.sync_api import Page, expect  
  
# 定义一个函数作用域的夹具,它会自动应用于每个测试函数  
@pytest.fixture(scope="function", autouse=True)  
def before_each_after_each(page: Page):  
      
    print("测试运行之前")  
  
    # 在每个测试之前跳转到起始URL  
    page.goto("https://playwright.dev/")  
    yield  # yield 语句之后的代码会在测试函数执行完毕后执行  
      
    print("测试运行之后")  
  
def test_main_navigation(page: Page):  
    # 使用 expect API 进行断言  
    expect(page).to_have_url("https://playwright.dev/")
相关推荐
数据智能老司机4 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机5 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机5 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机5 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i5 小时前
drf初步梳理
python·django
每日AI新事件5 小时前
python的异步函数
python
这里有鱼汤7 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook16 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室16 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三18 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试