跳到主要内容

编写测试

简介

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()

# 期望页面有一个名为安装的标题。
expect(page.get_by_role("heading", name="Installation")).to_be_visible()

操作

导航

大多数测试都会以导航到某个 URL 开始。之后,测试就可以与页面元素进行交互。

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

Playwright 会在继续执行之前等待页面加载完成。了解更多关于 page.goto() 的选项。

交互

执行操作始于定位元素。Playwright 使用 Locators API 来实现这一点。定位器表示一种随时查找元素的方式,了解更多可用的不同类型的定位器

Playwright 会在执行操作前等待元素变为可操作的,因此无需等待元素变得可用。

# 创建一个定位器。
get_started = page.get_by_role("link", name="Get started")

# 点击它。
get_started.click()

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

page.get_by_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 插件基于测试夹具的概念,如内置的 page 夹具,它会被传递给你的测试。由于浏览器上下文的作用,页面在测试之间是隔离的,这相当于一个全新的浏览器配置文件,每个测试都会获得一个干净的环境,即使多个测试在一个浏览器中运行也是如此。

test_example.py
from playwright.sync_api import Page

def test_example_test(page: Page):
pass
# "page" 属于为此特定测试创建的隔离浏览器上下文。

def test_another_test(page: Page):
pass
# 这个第二个测试中的 "page" 与第一个测试完全隔离。

使用夹具

你可以使用各种夹具在测试之前或之后执行代码,并在它们之间共享对象。函数作用域的夹具如 autouse 行为类似于 beforeEach/afterEach。模块作用域的夹具与 autouse 行为类似于 beforeAll/afterAll,在所有测试之前和之后运行。

test_example.py
import pytest
from playwright.sync_api import Page, expect

@pytest.fixture(scope="function", autouse=True)
def before_each_after_each(page: Page):

print("测试运行之前")

# 在每个测试之前转到起始网址。
page.goto("https://playwright.dev/")
yield

print("测试运行之后")

def test_main_navigation(page: Page):
# 断言使用 expect API。
expect(page).to_have_url("https://playwright.dev/")

接下来是什么