Skip to content

Commit 11af6f5

Browse files
committed
Merge remote-tracking branch 'upstream/main' into feat/soft-assertions
# Conflicts: # playwright/_impl/_assertions.py
2 parents c0efed5 + 18810d8 commit 11af6f5

63 files changed

Lines changed: 6095 additions & 1432 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.azure-pipelines/publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ extends:
6060
targetPath: $(Build.ArtifactStagingDirectory)/esrp-build
6161
steps:
6262
- checkout: none
63-
- task: EsrpRelease@9
63+
- task: EsrpRelease@11
6464
inputs:
6565
connectedservicename: 'Playwright-ESRP-PME'
6666
usemanagedidentity: true

.github/workflows/ci.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
name: Lint
2222
runs-on: ubuntu-latest
2323
steps:
24-
- uses: actions/checkout@v5
24+
- uses: actions/checkout@v6
2525
- name: Set up Python
2626
uses: actions/setup-python@v6
2727
with:
@@ -91,7 +91,7 @@ jobs:
9191
browser: chromium
9292
runs-on: ${{ matrix.os }}
9393
steps:
94-
- uses: actions/checkout@v5
94+
- uses: actions/checkout@v6
9595
- name: Set up Python
9696
uses: actions/setup-python@v6
9797
with:
@@ -138,7 +138,7 @@ jobs:
138138
browser-channel: msedge
139139
runs-on: ${{ matrix.os }}
140140
steps:
141-
- uses: actions/checkout@v5
141+
- uses: actions/checkout@v6
142142
- name: Set up Python
143143
uses: actions/setup-python@v6
144144
with:
@@ -181,11 +181,11 @@ jobs:
181181
# where the default shell is pwsh and skips the activation hooks.
182182
shell: bash -el {0}
183183
steps:
184-
- uses: actions/checkout@v5
184+
- uses: actions/checkout@v6
185185
with:
186186
fetch-depth: 0
187187
- name: Get conda
188-
uses: conda-incubator/setup-miniconda@v3
188+
uses: conda-incubator/setup-miniconda@v4
189189
with:
190190
python-version: '3.12'
191191
channels: conda-forge
@@ -202,7 +202,7 @@ jobs:
202202
run:
203203
working-directory: examples/todomvc/
204204
steps:
205-
- uses: actions/checkout@v5
205+
- uses: actions/checkout@v6
206206
- name: Set up Python
207207
uses: actions/setup-python@v6
208208
with:

.github/workflows/publish.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ jobs:
2222
runs-on: ${{ matrix.os }}
2323
defaults:
2424
run:
25-
# Required for conda-incubator/setup-miniconda@v3
25+
# Required for conda-incubator/setup-miniconda@v4
2626
shell: bash -el {0}
2727
steps:
28-
- uses: actions/checkout@v5
28+
- uses: actions/checkout@v6
2929
with:
3030
fetch-depth: 0
3131
- name: Get conda
32-
uses: conda-incubator/setup-miniconda@v3
32+
uses: conda-incubator/setup-miniconda@v4
3333
with:
3434
python-version: '3.12'
3535
channels: conda-forge

.github/workflows/publish_docker.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ jobs:
1515
contents: read # This is required for actions/checkout to succeed
1616
environment: Docker
1717
steps:
18-
- uses: actions/checkout@v5
18+
- uses: actions/checkout@v6
1919
- name: Azure login
20-
uses: azure/login@v2
20+
uses: azure/login@v3
2121
with:
2222
client-id: ${{ secrets.AZURE_DOCKER_CLIENT_ID }}
2323
tenant-id: ${{ secrets.AZURE_DOCKER_TENANT_ID }}
@@ -29,7 +29,7 @@ jobs:
2929
with:
3030
python-version: "3.10"
3131
- name: Set up Docker QEMU for arm64 docker builds
32-
uses: docker/setup-qemu-action@v3
32+
uses: docker/setup-qemu-action@v4
3333
with:
3434
platforms: arm64
3535
- name: Install dependencies & browsers

.github/workflows/test_docker.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
- ubuntu-24.04
3131
- ubuntu-24.04-arm
3232
steps:
33-
- uses: actions/checkout@v5
33+
- uses: actions/checkout@v6
3434
- name: Set up Python
3535
uses: actions/setup-python@v6
3636
with:

CLAUDE.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,51 @@ This is the recurring high-stakes task. Use the dedicated skill:
4848

4949
It documents the full process: the upstream commit-range diff over `docs/src/api/`, how to classify each commit (PORT / MISMATCH / N/A), how to handle the `langs:` filter, the recurring failure modes, and the tests/sync-mirroring conventions.
5050

51+
## Working on PRs
52+
53+
- Never post comments, replies, or reviews on GitHub PRs/issues under my account without my explicit approval. Draft the proposed text and wait for me to approve before sending.
54+
5155
## House style
5256

5357
- Don't hand-edit generated files.
5458
- Don't add `# type: ignore` or modify `_generated.py` to silence pyright; fix the source of the mismatch.
5559
- New public methods on impl classes need a sync test mirror under `tests/sync/`.
5660
- Keep `expected_api_mismatch.txt` minimal — every entry needs a one-line rationale comment above it.
5761
- Prefer `locals_to_params(locals())` for forwarding optional kwargs to channel sends, matching the rest of the codebase.
62+
63+
## Commit Convention
64+
65+
Before committing, run `mypy playwright` and fix errors.
66+
67+
Semantic commit messages: `label(scope): description`
68+
69+
Labels: `fix`, `feat`, `chore`, `docs`, `test`, `devops`
70+
71+
```bash
72+
git checkout -b fix-12345
73+
# ... make changes ...
74+
git add <changed-files>
75+
git commit -m "$(cat <<'EOF'
76+
fix(asyncio): do not deadlock in atexit handler
77+
78+
Fixes: https://github.com/microsoft/playwright-python/issues/12345
79+
EOF
80+
)"
81+
git push origin fix-12345
82+
gh pr create --repo microsoft/playwright-python --head username:fix-12345 \
83+
--title "fix(asyncio): do not deadlock in atexit handler" \
84+
--body "$(cat <<'EOF'
85+
## Summary
86+
- <describe the change very! briefly>
87+
88+
Fixes https://github.com/microsoft/playwright-python/issues/12345
89+
EOF
90+
)"
91+
```
92+
93+
Never add Co-Authored-By agents in commit message.
94+
Never add "Generated with" in commit message.
95+
Never add test plan to PR description. Keep PR description short — a few bullet points at most.
96+
Branch naming for issue fixes: `fix-<issue-number>`
97+
98+
**Never `git push` without an explicit instruction to push.** Applies even when a PR is already open for the branch — additional commits are immediately visible to reviewers. Commit locally, report what was committed, and wait. Only push when the user's message contains "push", "upload", "create PR", "ship it", or equivalent.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ Playwright is a Python library to automate [Chromium](https://www.chromium.org/H
44

55
| | Linux | macOS | Windows |
66
| :--- | :---: | :---: | :---: |
7-
| Chromium <!-- GEN:chromium-version -->147.0.7727.15<!-- GEN:stop --> ||||
7+
| Chromium <!-- GEN:chromium-version -->148.0.7778.96<!-- GEN:stop --> ||||
88
| WebKit <!-- GEN:webkit-version -->26.4<!-- GEN:stop --> ||||
9-
| Firefox <!-- GEN:firefox-version -->148.0.2<!-- GEN:stop --> ||||
9+
| Firefox <!-- GEN:firefox-version -->150.0.2<!-- GEN:stop --> ||||
1010

1111
## Documentation
1212

local-requirements.txt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1+
asyncio-atexit==1.0.1
12
autobahn==23.1.2
23
black==25.1.0
34
build==1.3.0
4-
flake8==7.2.0
5+
flake8==7.3.0
56
mypy==1.17.1
67
objgraph==3.6.2
78
Pillow==11.3.0
89
pixelmatch==0.3.0
910
pre-commit==3.5.0
10-
pyOpenSSL==25.1.0
11+
pyOpenSSL==26.0.0
1112
pytest==8.4.1
1213
pytest-asyncio==1.1.0
13-
pytest-cov==6.3.0
14+
pytest-cov==7.1.0
1415
pytest-repeat==0.9.4
1516
pytest-rerunfailures==15.1
1617
pytest-timeout==2.4.0
@@ -19,4 +20,4 @@ requests==2.32.5
1920
service_identity==24.2.0
2021
twisted==25.5.0
2122
types-pyOpenSSL==24.1.0.20240722
22-
types-requests==2.32.4.20250809
23+
types-requests==2.32.4.20260107

playwright/_impl/_api_structures.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,16 +151,31 @@ class ViewportSize(TypedDict):
151151

152152
class SourceLocation(TypedDict):
153153
url: str
154+
line: int
155+
column: int
154156
lineNumber: int
155157
columnNumber: int
156158

157159

160+
class WebErrorLocation(TypedDict):
161+
url: str
162+
line: int
163+
column: int
164+
165+
158166
class FilePayload(TypedDict):
159167
name: str
160168
mimeType: str
161169
buffer: bytes
162170

163171

172+
class DropPayload(TypedDict, total=False):
173+
files: Optional[
174+
Union[str, Path, FilePayload, Sequence[Union[str, Path]], Sequence[FilePayload]]
175+
]
176+
data: Optional[Dict[str, str]]
177+
178+
164179
class RemoteAddr(TypedDict):
165180
ipAddress: str
166181
port: int
@@ -216,6 +231,7 @@ class FrameExpectOptions(TypedDict, total=False):
216231
useInnerText: Optional[bool]
217232
isNot: bool
218233
timeout: Optional[float]
234+
pseudo: Optional[str]
219235

220236

221237
class FrameExpectResult(TypedDict):
@@ -330,3 +346,5 @@ class DebuggerPausedDetails(TypedDict):
330346

331347
class ScreencastFrame(TypedDict):
332348
data: bytes
349+
viewportWidth: int
350+
viewportHeight: int

playwright/_impl/_assertions.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
import collections.abc
1616
from contextlib import contextmanager
17-
from typing import Any, Iterator, List, Optional, Pattern, Sequence, Union
17+
from typing import Any, Iterator, List, Literal, Optional, Pattern, Sequence, Union
1818
from urllib.parse import urljoin
1919

2020
from playwright._impl._api_structures import (
@@ -27,6 +27,7 @@
2727
from playwright._impl._errors import Error
2828
from playwright._impl._fetch import APIResponse
2929
from playwright._impl._helper import is_textual_mime_type
30+
from playwright._impl._js_handle import parse_value
3031
from playwright._impl._locator import Locator
3132
from playwright._impl._page import Page
3233
from playwright._impl._str_utils import escape_regex_flags
@@ -101,7 +102,14 @@ async def _expect_impl(
101102
del expect_options["useInnerText"]
102103
result = await self._call_expect(expression, expect_options, title)
103104
if result["matches"] == self._is_not:
104-
actual = result.get("received")
105+
received = result.get("received") or {}
106+
if isinstance(received, dict):
107+
if "value" in received and received["value"] is not None:
108+
actual = parse_value(received["value"])
109+
else:
110+
actual = received.get("ariaSnapshot")
111+
else:
112+
actual = received
105113
if self._custom_message:
106114
out_message = self._custom_message
107115
if expected is not None:
@@ -199,6 +207,24 @@ async def not_to_have_url(
199207
__tracebackhide__ = True
200208
await self._not.to_have_url(urlOrRegExp, timeout, ignoreCase)
201209

210+
async def to_match_aria_snapshot(
211+
self, expected: str, timeout: float = None
212+
) -> None:
213+
__tracebackhide__ = True
214+
await self._expect_impl(
215+
"to.match.aria",
216+
FrameExpectOptions(expectedValue=expected, timeout=timeout),
217+
expected,
218+
"Page expected to match Aria snapshot",
219+
'Expect "to_match_aria_snapshot"',
220+
)
221+
222+
async def not_to_match_aria_snapshot(
223+
self, expected: str, timeout: float = None
224+
) -> None:
225+
__tracebackhide__ = True
226+
await self._not.to_match_aria_snapshot(expected, timeout)
227+
202228

203229
class LocatorAssertions(AssertionsBase):
204230
def __init__(
@@ -443,13 +469,17 @@ async def to_have_css(
443469
name: str,
444470
value: Union[str, Pattern[str]],
445471
timeout: float = None,
472+
pseudo: Literal["after", "before"] = None,
446473
) -> None:
447474
__tracebackhide__ = True
448475
expected_text = to_expected_text_values([value])
449476
await self._expect_impl(
450477
"to.have.css",
451478
FrameExpectOptions(
452-
expressionArg=name, expectedText=expected_text, timeout=timeout
479+
expressionArg=name,
480+
expectedText=expected_text,
481+
timeout=timeout,
482+
pseudo=pseudo,
453483
),
454484
value,
455485
"Locator expected to have CSS",

0 commit comments

Comments
 (0)