omegafox/tests/async/test_headful.py
daijro 68216153f3 Add Playwright tests
Adds Playwright's async tests to ensure that functionality is not broken.
2024-11-03 06:14:39 -06:00

178 lines
6.2 KiB
Python

# Copyright (c) Microsoft Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from pathlib import Path
from typing import Dict
import pytest
from playwright.async_api import BrowserType
from tests.server import Server
async def test_should_have_default_url_when_launching_browser(
browser_type: BrowserType, launch_arguments: Dict, tmpdir: Path
) -> None:
browser_context = await browser_type.launch_persistent_context(
tmpdir, **{**launch_arguments, "headless": False}
)
urls = [page.url for page in browser_context.pages]
assert urls == ["about:blank"]
await browser_context.close()
async def test_should_close_browser_with_beforeunload_page(
browser_type: BrowserType, launch_arguments: Dict, server: Server, tmpdir: Path
) -> None:
browser_context = await browser_type.launch_persistent_context(
tmpdir, **{**launch_arguments, "headless": False}
)
page = await browser_context.new_page()
await page.goto(server.PREFIX + "/beforeunload.html")
# We have to interact with a page so that 'beforeunload' handlers
# fire.
await page.click("body")
await browser_context.close()
async def test_should_not_crash_when_creating_second_context(
browser_type: BrowserType, launch_arguments: Dict, server: Server
) -> None:
browser = await browser_type.launch(**{**launch_arguments, "headless": False})
browser_context = await browser.new_context()
await browser_context.new_page()
await browser_context.close()
browser_context = await browser.new_context()
await browser_context.new_page()
await browser_context.close()
await browser.close()
async def test_should_click_background_tab(
browser_type: BrowserType, launch_arguments: Dict, server: Server
) -> None:
browser = await browser_type.launch(**{**launch_arguments, "headless": False})
page = await browser.new_page()
await page.set_content(
f'<button>Hello</button><a target=_blank href="{server.EMPTY_PAGE}">empty.html</a>'
)
await page.click("a")
await page.click("button")
await browser.close()
async def test_should_close_browser_after_context_menu_was_triggered(
browser_type: BrowserType, launch_arguments: Dict, server: Server
) -> None:
browser = await browser_type.launch(**{**launch_arguments, "headless": False})
page = await browser.new_page()
await page.goto(server.PREFIX + "/grid.html")
await page.click("body", button="right")
await browser.close()
async def test_should_not_block_third_party_cookies(
browser_type: BrowserType,
launch_arguments: Dict,
server: Server,
is_chromium: bool,
is_firefox: bool,
) -> None:
browser = await browser_type.launch(**{**launch_arguments, "headless": False})
page = await browser.new_page()
await page.goto(server.EMPTY_PAGE)
await page.evaluate(
"""src => {
let fulfill;
const promise = new Promise(x => fulfill = x);
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.onload = fulfill;
iframe.src = src;
return promise;
}""",
server.CROSS_PROCESS_PREFIX + "/grid.html",
)
document_cookie = await page.frames[1].evaluate(
"""() => {
document.cookie = 'username=John Doe';
return document.cookie;
}"""
)
await page.wait_for_timeout(2000)
allows_third_party = is_firefox
assert document_cookie == ("username=John Doe" if allows_third_party else "")
cookies = await page.context.cookies(server.CROSS_PROCESS_PREFIX + "/grid.html")
if allows_third_party:
assert cookies == [
{
"domain": "127.0.0.1",
"expires": -1,
"httpOnly": False,
"name": "username",
"path": "/",
"sameSite": "Lax" if is_chromium else "None",
"secure": False,
"value": "John Doe",
}
]
else:
assert cookies == []
await browser.close()
async def test_should_not_override_viewport_size_when_passed_null(
browser_type: BrowserType, launch_arguments: Dict, server: Server
) -> None:
# Our WebKit embedder does not respect window features.
browser = await browser_type.launch(**{**launch_arguments, "headless": False})
context = await browser.new_context(no_viewport=True)
page = await context.new_page()
await page.goto(server.EMPTY_PAGE)
async with page.expect_popup() as popup_info:
await page.evaluate(
"""() => {
const win = window.open(window.location.href, 'Title', 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=600,height=300,top=0,left=0');
win.resizeTo(500, 450);
}"""
)
popup = await popup_info.value
await popup.wait_for_load_state()
await popup.wait_for_function(
"""() => window.outerWidth === 500 && window.outerHeight === 450"""
)
await context.close()
await browser.close()
async def test_page_bring_to_front_should_work(
browser_type: BrowserType, launch_arguments: Dict
) -> None:
browser = await browser_type.launch(**{**launch_arguments, "headless": False})
page1 = await browser.new_page()
await page1.set_content("Page1")
page2 = await browser.new_page()
await page2.set_content("Page2")
await page1.bring_to_front()
assert await page1.evaluate("document.visibilityState") == "visible"
assert await page2.evaluate("document.visibilityState") == "visible"
await page2.bring_to_front()
assert await page1.evaluate("document.visibilityState") == "visible"
assert await page2.evaluate("document.visibilityState") == "visible"
await browser.close()