diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ecb593832..eb06caff0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,7 +50,18 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] python-version: ['3.9', '3.10'] browser: [chromium, firefox, webkit] + exclude: + # WebKit on standard macOS-latest (currently macos-15-arm64) is unstable; + # upstream pins paid macos-15-xlarge for cross-browser webkit too. + - os: macos-latest + browser: webkit include: + - os: macos-15-xlarge + python-version: '3.9' + browser: webkit + - os: macos-15-xlarge + python-version: '3.10' + browser: webkit - os: windows-latest python-version: '3.11' browser: chromium @@ -160,7 +171,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-22.04, macos-13, windows-2022] + os: [ubuntu-22.04, macos-latest, windows-2022] runs-on: ${{ matrix.os }} defaults: run: diff --git a/tests/async/test_browser.py b/tests/async/test_browser.py index 84e9a4844..fc3f836a8 100644 --- a/tests/async/test_browser.py +++ b/tests/async/test_browser.py @@ -13,6 +13,7 @@ # limitations under the License. import re +from typing import Dict import pytest @@ -56,9 +57,9 @@ async def test_should_return_browser_type( async def test_bind_should_return_endpoint_and_allow_unbind( - browser_type: BrowserType, + browser_type: BrowserType, launch_arguments: Dict ) -> None: - browser = await browser_type.launch() + browser = await browser_type.launch(**launch_arguments) try: result = await browser.bind("test-server") assert "endpoint" in result diff --git a/tests/async/test_browsercontext_storage_state.py b/tests/async/test_browsercontext_storage_state.py index 17df45a0e..02fb0e2b0 100644 --- a/tests/async/test_browsercontext_storage_state.py +++ b/tests/async/test_browsercontext_storage_state.py @@ -15,6 +15,9 @@ import asyncio import json from pathlib import Path +from typing import Optional + +import pytest from playwright.async_api import Browser, BrowserContext, Page, StorageState from tests.server import Server @@ -134,8 +137,10 @@ async def test_should_round_trip_through_the_file( async def test_set_storage_state_should_apply_state_to_existing_context( - browser: Browser, + browser: Browser, browser_channel: Optional[str] ) -> None: + if browser_channel and browser_channel.startswith("msedge"): + pytest.skip("Network.clearBrowserCache sometimes stalls on msedge") src = await browser.new_context() src_page = await src.new_page() await src_page.route( diff --git a/tests/async/test_browsertype_connect_cdp.py b/tests/async/test_browsertype_connect_cdp.py index 251781546..dc66d3a07 100644 --- a/tests/async/test_browsertype_connect_cdp.py +++ b/tests/async/test_browsertype_connect_cdp.py @@ -96,7 +96,9 @@ async def test_connect_over_cdp_passing_header_works( request = asyncio.create_task(server.wait_for_request("/ws")) with pytest.raises(Error): await browser_type.connect_over_cdp( - f"ws://127.0.0.1:{server.PORT}/ws", headers={"foo": "bar"} + f"ws://127.0.0.1:{server.PORT}/ws", + headers={"foo": "bar"}, + timeout=5000, ) assert (await request).getHeader("foo") == "bar" diff --git a/tests/sync/test_browser.py b/tests/sync/test_browser.py index ded881c67..2551571da 100644 --- a/tests/sync/test_browser.py +++ b/tests/sync/test_browser.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import Dict + from playwright.sync_api import Browser, BrowserType @@ -19,3 +21,17 @@ def test_should_return_browser_type( browser: Browser, browser_type: BrowserType ) -> None: assert browser.browser_type is browser_type + + +def test_bind_should_return_endpoint_and_allow_unbind( + browser_type: BrowserType, launch_arguments: Dict +) -> None: + browser = browser_type.launch(**launch_arguments) + try: + result = browser.bind("test-server") + assert "endpoint" in result + assert isinstance(result["endpoint"], str) + assert len(result["endpoint"]) > 0 + browser.unbind() + finally: + browser.close()