def test_connect_to_closed_server_without_hangs(browser_type: BrowserType, launch_server): remote_server = launch_server() remote_server.kill() with pytest.raises(Error) as exc: browser_type.connect(remote_server.ws_endpoint) assert "websocket.connect: " in exc.value.message
def test_connect_to_an_existing_cdp_session(launch_arguments: Dict, browser_type: BrowserType) -> None: port = find_free_port() browser_server = browser_type.launch(**launch_arguments, args=[ f"--remote-debugging-port={port}" ]) cdp_browser = browser_type.connect_over_cdp(f"http://localhost:{port}") assert len(cdp_browser.contexts) == 1 cdp_browser.close() browser_server.close()
def test_browser_type_connect_set_browser_connected_state( browser_type: BrowserType, launch_server): remote_server = launch_server() browser = browser_type.connect(remote_server.ws_endpoint) assert browser.is_connected() browser.close() assert browser.is_connected() is False
def test_browser_type_connect_disconnected_event_should_be_emitted_when_browser_is_closed_or_server_is_closed( browser_type: BrowserType, launch_server: Callable[[], RemoteServer] ) -> None: # Launch another server to not affect other tests. remote = launch_server() browser1 = browser_type.connect(remote.ws_endpoint) browser2 = browser_type.connect(remote.ws_endpoint) disconnected1 = [] disconnected2 = [] browser1.on("disconnected", lambda browser: disconnected1.append(True)) browser2.on("disconnected", lambda browser: disconnected2.append(True)) page2 = browser2.new_page() browser1.close() assert len(disconnected1) == 1 assert len(disconnected2) == 0 remote.kill() assert len(disconnected1) == 1 with pytest.raises(Error): # Tickle connection so that it gets a chance to dispatch disconnect event. page2.title() assert len(disconnected2) == 1
def test_browser_type_connect_should_be_able_to_reconnect_to_a_browser( server: Server, browser_type: BrowserType, launch_server): remote_server = launch_server() browser = browser_type.connect(remote_server.ws_endpoint) browser_context = browser.new_context() assert len(browser_context.pages) == 0 page = browser_context.new_page() assert len(browser_context.pages) == 1 assert page.evaluate("11 * 11") == 121 page.goto(server.EMPTY_PAGE) browser.close() browser = browser_type.connect(remote_server.ws_endpoint) browser_context = browser.new_context() page = browser_context.new_page() page.goto(server.EMPTY_PAGE) browser.close()
def test_browser_type_disconnected_event_should_have_browser_as_argument( browser_type: BrowserType, launch_server): remote_server = launch_server() browser = browser_type.connect(remote_server.ws_endpoint) event_payloads = [] browser.on("disconnected", lambda b: event_payloads.append(b)) browser.close() assert event_payloads[0] == browser
def test_browser_type_connect_set_browser_connected_state( browser_type: BrowserType, launch_server: Callable[[], RemoteServer] ) -> None: remote_server = launch_server() browser = browser_type.connect(remote_server.ws_endpoint) assert browser.is_connected() browser.close() assert browser.is_connected() is False
def test_context_managers(browser_type: BrowserType, launch_arguments): with browser_type.launch(**launch_arguments) as browser: with browser.new_context() as context: with context.new_page(): assert len(context.pages) == 1 assert len(context.pages) == 0 assert len(browser.contexts) == 1 assert len(browser.contexts) == 0 assert not browser.is_connected()
def test_browser_type_connect_should_be_able_to_connect_two_browsers_at_the_same_time( browser_type: BrowserType, launch_server): remote_server = launch_server() browser1 = browser_type.connect(remote_server.ws_endpoint) assert len(browser1.contexts) == 0 browser1.new_context() assert len(browser1.contexts) == 1 browser2 = browser_type.connect(remote_server.ws_endpoint) assert len(browser2.contexts) == 0 browser2.new_context() assert len(browser2.contexts) == 1 assert len(browser1.contexts) == 1 browser1.close() page2 = browser2.new_page() # original browser should still work assert page2.evaluate("7 * 6") == 42 browser2.close()
def test_browser_type_connect_slow_mo( server: Server, browser_type: BrowserType, launch_server: Callable[[], RemoteServer] ) -> None: remote_server = launch_server() browser = browser_type.connect(remote_server.ws_endpoint, slow_mo=100) browser_context = browser.new_context() t1 = time.monotonic() page = browser_context.new_page() assert page.evaluate("11 * 11") == 121 assert (time.monotonic() - t1) >= 0.2 page.goto(server.EMPTY_PAGE) browser.close()
def test_browser_type_connect_should_throw_when_used_after_is_connected_returns_false( browser_type: BrowserType, launch_server): remote_server = launch_server() browser = browser_type.connect(remote_server.ws_endpoint) page = browser.new_page() remote_server.kill() with pytest.raises(Error) as exc_info: page.evaluate("1 + 1") assert "Playwright connection closed" == exc_info.value.message assert browser.is_connected() is False
def test_record_video_can_get_video_path_immediately( browser_type: BrowserType, tmpdir: Path, launch_arguments: Dict) -> None: context = browser_type.launch_persistent_context(tmpdir, **launch_arguments, record_video_dir=tmpdir) page = context.pages[0] video = page.video assert video path = video.path() assert str(tmpdir) in str(path) page.wait_for_timeout(1000) context.close() assert os.path.exists(path)
def context(browser_type: BrowserType, browser_type_launch_args: Dict, browser_context_args: Dict): context = browser_type.launch_persistent_context( "", **{ **browser_type_launch_args, **browser_context_args, "viewport": { 'width': 1920, 'height': 1080 }, "args": ['--window-position=-9,0'], }) yield context context.close()
def test_record_video_to_path_persistent(browser_type: BrowserType, tmpdir: Path, server: Server, launch_arguments: Dict) -> None: context = browser_type.launch_persistent_context(tmpdir, **launch_arguments, record_video_dir=tmpdir) page = context.pages[0] page.goto(server.PREFIX + "/grid.html") video = page.video assert video path = video.path() assert str(tmpdir) in str(path) page.wait_for_timeout(1000) context.close() assert os.path.exists(path)
def test_browser_type_connect_should_forward_close_events_to_pages( browser_type: BrowserType, launch_server): # Launch another server to not affect other tests. remote = launch_server() browser = browser_type.connect(remote.ws_endpoint) context = browser.new_context() page = context.new_page() events = [] browser.on("disconnected", lambda: events.append("browser::disconnected")) context.on("close", lambda: events.append("context::close")) page.on("close", lambda: events.append("page::close")) browser.close() assert events == ["page::close", "context::close", "browser::disconnected"] remote.kill() assert events == ["page::close", "context::close", "browser::disconnected"]
def test_browser_type_connect_should_forward_close_events_on_remote_kill( browser_type: BrowserType, launch_server: Callable[[], RemoteServer] ) -> None: # Launch another server to not affect other tests. remote = launch_server() browser = browser_type.connect(remote.ws_endpoint) context = browser.new_context() page = context.new_page() events = [] browser.on("disconnected", lambda context: events.append("browser::disconnected")) context.on("close", lambda context: events.append("context::close")) page.on("close", lambda page: events.append("page::close")) remote.kill() with pytest.raises(Error): page.title() assert events == ["page::close", "context::close", "browser::disconnected"]
def browser( browser_type: BrowserType, launch_arguments: Dict ) -> Generator[Browser, None, None]: browser = browser_type.launch(**launch_arguments) yield browser browser.close()
def _browser( browser_type: BrowserType, browser_type_launch_args: dict) -> t.Generator[Browser, None, None]: browser = browser_type.launch(**browser_type_launch_args) yield browser browser.close()