def test_should_not_break_page_close(browser: Browser) -> None: context = browser.new_context() page = context.new_page() session = page.context.new_cdp_session(page) session.detach() page.close() context.close()
def test_should_round_trip_through_the_file(browser: Browser, context: BrowserContext, tmpdir: Path) -> None: page1 = context.new_page() page1.route( "**/*", lambda route: route.fulfill(body="<html></html>"), ) page1.goto("https://www.example.com") page1.evaluate("""() => { localStorage["name1"] = "value1" document.cookie = "username=John Doe" return document.cookie }""") path = tmpdir / "storage-state.json" state = context.storage_state(path=path) with open(path, "r") as f: written = json.load(f) assert state == written context2 = browser.new_context(storage_state=path) page2 = context2.new_page() page2.route( "**/*", lambda route: route.fulfill(body="<html></html>"), ) page2.goto("https://www.example.com") local_storage = page2.evaluate("window.localStorage") assert local_storage == {"name1": "value1"} cookie = page2.evaluate("document.cookie") assert cookie == "username=John Doe" context2.close()
def test_bounding_box_with_page_scale(browser: Browser, server: Server) -> None: context = browser.new_context( viewport={"width": 400, "height": 400}, is_mobile=True ) page = context.new_page() page.goto(server.PREFIX + "/input/button.html") button = page.query_selector("button") assert button button.evaluate( """button => { document.body.style.margin = '0' button.style.borderWidth = '0' button.style.width = '200px' button.style.height = '20px' button.style.marginLeft = '17px' button.style.marginTop = '23px' }""" ) box = button.bounding_box() assert box assert round(box["x"] * 100) == 17 * 100 assert round(box["y"] * 100) == 23 * 100 assert round(box["width"] * 100) == 200 * 100 assert round(box["height"] * 100) == 20 * 100 context.close()
def test_should_detach_when_page_closes(browser: Browser) -> None: context = browser.new_context() page = context.new_page() session = context.new_cdp_session(page) page.close() with pytest.raises(Error): session.detach() context.close()
def test_should_allow_service_workers_by_default( browser: Browser, server: Server ) -> None: context = browser.new_context() page = context.new_page() page.goto(server.PREFIX + "/serviceworkers/fetchdummy/sw.html") page.evaluate("() => window.activationPromise") context.close()
def test_browser_context_output_trace(browser: Browser, server: Server, tmp_path: Path) -> None: context = browser.new_context() context.tracing.start(screenshots=True, snapshots=True) page = context.new_page() page.goto(server.PREFIX + "/grid.html") context.tracing.stop(path=tmp_path / "trace.zip") assert Path(tmp_path / "trace.zip").exists()
def _context( browser: Browser, pytestconfig: t.Any, request: pytest.FixtureRequest, ) -> t.Generator[BrowserContext, None, None]: context = browser.new_context() yield context context.close()
def test_should_work(browser: Browser, server: Server, tmpdir: Path) -> None: path = os.path.join(tmpdir, "log.har") context = browser.new_context(record_har_path=path) page = context.new_page() page.goto(server.EMPTY_PAGE) context.close() with open(path) as f: data = json.load(f) assert "log" in data
def test_block_blocks_service_worker_registration( browser: Browser, server: Server ) -> None: context = browser.new_context(service_workers="block") page = context.new_page() with page.expect_console_message( lambda m: "Service Worker registration blocked by Playwright" == m.text ): page.goto(server.PREFIX + "/serviceworkers/fetchdummy/sw.html") context.close()
def context(browser: Browser, browser_context_args: Dict, browser_name, video_path, request) -> Generator[BrowserContext, None, None]: context = browser.new_context(**browser_context_args) current_failed_tests = request.session.testsfailed yield context current_video_name = context.current_video_name current_video_path = current_video_name updated_video_path = os.path.join( video_path, f"{request.node.originalname}_{browser_name}.mp4") context.close() os.rename(current_video_path, updated_video_path)
def _context( browser: Browser, pytestconfig: t.Any, request: pytest.FixtureRequest, ) -> t.Generator[BrowserContext, None, None]: pages: t.List[Page] = [] context = browser.new_context() context.on("page", lambda page: pages.append(page)) # pylint: disable=unnecessary-lambda yield context try: _may_create_screenshot(request, pytestconfig, pages) finally: context.close()
def test_should_omit_content(browser: Browser, server: Server, tmpdir: Path) -> None: path = os.path.join(tmpdir, "log.har") context = browser.new_context(record_har_path=path, record_har_omit_content=True) page = context.new_page() page.goto(server.PREFIX + "/har.html") context.close() with open(path) as f: data = json.load(f) assert "log" in data log = data["log"] content1 = log["entries"][0]["response"]["content"] assert "text" not in content1
def test_selectors_register_should_work(selectors: Selectors, browser: Browser, browser_name: str) -> None: tag_selector = """ { create(root, target) { return target.nodeName; }, query(root, selector) { return root.querySelector(selector); }, queryAll(root, selector) { return Array.from(root.querySelectorAll(selector)); } }""" selector_name = f"tag_{browser_name}" selector2_name = f"tag2_{browser_name}" # Register one engine before creating context. selectors.register(selector_name, tag_selector) context = browser.new_context() # Register another engine after creating context. selectors.register(selector2_name, tag_selector) page = context.new_page() page.set_content("<div><span></span></div><div></div>") assert page.eval_on_selector(f"{selector_name}=DIV", "e => e.nodeName") == "DIV" assert page.eval_on_selector(f"{selector_name}=SPAN", "e => e.nodeName") == "SPAN" assert page.eval_on_selector_all(f"{selector_name}=DIV", "es => es.length") == 2 assert page.eval_on_selector(f"{selector2_name}=DIV", "e => e.nodeName") == "DIV" assert page.eval_on_selector(f"{selector2_name}=SPAN", "e => e.nodeName") == "SPAN" assert page.eval_on_selector_all(f"{selector2_name}=DIV", "es => es.length") == 2 # Selector names are case-sensitive. with pytest.raises(Error) as exc: page.query_selector("tAG=DIV") assert 'Unknown engine "tAG" while parsing selector tAG=DIV' in exc.value.message context.close()
def test_browser_context_output_trace_chunk(browser: Browser, server: Server, tmp_path: Path) -> None: context = browser.new_context() context.tracing.start(screenshots=True, snapshots=True) page = context.new_page() page.goto(server.PREFIX + "/grid.html") button = page.locator(".box").first context.tracing.start_chunk(title="foo") button.click() context.tracing.stop_chunk(path=tmp_path / "trace1.zip") assert Path(tmp_path / "trace1.zip").exists() context.tracing.start_chunk(title="foo") button.click() context.tracing.stop_chunk(path=tmp_path / "trace2.zip") assert Path(tmp_path / "trace2.zip").exists()
def test_should_include_content(browser: Browser, server: Server, tmpdir: Path) -> None: path = os.path.join(tmpdir, "log.har") context = browser.new_context(record_har_path=path) page = context.new_page() page.goto(server.PREFIX + "/har.html") context.close() with open(path) as f: data = json.load(f) assert "log" in data log = data["log"] content1 = log["entries"][0]["response"]["content"] assert content1["encoding"] == "base64" assert content1["mimeType"] == "text/html" s = base64.b64decode(content1["text"]).decode() assert "HAR Page" in s
def test_should_set_local_storage(browser: Browser) -> None: context = browser.new_context( storage_state={ "origins": [{ "origin": "https://www.example.com", "localStorage": [{ "name": "name1", "value": "value1" }], }] }) page = context.new_page() page.route("**/*", lambda route: route.fulfill(body="<html></html>")) page.goto("https://www.example.com") local_storage = page.evaluate("window.localStorage") assert local_storage == {"name1": "value1"} context.close()
def context(browser: Browser) -> Generator[BrowserContext, None, None]: context = browser.new_context() yield context context.close()
def context( browser: Browser, browser_context_args: Dict) -> Generator[BrowserContext, None, None]: context = browser.new_context(**browser_context_args) yield context context.close()