跳至主要内容

发布说明

版本 1.51

亮点

  • browser_context.storage_state() 新增了 indexed_db 选项,允许保存和恢复 IndexedDB 内容。当您的应用程序使用 IndexedDB API 存储身份验证令牌(如 Firebase 身份验证)时非常有用。

    以下是遵循 authentication guide 的示例:

    # 将存储状态保存到文件中。确保包含 IndexedDB。
    storage = await context.storage_state(path="state.json", indexed_db=True)

    # 使用保存的存储状态创建新上下文。
    context = await browser.new_context(storage_state="state.json")
  • locator.filter() 的新选项 visible 允许仅匹配可见元素。

    # 忽略不可见的待办事项项
    todo_items = page.get_by_test_id("todo-item").filter(visible=True)
    # 检查正好有3个可见项
    await expect(todo_items).to_have_count(3)
  • 新增选项 contrast 用于方法 page.emulate_media()browser.new_context(),可以模拟 prefers-contrast 媒体特性。

  • 新增选项 fail_on_status_code 使得所有通过 APIRequestContext 发起的 fetch 请求在遇到非 2xx 和 3xx 响应状态码时抛出异常。

浏览器版本

  • Chromium 134.0.6998.35
  • Mozilla Firefox 135.0
  • WebKit 18.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 133
  • Microsoft Edge 133

版本 1.50

异步Pytest插件

其他

用户界面更新

  • Codegen 中新增按钮,用于选择元素以生成 aria 快照。
  • 在追踪记录中,现在会显示更多详细信息(例如按下的按键)与操作API调用一起展示。
  • 在追踪记录中显示canvas内容容易出错。现在默认禁用此显示功能,可以通过Display canvas content界面设置来启用。
  • CallNetwork 面板现在显示额外的时间信息。

重大变更

浏览器版本

  • Chromium 133.0.6943.16
  • Mozilla Firefox 134.0
  • WebKit 18.2

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 132
  • Microsoft Edge 132

版本 1.49

Aria 快照

新增断言 expect(locator).to_match_aria_snapshot() 通过对比预期的无障碍树(以YAML格式表示)来验证页面结构。

page.goto("https://playwright.dev")
expect(page.locator('body')).to_match_aria_snapshot('''
- banner:
- heading /Playwright enables reliable/ [level=1]
- link "Get started"
- link "Star microsoft/playwright on GitHub"
- main:
- img "Browsers (Chromium, Firefox, WebKit)"
- heading "Any browser • Any platform • One API"
''')

您可以通过Test Generator生成此断言,或者调用locator.aria_snapshot()来实现。

了解更多信息,请参阅aria快照指南

追踪分组

新方法 tracing.group() 允许您在跟踪查看器中直观地对操作进行分组。

# All actions between group and group_end
# will be shown in the trace viewer as a group.
page.context.tracing.group("Open Playwright.dev > API")
page.goto("https://playwright.dev/")
page.get_by_role("link", name="API").click()
page.context.tracing.group_end()

重大变更:chromemsedge 渠道切换至全新无头模式

如果您在playwright.config.ts中使用以下任一渠道,此更改将影响您:

  • chrome, chrome-dev, chrome-beta, 或 chrome-canary
  • msedge, msedge-dev, msedge-beta, 或 msedge-canary

升级到Playwright v1.49后,运行您的测试套件。如果测试仍然通过,说明一切正常。如果未通过,您可能需要更新快照,并调整一些关于PDF查看器和扩展的测试代码。详情请参阅issue #33566

尝试新的Chromium无头模式

您可以通过使用'chromium'渠道选择加入新的无头模式。正如官方Chrome文档所述

另一方面,New Headless是真正的Chrome浏览器,因此更真实、可靠,并提供更多功能。这使得它更适合高精度的端到端Web应用程序测试或浏览器扩展测试。

有关您可能遇到的潜在问题列表及Chromium无头模式的更多详情,请参阅issue #33566。如果在选择加入后遇到任何问题,请提交issue报告。

pytest test_login.py --browser-channel chromium

其他

  • Ubuntu 20.04和Debian 11上的WebKit将不再提供更新。我们建议您将操作系统升级到更高版本。
  • 元素在快照中现在会显示预览。
  • Python 3.8 已不再受支持。

浏览器版本

  • Chromium 131.0.6778.33
  • Mozilla Firefox 132.0
  • WebKit 18.2

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 130
  • Microsoft Edge 130

版本 1.48

WebSocket 路由

新增方法 page.route_web_socket()browser_context.route_web_socket() 允许拦截、修改和模拟页面中发起的WebSocket连接。以下是一个简单示例,通过用"response"响应"request"来模拟WebSocket通信。

def message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
if message == "request":
ws.send("response")

page.route_web_socket("/ws", lambda ws: ws.on_message(
lambda message: message_handler(ws, message)
))

更多详情请参见WebSocketRoute

用户界面更新

  • New "copy" buttons for annotations and test location in the HTML report.
  • 路由方法调用如route.fulfill()不再显示在报告和跟踪查看器中。您可以在网络选项卡中查看哪些网络请求被路由。
  • 在网络选项卡中为请求新增"复制为cURL"和"复制为fetch"按钮。

其他

浏览器版本

  • Chromium 130.0.6723.19
  • Mozilla Firefox 130.0
  • WebKit 18.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 129
  • Microsoft Edge 129

版本 1.47

网络选项卡改进

跟踪查看器中的网络选项卡有几项不错的改进:

  • 按资产类型和URL进行筛选
  • 更好地显示查询字符串参数
  • 字体资源预览

Network tab now has filters

其他

  • 现在 mcr.microsoft.com/playwright/python:v1.47.0 提供基于 Ubuntu 24.04 Noble 的 Playwright 镜像。如需使用基于 22.04 jammy 的镜像,请改用 mcr.microsoft.com/playwright/python:v1.47.0-jammy
  • Playwright Docker镜像的:latest/:focal/:jammy标签将不再发布。建议固定使用特定版本以获得更好的稳定性和可复现性。
  • 现在可以通过将client_certificates.certclient_certificates.key作为字节传递而非文件路径,从内存中传递TLS客户端证书。
  • no_wait_afterlocator.select_option() 中已被弃用。
  • 我们收到关于Webkit中WebGL在GitHub Actions macos-13上运行异常的反馈。建议将GitHub Actions升级至macos-14

浏览器版本

  • Chromium 129.0.6668.29
  • Mozilla Firefox 130.0
  • WebKit 18.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 128
  • Microsoft Edge 128

版本 1.46

TLS客户端证书

Playwright 现在支持提供客户端证书,以便服务器能够按照 TLS 客户端认证规范进行验证。

您可以将客户端证书作为browser.new_context()api_request.new_context()的参数提供。以下代码片段为https://example.com设置了客户端证书:

context = browser.new_context(
client_certificates=[
{
"origin": "https://example.com",
"certPath": "client-certificates/cert.pem",
"keyPath": "client-certificates/key.pem",
}
],
)

追踪查看器更新

  • 文本附件的内容现在会在附件面板中内联渲染。
  • 新增设置项,用于显示/隐藏路由操作,例如route.continue_()
  • 请求方法和状态显示在网络详情选项卡中。
  • 新增按钮,可将源文件位置复制到剪贴板。
  • 元数据面板现在显示base_url

其他

浏览器版本

  • Chromium 128.0.6613.18
  • Mozilla Firefox 128.0
  • WebKit 18.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 127
  • Microsoft Edge 127

版本 1.45

时钟

利用新的Clock API可以在测试中操纵和控制时间,以验证与时间相关的行为。该API涵盖了许多常见场景,包括:

  • 使用预定义时间进行测试;
  • 保持时间与计时器的一致性;
  • 监控不活动状态;
  • 手动逐步推进时间。
# Initialize clock with some time before the test time and let the page load
# naturally. `Date.now` will progress as the timers fire.
page.clock.install(time=datetime.datetime(2024, 2, 2, 8, 0, 0))
page.goto("http://localhost:3333")

# Pretend that the user closed the laptop lid and opened it again at 10am.
# Pause the time once reached that point.
page.clock.pause_at(datetime.datetime(2024, 2, 2, 10, 0, 0))

# Assert the page state.
expect(page.get_by_test_id("current-time")).to_have_text("2/2/2024, 10:00:00 AM")

# Close the laptop lid again and open it at 10:30am.
page.clock.fast_forward("30:00")
expect(page.get_by_test_id("current-time")).to_have_text("2/2/2024, 10:30:00 AM")

更多详情请参阅时钟指南

其他

  • 方法 locator.set_input_files() 现在支持为 元素上传目录。

    page.get_by_label("Upload directory").set_input_files('mydir')
  • 多种方法如locator.click()locator.press()现在支持ControlOrMeta修饰键。该键在macOS上映射为Meta,在Windows和Linux上映射为Control

    # 按下常见的键盘快捷键Control+S或Meta+S来触发"保存"操作。
    page.keyboard.press("ControlOrMeta+S")
  • 新增属性 httpCredentials.sendapi_request.new_context() 中,允许始终发送 Authorization 头信息,或仅在响应 401 Unauthorized 时发送。

  • Playwright 现在支持 Ubuntu 24.04 上的 Chromium、Firefox 和 WebKit。

  • v1.45 是最后一个支持 macOS 12 Monterey 系统 WebKit 更新的版本。请升级 macOS 系统以继续使用最新的 WebKit。

浏览器版本

  • Chromium 127.0.6533.5
  • Mozilla Firefox 127.0
  • WebKit 17.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 126
  • Microsoft Edge 126

版本 1.44

新API

无障碍访问断言

定位器处理器

locator = page.get_by_text("This interstitial covers the button")
page.add_locator_handler(locator, lambda overlay: overlay.locator("#close").click(), times=3, no_wait_after=True)
# Run your tests that can be interrupted by the overlay.
# ...
page.remove_locator_handler(locator)

其他选项

浏览器版本

  • Chromium 125.0.6422.14
  • Mozilla Firefox 125.0.1
  • WebKit 17.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 124
  • Microsoft Edge 124

版本 1.43

新API

  • 方法 browser_context.clear_cookies() 现在支持过滤器,可以只删除部分cookie。

    # 清除所有cookie
    context.clear_cookies()
    # 新功能:清除特定名称的cookie
    context.clear_cookies(name="session-id")
    # 新功能:清除特定域名的cookie
    context.clear_cookies(domain="my-origin.com")
  • 新增方法 locator.content_frame 可将 Locator 对象转换为 FrameLocator。当您从某处获取到 Locator 对象后,若后续需要与该框架内的内容进行交互,此方法会非常有用。

    locator = page.locator("iframe[name='embedded']")
    # ...
    frame_locator = locator.content_frame
    frame_locator.getByRole("button").click()
  • 新增方法 frame_locator.owner 可将 FrameLocator 对象转换为 Locator。当您从某处获取了 FrameLocator 对象,之后又想与 iframe 元素交互时,这会很有用。

    frame_locator = page.frame_locator("iframe[name='embedded']")
    # ...
    locator = frame_locator.owner
    expect(locator).to_be_visible()
  • 现在已发布适用于macOS-arm64和Linux-arm64的Conda构建版本。

浏览器版本

  • Chromium 124.0.6367.8
  • Mozilla Firefox 124.0
  • WebKit 17.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 123
  • Microsoft Edge 123

版本 1.42

新定位器处理器

新增方法 page.add_locator_handler() 用于注册一个回调函数,当指定元素可见并可能阻断Playwright操作时触发。该回调函数可用于消除覆盖层。以下示例展示了如何在出现cookie对话框时关闭它。

# Setup the handler.
page.add_locator_handler(
page.get_by_role("heading", name="Hej! You are in control of your cookies."),
lambda: page.get_by_role("button", name="Accept all").click(),
)
# Write the test as usual.
page.goto("https://www.ikea.com/")
page.get_by_role("link", name="Collection of blue and white").click()
expect(page.get_by_role("heading", name="Light and easy")).to_be_visible()

新API

公告

  • ⚠️ 不再支持Ubuntu 18系统。

浏览器版本

  • Chromium 123.0.6312.4
  • Mozilla Firefox 123.0
  • WebKit 17.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 122
  • Microsoft Edge 123

版本 1.41

新API

浏览器版本

  • Chromium 121.0.6167.57
  • Mozilla Firefox 121.0
  • WebKit 17.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 120
  • Microsoft Edge 120

版本 1.40

测试生成器更新

Playwright Test Generator

生成断言的新工具:

这是一个带有断言的生成测试示例:

from playwright.sync_api import Page, expect

def test_example(page: Page) -> None:
page.goto("https://playwright.dev/")
page.get_by_role("link", name="Get started").click()
expect(page.get_by_label("Breadcrumbs").get_by_role("list")).to_contain_text("Installation")
expect(page.get_by_label("Search")).to_be_visible()
page.get_by_label("Search").click()
page.get_by_placeholder("Search docs").fill("locator")
expect(page.get_by_placeholder("Search docs")).to_have_value("locator");

新API

其他变更

浏览器版本

  • Chromium 120.0.6099.28
  • Mozilla Firefox 119.0
  • WebKit 17.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 119
  • Microsoft Edge 119

版本 1.39

常青浏览器更新。

浏览器版本

  • Chromium 119.0.6045.9
  • Mozilla Firefox 118.0.1
  • WebKit 17.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 118
  • Microsoft Edge 118

版本 1.38

追踪查看器更新

Playwright Trace Viewer

  1. 放大时间范围。
  2. 网络面板重新设计。

新API

弃用项

浏览器版本

  • Chromium 117.0.5938.62
  • Mozilla Firefox 117.0
  • WebKit 17.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 116
  • Microsoft Edge 116

版本 1.37

亮点

📚 Debian 12 Bookworm 支持

Playwright 现在支持在 x86_64 和 arm64 架构的 Debian 12 Bookworm 上运行 Chromium、Firefox 和 WebKit。如果您遇到任何问题,请告诉我们!

Linux支持看起来是这样的:

Ubuntu 20.04Ubuntu 22.04Debian 11Debian 12
Chromium
WebKit
Firefox

浏览器版本

  • Chromium 116.0.5845.82
  • Mozilla Firefox 115.0
  • WebKit 17.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 115
  • Microsoft Edge 115

版本 1.36

🏝️ 夏季维护版本发布。

浏览器版本

  • Chromium 115.0.5790.75
  • Mozilla Firefox 115.0
  • WebKit 17.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 114
  • Microsoft Edge 114

版本 1.35

亮点

  • 新增选项 mask_color 用于方法 page.screenshot()locator.screenshot() 以更改默认的遮罩颜色。

  • 新增 uninstall CLI 命令用于卸载浏览器二进制文件:

    $ playwright uninstall # 移除当前安装所安装的浏览器
    $ playwright uninstall --all # 移除所有曾经安装过的Playwright浏览器

浏览器版本

  • Chromium 115.0.5790.13
  • Mozilla Firefox 113.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 114
  • Microsoft Edge 114

版本 1.34

亮点

浏览器版本

  • Chromium 114.0.5735.26
  • Mozilla Firefox 113.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 113
  • Microsoft Edge 113

版本 1.33

定位器更新

  • Use locator.or_() to create a locator that matches either of the two locators. Consider a scenario where you'd like to click on a "New email" button, but sometimes a security settings dialog shows up instead. In this case, you can wait for either a "New email" button, or a dialog and act accordingly:

    new_email = page.get_by_role("button", name="New email")
    dialog = page.get_by_text("Confirm security settings")
    expect(new_email.or_(dialog)).is_visible()
    if (dialog.is_visible()):
    page.get_by_role("button", name="Dismiss").click()
    new_email.click()
  • locator.filter()中使用新选项has_nothas_not_text来查找不匹配特定条件的元素。

    row_locator = page.locator("tr")
    row_locator.filter(has_not_text="text in column 1").filter(
    has_not=page.get_by_role("button", name="column 2 button")
    ).screenshot()
  • 使用新的网页优先断言 expect(locator).to_be_attached() 来确保元素存在于页面的DOM中。不要与 expect(locator).to_be_visible() 混淆,后者确保元素既存在于DOM中又可见。

新API

⚠️ 重大变更

  • 现在 mcr.microsoft.com/playwright/python:v1.33.0 提供基于 Ubuntu Jammy 的 Playwright 镜像。如需使用基于 focal 的镜像,请改用 mcr.microsoft.com/playwright/python:v1.33.0-focal

浏览器版本

  • Chromium 113.0.5672.53
  • Mozilla Firefox 112.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 112
  • Microsoft Edge 112

版本 1.32

新API

浏览器版本

  • Chromium 112.0.5615.29
  • Mozilla Firefox 111.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 111
  • Microsoft Edge 111

版本 1.31

新API

  • New assertion expect(locator).to_be_in_viewport() ensures that locator points to an element that intersects viewport, according to the intersection observer API.

    from playwright.sync_api import expect

    locator = page.get_by_role("button")

    # Make sure at least some part of element intersects viewport.
    expect(locator).to_be_in_viewport()

    # Make sure element is fully outside of viewport.
    expect(locator).not_to_be_in_viewport()

    # Make sure that at least half of the element intersects viewport.
    expect(locator).to_be_in_viewport(ratio=0.5)

其他

  • 跟踪查看器中的DOM快照现在可以在单独的窗口中打开。
  • 为方法route.fetch()新增max_redirects选项。
  • Playwright 现在支持 Debian 11 arm64 架构。
  • 官方 docker 镜像 现在包含 Node 18 而非 Node 16。

浏览器版本

  • Chromium 111.0.5563.19
  • Mozilla Firefox 109.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 110
  • Microsoft Edge 110

版本 1.30

浏览器版本

  • Chromium 110.0.5481.38
  • Mozilla Firefox 108.0.2
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 109
  • Microsoft Edge 109

版本 1.29

新API

  • New method route.fetch() and new option json for route.fulfill():

    def handle_route(route: Route):
    # Fetch original settings.
    response = route.fetch()

    # Force settings theme to a predefined value.
    json = response.json()
    json["theme"] = "Solorized"

    # Fulfill with modified data.
    route.fulfill(json=json)


    page.route("**/api/settings", handle_route)
  • 新增方法 locator.all() 用于遍历所有匹配的元素:

    # 勾选所有复选框!
    checkboxes = page.get_by_role("checkbox")
    for checkbox in checkboxes.all():
    checkbox.check()
  • locator.select_option() matches now by value or label:

    <select multiple>
    <option value="red">Red</option>
    <option value="green">Green</option>
    <option value="blue">Blue</option>
    </select>
    element.select_option("Red")

其他

浏览器版本

  • Chromium 109.0.5414.46
  • Mozilla Firefox 107.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 108
  • Microsoft Edge 108

版本 1.28

Playwright 工具

  • 代码生成中的实时定位器。 使用"探索"工具为页面上的任何元素生成定位器。

Locator Explorer

新API

浏览器版本

  • Chromium 108.0.5359.29
  • Mozilla Firefox 106.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 107
  • Microsoft Edge 107

版本 1.27

定位器

使用这些新的API编写定位器是一种乐趣:

page.get_by_label("User Name").fill("John")

page.get_by_label("Password").fill("secret-password")

page.get_by_role("button", name="Sign in").click()

expect(page.get_by_text("Welcome, John!")).to_be_visible()

所有相同的方法也可在 LocatorFrameLocatorFrame 类上使用。

其他亮点

  • 正如在v1.25版本中所宣布的,Ubuntu 18将从2022年12月起不再受支持。除此之外,从下一个Playwright版本开始,Ubuntu 18上将不再有WebKit更新。

行为变更

  • expect(locator).to_have_attribute() 带有空值不再匹配缺失属性。例如,当button 没有 disabled属性时,以下代码片段会成功。

    expect(page.get_by_role("button")).to_have_attribute("disabled", "")

浏览器版本

  • Chromium 107.0.5304.18
  • Mozilla Firefox 105.0.1
  • WebKit 16.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 106
  • Microsoft Edge 106

版本 1.26

断言

其他亮点

  • 新增选项 max_redirects 用于 api_request_context.get() 等方法以限制重定向次数。
  • 现在支持 Python 3.11。

行为变更

许多Playwright API已经支持wait_until: "domcontentloaded"选项。例如:

page.goto("https://playwright.dev", wait_until="domcontentloaded")

在1.26版本之前,这将等待所有iframe触发DOMContentLoaded事件。

为了与网页规范保持一致,'domcontentloaded'值仅等待目标框架触发'DOMContentLoaded'事件。如果要等待所有iframe加载完成,请使用wait_until="load"

浏览器版本

  • Chromium 106.0.5249.30
  • Mozilla Firefox 104.0
  • WebKit 16.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 105
  • Microsoft Edge 105

版本 1.25

公告

  • 🎁 我们现在提供Ubuntu 22.04 Jammy Jellyfish的docker镜像:mcr.microsoft.com/playwright/python:v1.34.0-jammy
  • 🪦 这是最后一个支持 macOS 10.15 的版本(自 1.21 起已弃用)。
  • ⚠️ Ubuntu 18现已弃用,自2022年12月起将不再受支持。

浏览器版本

  • Chromium 105.0.5195.19
  • Mozilla Firefox 103.0
  • WebKit 16.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 104
  • Microsoft Edge 104

版本1.24

🐂 Debian 11 Bullseye 支持

Playwright 现在支持在x86_64架构的Debian 11 Bullseye系统上运行Chromium、Firefox和WebKit。如果您遇到任何问题,请告诉我们!

Linux支持看起来是这样的:

| | Ubuntu 20.04 | Ubuntu 22.04 | Debian 11 | :--- | :---: | :---: | :---: | :---: | | Chromium | ✅ | ✅ | ✅ | | WebKit | ✅ | ✅ | ✅ | | Firefox | ✅ | ✅ | ✅ |

新介绍文档

我们重写了入门文档,使其更专注于端到端测试。请在playwright.dev上查看。

版本 1.23

网络回放

现在您可以将网络流量记录到HAR文件中,并在测试中重复使用这些流量。

要将网络记录到HAR文件中:

npx playwright open --save-har=github.har.zip https://github.com/microsoft

或者,您也可以通过编程方式记录HAR:

context = browser.new_context(record_har_path="github.har.zip")
# ... do stuff ...
context.close()

使用新方法 page.route_from_har()browser_context.route_from_har()HAR 文件中提供匹配的响应:

context.route_from_har("github.har.zip")

了解更多信息,请参阅我们的文档

高级路由

您现在可以使用route.fallback()将路由延迟到其他处理程序。

考虑以下示例:

# Remove a header from all requests
def remove_header_handler(route: Route) -> None:
headers = route.request.all_headers()
if "if-none-match" in headers:
del headers["if-none-match"]
route.fallback(headers=headers)

page.route("**/*", remove_header_handler)

# Abort all images
def abort_images_handler(route: Route) -> None:
if route.request.resource_type == "image":
route.abort()
else:
route.fallback()

page.route("**/*", abort_images_handler)

请注意,新方法page.route_from_har()browser_context.route_from_har()也会参与路由,并可能被延迟处理。

Web优先断言更新

其他

  • 如果有服务工作者(service worker)阻碍了你的操作,现在你可以通过新的上下文选项 service_workers 轻松禁用它:

    context = browser.new_context(service_workers="block")
    page = context.new_page()
  • recordHar上下文选项中使用.zip路径会自动压缩生成的HAR文件:

    context = browser.new_context(record_har_path="github.har.zip")
  • 如果您打算手动编辑HAR文件,请考虑使用"minimal" HAR记录模式,该模式仅记录回放所必需的信息:

    context = browser.new_context(record_har_mode="minimal", record_har_path="har.har")
  • Playwright 现在支持在 Ubuntu 22 amd64 和 Ubuntu 22 arm64 上运行。

版本 1.22

亮点

  • 角色选择器,允许通过元素的ARIA角色ARIA属性可访问名称来选择元素。

    # 点击一个可访问名称为"log in"的按钮
    page.locator("role=button[name='log in']").click()

    更多信息请参阅我们的文档

  • 新增 locator.filter() API 用于过滤现有定位器

    buttons = page.locator("role=button")
    # ...
    submit_button = buttons.filter(has_text="Submit")
    submit_button.click()
  • Codegen 现在支持生成 Pytest 测试

    Graphics

版本 1.21

亮点

  • 新增角色选择器,允许通过元素的ARIA角色ARIA属性可访问名称来选择元素。

    # Click a button with accessible name "log in"
    page.locator("role=button[name='log in']").click()

    了解更多信息,请参阅我们的文档

  • page.screenshot() 中新增 scale 选项,用于生成较小尺寸的截图。

  • page.screenshot() 中新增 caret 选项用于控制文本插入光标。默认为 "hide"

行为变更

  • Docker镜像mcr.microsoft.com/playwright不再包含Python。请使用mcr.microsoft.com/playwright/python作为预装Python的Playwright就绪docker镜像。
  • Playwright 现在支持通过 locator.set_input_files() API 上传大文件(数百MB)。

浏览器版本

  • Chromium 101.0.4951.26
  • Mozilla Firefox 98.0.2
  • WebKit 15.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 100
  • Microsoft Edge 100

版本 1.20

亮点

公告

  • 我们现在提供了一个专门的Python Docker镜像mcr.microsoft.com/playwright/python。如果您使用Python,请切换到该镜像。这是最后一个在我们的JavaScript Docker镜像mcr.microsoft.com/playwright中包含Python的版本。
  • v1.20是最后一个支持macOS 10.15 Catalina系统WebKit更新的版本。请升级macOS系统以继续使用最新最强大的WebKit!

浏览器版本

  • Chromium 101.0.4921.0
  • Mozilla Firefox 97.0.1
  • WebKit 15.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 99
  • Microsoft Edge 99

版本 1.19

亮点

  • Locator 现在支持一个 has 选项,可以确保它内部包含另一个定位器:

    page.locator("article", has=page.locator(".highlight")).click()

    了解更多内容,请参阅定位器文档

  • 新增 locator.page

  • page.screenshot()locator.screenshot() 现在会自动隐藏闪烁的光标

  • Playwright Codegen 现在可以生成定位器和框架定位器

浏览器版本

  • Chromium 100.0.4863.0
  • Mozilla Firefox 96.0.1
  • WebKit 15.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 98
  • Microsoft Edge 98

版本 1.18

API测试

Playwright for Python 1.18 引入了全新的 API Testing 功能,允许您直接从Python向服务器发送请求!现在您可以:

  • 测试你的服务器API
  • 在测试中访问网页应用前准备服务器端状态
  • 在浏览器中运行某些操作后验证服务器端后置条件

要在Playwright的Page上代表其发起请求,请使用新的page.request API

# Do a GET request on behalf of page
res = page.request.get("http://example.com/foo.json")

了解更多信息,请参阅我们的文档

Web优先断言

Playwright for Python 1.18 引入了 Web-First Assertions

考虑以下示例:

from playwright.sync_api import Page, expect

def test_status_becomes_submitted(page: Page) -> None:
# ..
page.locator("#submit-button").click()
expect(page.locator(".status")).to_have_text("Submitted")

Playwright 将重新测试带有选择器 .status 的节点,直到获取的节点包含 "Submitted" 文本。它会不断重新获取节点并进行检查,直到满足条件或达到超时时间。您可以将此超时时间作为选项传递。

了解更多信息,请参阅我们的文档

定位器改进

  • locator.drag_to()

  • 现在每个定位器都可以选择性地根据其包含的文本进行过滤:

    page.locator("li", has_text="my item").locator("button").click()

    了解更多内容,请参阅定位器文档

新API与变更

浏览器版本

  • Chromium 99.0.4812.0
  • Mozilla Firefox 95.0
  • WebKit 15.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 97
  • Microsoft Edge 97

版本 1.17

框架定位器

Playwright 1.17 引入了frame locators - 用于定位页面上的iframe。框架定位器封装了足够逻辑来获取iframe并在该iframe中定位元素。框架定位器默认是严格的,会等待iframe出现,并可用于Web优先断言。

Graphics

框架定位器可以通过page.frame_locator()locator.frame_locator()方法创建。

locator = page.frame_locator("my-frame").locator("text=Submit")
locator.click()

了解更多信息,请访问我们的文档

追踪查看器更新

Playwright Trace Viewer 现已在线提供,访问地址为 https://trace.playwright.dev!只需拖放您的 trace.zip 文件即可检查其内容。

注意: 跟踪文件不会上传到任何地方;trace.playwright.dev是一个渐进式网络应用,它会在本地处理跟踪记录。

  • Playwright Test 现在默认包含源代码追踪(可通过tracing选项关闭此功能)
  • Trace Viewer 现在会显示测试名称
  • 新增跟踪元数据标签页,显示浏览器详细信息
  • 快照现在包含URL栏

image

HTML Report Update

  • HTML report now supports dynamic filtering
  • Report is now a single static HTML file that could be sent by e-mail or as a slack attachment.

image

Ubuntu ARM64 支持 + 更多

  • Playwright 现在支持 Ubuntu 20.04 ARM64。您现在可以在 Apple M1 和树莓派上的 Docker 中运行 Playwright 测试。

  • 您现在可以使用Playwright在Linux上安装Edge的稳定版本:

    npx playwright install msedge

新API

  • Tracing 现在支持 'title' 选项
  • 页面导航支持新的'commit'等待选项

版本 1.16

🎭 Playwright 库

locator.wait_for

等待定位器解析为具有给定状态的单个元素。默认为 state: 'visible'

在处理列表时特别方便:

order_sent = page.locator("#order-sent")
order_sent.wait_for()

了解更多关于locator.wait_for()的信息。

Docker对Arm64架构的支持

Playwright Docker镜像现已发布支持Arm64架构,因此可在Apple Silicon上使用。

了解更多关于Docker集成的信息。

🎭 Playwright Trace Viewer

  • 使用npx playwright show-trace运行追踪查看器,并将追踪文件拖放到追踪查看器PWA中
  • 更好地可视化标注操作目标

了解更多关于Trace Viewer的信息。

浏览器版本

  • Chromium 97.0.4666.0
  • Mozilla Firefox 93.0
  • WebKit 15.4

此版本的Playwright还针对以下稳定渠道进行了测试:

  • Google Chrome 94
  • Microsoft Edge 94

版本 1.15

🖱️ 鼠标滚轮

通过使用 mouse.wheel() 您现在可以垂直或水平滚动。

📜 新标题API

以前无法获取响应的多个标头值。现在这已成为可能,并且还提供了额外的辅助函数:

🌈 强制色彩模拟

现在可以通过在browser.new_context()中传递或调用page.emulate_media()来模拟forced-colors CSS媒体特性。

新API

浏览器版本

  • Chromium 96.0.4641.0
  • Mozilla Firefox 92.0
  • WebKit 15.0

版本 1.14

⚡️ 新增"严格"模式

选择器歧义是自动化测试中的常见问题。"strict"模式确保您的选择器指向单个元素,否则会抛出异常。

在您的操作调用中传入strict=true以选择启用。

# This will throw if you have more than one button!
page.click("button", strict=True)

📍 全新 定位器API

定位器(Locator)表示对页面上元素的一个视图。它包含了在任何给定时刻检索元素所需的足够逻辑。

LocatorElementHandle之间的区别在于,后者指向特定元素,而Locator则封装了如何检索该元素的逻辑。

此外,定位器默认情况下是"严格"的

locator = page.locator("button")
locator.click()

了解更多信息,请参阅文档

🧩 实验性 ReactVue 选择器引擎

React和Vue选择器允许通过组件名称和/或属性值来选择元素。其语法与属性选择器非常相似,并支持所有属性选择器运算符。

page.locator("_react=SubmitButton[enabled=true]").click()
page.locator("_vue=submit-button[enabled=true]").click()

了解更多信息,请参阅react选择器文档vue选择器文档

✨ 新增 nthvisible 选择器引擎

  • nth 选择器引擎等同于 :nth-match 伪类,但可以与其他选择器引擎组合使用。
  • visible 选择器引擎等同于 :visible 伪类,但可以与其他选择器引擎组合使用。
# select the first button among all buttons
button.click("button >> nth=0")
# or if you are using locators, you can use first, nth() and last
page.locator("button").first.click()

# click a visible button
button.click("button >> visible=true")

浏览器版本

  • Chromium 94.0.4595.0
  • Mozilla Firefox 91.0
  • WebKit 15.0

版本 1.13

Playwright

工具

  • Playwright Trace Viewer 现在可以显示参数、返回值以及 console.log() 调用。

全新与全面改进的指南

浏览器版本

  • Chromium 93.0.4576.0
  • Mozilla Firefox 90.0
  • WebKit 14.2

Playwright 新API接口

版本 1.12

🧟‍♂️ Playwright Trace Viewer 介绍

Playwright Trace Viewer 是一款新的GUI工具,用于在脚本运行后探索已录制的Playwright跟踪记录。Playwright跟踪记录可让您检查:

  • 每个Playwright操作前后的页面DOM
  • 每个Playwright操作前后的页面渲染
  • 脚本执行期间的浏览器网络

追踪记录是通过新的browser_context.tracing API实现的:

browser = chromium.launch()
context = browser.new_context()

# Start tracing before creating / navigating a page.
context.tracing.start(screenshots=True, snapshots=True)

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

# Stop tracing and export it into a zip archive.
context.tracing.stop(path = "trace.zip")

追踪记录稍后可以通过Playwright CLI进行检查:

playwright show-trace trace.zip

这将打开以下图形用户界面:

image

👉 了解更多内容,请参阅trace viewer文档

浏览器版本

  • Chromium 93.0.4530.0
  • Mozilla Firefox 89.0
  • WebKit 14.2

此版本的Playwright还针对以下稳定渠道进行了测试:

  • Google Chrome 91
  • Microsoft Edge 91

新API接口

版本 1.11

🎥 新视频:Playwright:面向现代网页的全新测试自动化框架幻灯片

  • 我们讨论过Playwright
  • 展示了幕后的工程技术工作
  • 使用新功能进行了现场演示 ✨
  • 特别感谢 applitools 主办这次活动并邀请我们!

浏览器版本

  • Chromium 92.0.4498.0
  • Mozilla Firefox 89.0b6
  • WebKit 14.2

新API

版本 1.10

捆绑的浏览器版本

  • Chromium 90.0.4430.0
  • Mozilla Firefox 87.0b10
  • WebKit 14.2

此版本的Playwright还针对以下稳定渠道进行了测试:

  • Google Chrome 89
  • Microsoft Edge 89

新API接口

版本 1.9

  • Playwright Inspector is a new GUI tool to author and debug your tests.
    • 逐行调试您的Playwright脚本,支持播放、暂停和单步执行。
    • 通过记录用户操作来编写新脚本。
    • 生成元素选择器 通过悬停在元素上来为您的脚本生成选择器。
    • 设置 PWDEBUG=1 环境变量来启动检查器
  • 暂停脚本执行在headed模式下使用page.pause()。暂停页面会启动Playwright Inspector进行调试。
  • 新增 has-text 伪类用于CSS选择器。:has-text("example")会匹配任何内部某处包含"example"的元素,可能是在子元素或后代元素中。查看更多示例
  • 页面对话框现在会在执行期间自动关闭,除非配置了dialog事件的监听器。了解更多
  • Playwright for Python 现已稳定发布,提供符合Python习惯的蛇形命名法API,并预置了Docker镜像以便在CI/CD中运行测试。

浏览器版本

  • Chromium 90.0.4421.0
  • Mozilla Firefox 86.0b10
  • WebKit 14.1

新API接口

版本 1.8

新API

浏览器版本

  • Chromium 90.0.4392.0
  • Mozilla Firefox 85.0b5
  • WebKit 14.1

版本 1.7

  • 新版Java SDK: Playwright for Java 现已达到与 JavaScriptPython.NET绑定 相同的功能水平。
  • 浏览器存储API: 新增便捷API用于保存和加载浏览器存储状态(cookies、本地存储),以简化带认证的自动化场景。
  • 新增CSS选择器: 我们听取了您对更灵活选择器的反馈,并重新设计了选择器实现。Playwright 1.7引入了新的CSS扩展,更多功能即将推出。
  • 新网站: 文档网站 playwright.dev 已更新,现在使用 Docusaurus 构建。
  • 支持Apple Silicon: Playwright的WebKit和Chromium浏览器二进制文件现已为Apple Silicon构建。

新API

浏览器版本

  • Chromium 89.0.4344.0
  • Mozilla Firefox 84.0b9
  • WebKit 14.1