chromium/third_party/blink/web_tests/external/wpt/webdriver/tests/interop/frames.py

import pytest
from webdriver.error import NoSuchWindowException

from tests.support.sync import AsyncPoll

pytestmark = pytest.mark.asyncio


async def test_classic_switch_to_parent_no_browsing_context(bidi_session, current_session, url):
    # With WebDriver classic it cannot be checked if the parent frame is already
    # gone before switching to it. To prevent race conditions such a check needs
    # to be done via WebDriver BiDi.
    current_session.url = url("/webdriver/tests/support/html/frames.html")

    subframe = current_session.find.css("#sub-frame", all=False)
    current_session.switch_frame(subframe)

    deleteframe = current_session.find.css("#delete-frame", all=False)
    current_session.switch_frame(deleteframe)

    button = current_session.find.css("#remove-top", all=False)
    button.click()

    async def is_frame_removed(_):
        contexts = await bidi_session.browsing_context.get_tree(root=current_session.window_handle)
        return not contexts[0]["children"]

    # Wait until IFrame is gone.
    wait = AsyncPoll(
        current_session,
        timeout=5,
        message="IFrame that should be closed is still open",
    )
    await wait.until(is_frame_removed)

    with pytest.raises(NoSuchWindowException):
        current_session.switch_frame("parent")