# Rustwright API parity map
Reference: Playwright Python **1.61.0**. Candidate: Rustwright **0.1.0a4**.
This is an API-presence and shared-suite exercise map, not a claim of complete behavioral parity.
## Summary
Rustwright provides **515 of 536** reference sync-API methods; **411** are exercised by the **520-case** shared parity registry and **21** are missing. Its async API provides **488 of 536** reference async methods. The parity registry is sync-only, so it does not exercise async wrappers.
| Sync methods | 515 | 411 | 21 | 536 |
| Async methods | 488 | not measured | 48 | 536 |
### Major classes
| Browser | 11 | 9 | 0 | 11 | 11 | 0 |
| BrowserContext | 30 | 29 | 0 | 30 | 30 | 0 |
| Page | 101 | 98 | 1 | 102 | 101 | 1 |
| Locator | 60 | 53 | 2 | 62 | 60 | 2 |
| Frame | 55 | 49 | 0 | 55 | 55 | 0 |
Legend: ✅ present and statically resolved in a registered parity case; 🟡 present but not resolved in that sync suite; ❌ missing from Rustwright.
## API groups
### Browser
| `Playwright.chromium` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Playwright.devices` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Playwright.firefox` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `Playwright.request` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Playwright.selectors` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Playwright.stop` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Playwright.webkit` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `PlaywrightContextManager.start` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `BrowserType.connect` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `BrowserType.connect_over_cdp` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserType.executable_path` | property | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserType.launch` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserType.launch_persistent_context` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserType.name` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `Browser.bind` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.browser_type` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.close` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.contexts` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.is_connected` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.new_browser_cdp_session` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.new_context` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.new_page` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.on` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.once` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.start_tracing` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Browser.stop_tracing` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Browser.unbind` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Browser.version` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.add_cookies` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.add_init_script` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.background_pages` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.browser` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.clear_cookies` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.clear_permissions` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.clock` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.close` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.cookies` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.credentials` | property | ❌ missing | ❌ missing |
| `ChromiumBrowserContext.debugger` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.expect_console_message` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.expect_event` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.expect_page` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.expose_binding` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.expose_function` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.grant_permissions` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.is_closed` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.new_cdp_session` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.new_page` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.on` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.once` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.pages` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.request` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.route` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.route_from_har` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.route_web_socket` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.service_workers` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.set_default_navigation_timeout` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.set_default_timeout` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.set_extra_http_headers` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.set_geolocation` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.set_offline` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.set_storage_state` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.storage_state` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.tracing` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.unroute` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.unroute_all` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ChromiumBrowserContext.wait_for_event` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Selectors.register` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Selectors.set_test_id_attribute` | method | ✅ present + exercised | 🟡 present, not exercised |
### BrowserContext
| `BrowserContext.add_cookies` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.add_init_script` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.background_pages` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `BrowserContext.browser` | property | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.clear_cookies` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.clear_permissions` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.clock` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `BrowserContext.close` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.cookies` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.credentials` | property | ❌ missing | ❌ missing |
| `BrowserContext.debugger` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `BrowserContext.expect_console_message` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.expect_event` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.expect_page` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.expose_binding` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.expose_function` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.grant_permissions` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.is_closed` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.new_cdp_session` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.new_page` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.on` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.once` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.pages` | property | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.request` | property | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.route` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.route_from_har` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.route_web_socket` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.service_workers` | property | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.set_default_navigation_timeout` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `BrowserContext.set_default_timeout` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.set_extra_http_headers` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.set_geolocation` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.set_offline` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.set_storage_state` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.storage_state` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.tracing` | property | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.unroute` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.unroute_all` | method | ✅ present + exercised | 🟡 present, not exercised |
| `BrowserContext.wait_for_event` | method | ✅ present + exercised | 🟡 present, not exercised |
### Page
| `Page.add_init_script` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.add_locator_handler` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.add_script_tag` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.add_style_tag` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.aria_snapshot` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.bring_to_front` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Page.cancel_pick_locator` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Page.check` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.clear_console_messages` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.clear_page_errors` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.click` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.clock` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Page.close` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.console_messages` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.content` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.context` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Page.dblclick` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.dispatch_event` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.drag_and_drop` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.emulate_media` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.eval_on_selector` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.eval_on_selector_all` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.evaluate` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.evaluate_handle` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_console_message` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_download` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_event` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_file_chooser` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_navigation` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_popup` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_request` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_request_finished` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_response` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_websocket` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expect_worker` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expose_binding` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.expose_function` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.fill` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.focus` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.frame` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.frame_locator` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.frames` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Page.get_attribute` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.get_by_alt_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.get_by_label` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.get_by_placeholder` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.get_by_role` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.get_by_test_id` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.get_by_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.get_by_title` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.go_back` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.go_forward` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.goto` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.hide_highlight` | method | ❌ missing | ❌ missing |
| `Page.hover` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.inner_html` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.inner_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.input_value` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.is_checked` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.is_closed` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.is_disabled` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.is_editable` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.is_enabled` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.is_hidden` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.is_visible` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.keyboard` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Page.local_storage` | property | ❌ missing | ❌ missing |
| `Page.locator` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.main_frame` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Page.mouse` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Page.on` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.once` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.opener` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.page_errors` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.pause` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.pdf` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.pick_locator` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Page.press` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.query_selector` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.query_selector_all` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.reload` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.remove_locator_handler` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.request` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `Page.request_gc` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.requests` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.route` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.route_from_har` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.route_web_socket` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.screencast` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `Page.screenshot` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.select_option` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.session_storage` | property | ❌ missing | ❌ missing |
| `Page.set_checked` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.set_content` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.set_default_navigation_timeout` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.set_default_timeout` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.set_extra_http_headers` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.set_input_files` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.set_viewport_size` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.tap` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.text_content` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.title` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.touchscreen` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `Page.type` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.uncheck` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.unroute` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.unroute_all` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.url` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Page.video` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Page.viewport_size` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Page.wait_for_event` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.wait_for_function` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.wait_for_load_state` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.wait_for_selector` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.wait_for_timeout` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.wait_for_url` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Page.workers` | property | 🟡 present, not exercised | 🟡 present, not exercised |
### Locator
| `Locator.all` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.all_inner_texts` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.all_text_contents` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.and_` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.aria_snapshot` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.blur` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Locator.bounding_box` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.check` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.clear` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.click` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.content_frame` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.count` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.dblclick` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.describe` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.description` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.dispatch_event` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.drag_to` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.drop` | method | ❌ missing | ❌ missing |
| `Locator.element_handle` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Locator.element_handles` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.evaluate` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.evaluate_all` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.evaluate_handle` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.fill` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.filter` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.first` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.focus` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.frame_locator` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.get_attribute` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.get_by_alt_text` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Locator.get_by_label` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.get_by_placeholder` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Locator.get_by_role` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.get_by_test_id` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.get_by_text` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Locator.get_by_title` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Locator.hide_highlight` | method | ❌ missing | ❌ missing |
| `Locator.highlight` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.hover` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.inner_html` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.inner_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.input_value` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.is_checked` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.is_disabled` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.is_editable` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.is_enabled` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.is_hidden` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.is_visible` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.last` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.locator` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.normalize` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Locator.nth` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.or_` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.page` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `Locator.press` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.press_sequentially` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.screenshot` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.scroll_into_view_if_needed` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.select_option` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.select_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.set_checked` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.set_input_files` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.tap` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.text_content` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.type` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.uncheck` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Locator.wait_for` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.as_element` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ElementHandle.bounding_box` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.check` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.click` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.content_frame` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.dblclick` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.dispatch_event` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.eval_on_selector` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.eval_on_selector_all` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.fill` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.focus` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ElementHandle.get_attribute` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.hover` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.inner_html` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.inner_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.input_value` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.is_checked` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.is_disabled` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.is_editable` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.is_enabled` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.is_hidden` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.is_visible` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.owner_frame` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.press` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.query_selector` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.query_selector_all` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.screenshot` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `ElementHandle.scroll_into_view_if_needed` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.select_option` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.select_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.set_checked` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.set_input_files` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.tap` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.text_content` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.type` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.uncheck` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.wait_for_element_state` | method | ✅ present + exercised | 🟡 present, not exercised |
| `ElementHandle.wait_for_selector` | method | ✅ present + exercised | 🟡 present, not exercised |
| `JSHandle.as_element` | method | ✅ present + exercised | 🟡 present, not exercised |
| `JSHandle.dispose` | method | ✅ present + exercised | 🟡 present, not exercised |
| `JSHandle.evaluate` | method | ✅ present + exercised | 🟡 present, not exercised |
| `JSHandle.evaluate_handle` | method | ✅ present + exercised | 🟡 present, not exercised |
| `JSHandle.get_properties` | method | ✅ present + exercised | 🟡 present, not exercised |
| `JSHandle.get_property` | method | ✅ present + exercised | 🟡 present, not exercised |
| `JSHandle.json_value` | method | ✅ present + exercised | 🟡 present, not exercised |
| `FrameLocator.first` | property | ✅ present + exercised | 🟡 present, not exercised |
| `FrameLocator.frame_locator` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `FrameLocator.get_by_alt_text` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `FrameLocator.get_by_label` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `FrameLocator.get_by_placeholder` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `FrameLocator.get_by_role` | method | ✅ present + exercised | 🟡 present, not exercised |
| `FrameLocator.get_by_test_id` | method | ✅ present + exercised | 🟡 present, not exercised |
| `FrameLocator.get_by_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `FrameLocator.get_by_title` | method | ✅ present + exercised | 🟡 present, not exercised |
| `FrameLocator.last` | property | ✅ present + exercised | 🟡 present, not exercised |
| `FrameLocator.locator` | method | ✅ present + exercised | 🟡 present, not exercised |
| `FrameLocator.nth` | method | ✅ present + exercised | 🟡 present, not exercised |
| `FrameLocator.owner` | property | ✅ present + exercised | 🟡 present, not exercised |
### Frame
| `Frame.add_script_tag` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.add_style_tag` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.check` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.child_frames` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.click` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.content` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.dblclick` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.dispatch_event` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.drag_and_drop` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.eval_on_selector` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.eval_on_selector_all` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.evaluate` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.evaluate_handle` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.expect_navigation` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Frame.fill` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.focus` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.frame_element` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.frame_locator` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Frame.get_attribute` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.get_by_alt_text` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Frame.get_by_label` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Frame.get_by_placeholder` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.get_by_role` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.get_by_test_id` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.get_by_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.get_by_title` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Frame.goto` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.hover` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.inner_html` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.inner_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.input_value` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.is_checked` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.is_detached` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.is_disabled` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.is_editable` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.is_enabled` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.is_hidden` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.is_visible` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.locator` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.name` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.page` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.parent_frame` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.press` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.query_selector` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.query_selector_all` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Frame.select_option` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.set_checked` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.set_content` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.set_input_files` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.tap` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.text_content` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.title` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.type` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.uncheck` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.url` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.wait_for_function` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.wait_for_load_state` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.wait_for_selector` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.wait_for_timeout` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Frame.wait_for_url` | method | ✅ present + exercised | 🟡 present, not exercised |
### Input
| `Keyboard.down` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Keyboard.insert_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Keyboard.press` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Keyboard.type` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Keyboard.up` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Mouse.click` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Mouse.dblclick` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Mouse.down` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Mouse.move` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Mouse.up` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Mouse.wheel` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Touchscreen.tap` | method | 🟡 present, not exercised | 🟡 present, not exercised |
### Network and routing
| `Request.all_headers` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Request.existing_response` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `Request.failure` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Request.frame` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Request.header_value` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Request.headers` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Request.headers_array` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Request.is_navigation_request` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Request.method` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Request.post_data` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Request.post_data_buffer` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Request.post_data_json` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Request.redirected_from` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `Request.redirected_to` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `Request.resource_type` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Request.response` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Request.service_worker` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Request.sizes` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Request.timing` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Request.url` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Response.all_headers` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.body` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.finished` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.frame` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Response.from_service_worker` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Response.header_value` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.header_values` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.headers` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Response.headers_array` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.http_version` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.json` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.ok` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Response.request` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Response.security_details` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.server_addr` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.status` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Response.status_text` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Response.text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Response.url` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Route.abort` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Route.continue_` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Route.fallback` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Route.fetch` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Route.fulfill` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Route.request` | property | ✅ present + exercised | 🟡 present, not exercised |
| `WebSocket.expect_event` | method | ✅ present + exercised | 🟡 present, not exercised |
| `WebSocket.is_closed` | method | ✅ present + exercised | 🟡 present, not exercised |
| `WebSocket.on` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `WebSocket.once` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `WebSocket.url` | property | ✅ present + exercised | 🟡 present, not exercised |
| `WebSocket.wait_for_event` | method | ✅ present + exercised | 🟡 present, not exercised |
| `WebSocketRoute.close` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `WebSocketRoute.connect_to_server` | method | ✅ present + exercised | 🟡 present, not exercised |
| `WebSocketRoute.on_close` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `WebSocketRoute.on_message` | method | ✅ present + exercised | 🟡 present, not exercised |
| `WebSocketRoute.protocols` | property | ❌ missing | ❌ missing |
| `WebSocketRoute.send` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `WebSocketRoute.url` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `APIRequest.new_context` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIRequestContext.delete` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIRequestContext.dispose` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIRequestContext.fetch` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIRequestContext.get` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIRequestContext.head` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIRequestContext.patch` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIRequestContext.post` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIRequestContext.put` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIRequestContext.storage_state` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIRequestContext.tracing` | property | ❌ missing | ❌ missing |
| `APIResponse.body` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIResponse.dispose` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIResponse.headers` | property | ✅ present + exercised | 🟡 present, not exercised |
| `APIResponse.headers_array` | property | ✅ present + exercised | 🟡 present, not exercised |
| `APIResponse.json` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIResponse.ok` | property | ✅ present + exercised | 🟡 present, not exercised |
| `APIResponse.security_details` | method | ❌ missing | ❌ missing |
| `APIResponse.server_addr` | method | ❌ missing | ❌ missing |
| `APIResponse.status` | property | ✅ present + exercised | 🟡 present, not exercised |
| `APIResponse.status_text` | property | ✅ present + exercised | 🟡 present, not exercised |
| `APIResponse.text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIResponse.url` | property | ✅ present + exercised | 🟡 present, not exercised |
### Tracing and protocol
| `Tracing.group` | method | ✅ present + exercised | ❌ missing |
| `Tracing.group_end` | method | ✅ present + exercised | ❌ missing |
| `Tracing.start` | method | ✅ present + exercised | ❌ missing |
| `Tracing.start_chunk` | method | ✅ present + exercised | ❌ missing |
| `Tracing.start_har` | method | ❌ missing | ❌ missing |
| `Tracing.stop` | method | ✅ present + exercised | ❌ missing |
| `Tracing.stop_chunk` | method | ✅ present + exercised | ❌ missing |
| `Tracing.stop_har` | method | ❌ missing | ❌ missing |
| `CDPSession.detach` | method | ✅ present + exercised | 🟡 present, not exercised |
| `CDPSession.on` | method | ✅ present + exercised | 🟡 present, not exercised |
| `CDPSession.once` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `CDPSession.send` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Clock.fast_forward` | method | ✅ present + exercised | ❌ missing |
| `Clock.install` | method | ✅ present + exercised | ❌ missing |
| `Clock.pause_at` | method | ✅ present + exercised | ❌ missing |
| `Clock.resume` | method | ✅ present + exercised | ❌ missing |
| `Clock.run_for` | method | ✅ present + exercised | ❌ missing |
| `Clock.set_fixed_time` | method | ✅ present + exercised | ❌ missing |
| `Clock.set_system_time` | method | ✅ present + exercised | ❌ missing |
| `Debugger.next` | method | 🟡 present, not exercised | ❌ missing |
| `Debugger.on` | method | 🟡 present, not exercised | ❌ missing |
| `Debugger.once` | method | 🟡 present, not exercised | ❌ missing |
| `Debugger.paused_details` | property | 🟡 present, not exercised | ❌ missing |
| `Debugger.request_pause` | method | 🟡 present, not exercised | ❌ missing |
| `Debugger.resume` | method | 🟡 present, not exercised | ❌ missing |
| `Debugger.run_to` | method | 🟡 present, not exercised | ❌ missing |
| `Screencast.hide_actions` | method | 🟡 present, not exercised | ❌ missing |
| `Screencast.hide_overlays` | method | 🟡 present, not exercised | ❌ missing |
| `Screencast.show_actions` | method | 🟡 present, not exercised | ❌ missing |
| `Screencast.show_chapter` | method | 🟡 present, not exercised | ❌ missing |
| `Screencast.show_overlay` | method | 🟡 present, not exercised | ❌ missing |
| `Screencast.show_overlays` | method | 🟡 present, not exercised | ❌ missing |
| `Screencast.start` | method | 🟡 present, not exercised | ❌ missing |
| `Screencast.stop` | method | 🟡 present, not exercised | ❌ missing |
| `WebStorage.clear` | method | ❌ missing | ❌ missing |
| `WebStorage.get_item` | method | ❌ missing | ❌ missing |
| `WebStorage.items` | method | ❌ missing | ❌ missing |
| `WebStorage.remove_item` | method | ❌ missing | ❌ missing |
| `WebStorage.set_item` | method | ❌ missing | ❌ missing |
### Events and artifacts
| `ConsoleMessage.args` | property | ✅ present + exercised | 🟡 present, not exercised |
| `ConsoleMessage.location` | property | ✅ present + exercised | 🟡 present, not exercised |
| `ConsoleMessage.page` | property | ✅ present + exercised | 🟡 present, not exercised |
| `ConsoleMessage.text` | property | ✅ present + exercised | 🟡 present, not exercised |
| `ConsoleMessage.timestamp` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `ConsoleMessage.type` | property | ✅ present + exercised | 🟡 present, not exercised |
| `ConsoleMessage.worker` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Dialog.accept` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Dialog.default_value` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Dialog.dismiss` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Dialog.message` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Dialog.page` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Dialog.type` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Download.cancel` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Download.delete` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Download.failure` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Download.page` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `Download.path` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Download.save_as` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Download.suggested_filename` | property | ✅ present + exercised | 🟡 present, not exercised |
| `Download.url` | property | ✅ present + exercised | 🟡 present, not exercised |
| `FileChooser.element` | property | ✅ present + exercised | 🟡 present, not exercised |
| `FileChooser.is_multiple` | method | ✅ present + exercised | 🟡 present, not exercised |
| `FileChooser.page` | property | ✅ present + exercised | 🟡 present, not exercised |
| `FileChooser.set_files` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Video.delete` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Video.path` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Video.save_as` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Worker.evaluate` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Worker.evaluate_handle` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Worker.expect_event` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Worker.on` | method | ✅ present + exercised | 🟡 present, not exercised |
| `Worker.once` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Worker.url` | property | ✅ present + exercised | 🟡 present, not exercised |
| `WebError.error` | property | 🟡 present, not exercised | 🟡 present, not exercised |
| `WebError.location` | property | ❌ missing | ❌ missing |
| `WebError.page` | property | 🟡 present, not exercised | 🟡 present, not exercised |
### Assertions and other returned objects
| `PageAssertions.not_to_have_title` | method | ✅ present + exercised | 🟡 present, not exercised |
| `PageAssertions.not_to_have_url` | method | ✅ present + exercised | 🟡 present, not exercised |
| `PageAssertions.not_to_match_aria_snapshot` | method | ❌ missing | ❌ missing |
| `PageAssertions.to_have_title` | method | ✅ present + exercised | 🟡 present, not exercised |
| `PageAssertions.to_have_url` | method | ✅ present + exercised | 🟡 present, not exercised |
| `PageAssertions.to_match_aria_snapshot` | method | ❌ missing | ❌ missing |
| `LocatorAssertions.not_to_be_attached` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_be_checked` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_be_disabled` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_be_editable` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_be_empty` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_be_enabled` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_be_focused` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_be_hidden` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_be_in_viewport` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_be_visible` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_contain_class` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_contain_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_accessible_description` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_accessible_error_message` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_accessible_name` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_attribute` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_class` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_count` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_css` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_id` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_js_property` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_role` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_value` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_have_values` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.not_to_match_aria_snapshot` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_be_attached` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_be_checked` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_be_disabled` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_be_editable` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_be_empty` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_be_enabled` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_be_focused` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_be_hidden` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_be_in_viewport` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_be_visible` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_contain_class` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_contain_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_accessible_description` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_accessible_error_message` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_accessible_name` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_attribute` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_class` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_count` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_css` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_id` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_js_property` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_role` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_text` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_value` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_have_values` | method | ✅ present + exercised | 🟡 present, not exercised |
| `LocatorAssertions.to_match_aria_snapshot` | method | ✅ present + exercised | 🟡 present, not exercised |
| `APIResponseAssertions.not_to_be_ok` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `APIResponseAssertions.to_be_ok` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Expect.set_options` | method | 🟡 present, not exercised | 🟡 present, not exercised |
| `Expect.soft` | method | ❌ missing | ❌ missing |
| `Credentials.create` | method | ❌ missing | ❌ missing |
| `Credentials.delete` | method | ❌ missing | ❌ missing |
| `Credentials.get` | method | ❌ missing | ❌ missing |
| `Credentials.install` | method | ❌ missing | ❌ missing |
| `Disposable.close` | method | ❌ missing | ❌ missing |
| `Disposable.dispose` | method | ❌ missing | ❌ missing |
## Python exports
The package-root inventory below comes from `rustwright.__all__`; sync and async comparison counts come from each implementation module's `__all__`.
| `sync_api` | 50 | 55 | 5 | 8 |
| `async_api` | 51 | 55 | 4 | 8 |
Missing sync exports: `FormData`, `ScreencastFrame`, `ScreencastSize`, `Selectors`, `VirtualCredential`.
Missing async exports: `FormData`, `ScreencastFrame`, `ScreencastSize`, `VirtualCredential`.
### `rustwright` package-root exports
| `BackendMarker` | yes | yes |
| `Browser` | yes | yes |
| `BrowserContext` | yes | yes |
| `BrowserType` | yes | yes |
| `ConsoleMessage` | yes | yes |
| `Download` | yes | yes |
| `ElementHandle` | yes | yes |
| `Error` | yes | yes |
| `FileChooser` | yes | yes |
| `Frame` | yes | yes |
| `FrameLocator` | yes | yes |
| `JSHandle` | yes | yes |
| `Locator` | yes | yes |
| `Page` | yes | yes |
| `Playwright` | yes | yes |
| `Response` | yes | yes |
| `TargetClosedError` | no | no |
| `TimeoutError` | yes | yes |
| `Video` | yes | yes |
| `async_playwright` | no | yes |
| `backend_marker` | yes | yes |
| `disable_playwright_compat` | no | no |
| `enable_playwright_compat` | no | no |
| `expect` | yes | yes |
| `sync_playwright` | yes | no |
## Documented limitations
- Chromium only. Firefox and WebKit entry points currently raise unsupported browser errors.
- Behavioral parity is not fully proven. Rustwright exposes a broad Playwright-shaped API, but API-surface coverage is not the same as complete browser behavior parity.
- Async support currently wraps the sync implementation through Python thread execution. It is not recommended above roughly 25 concurrent workflows per process. Native async is planned; see [`docs/async-design.md`](async-design.md).
- OOPIF support is new. Cross-origin frame locator actions work in covered cases, but non-main-frame remote `JSHandle` follow-up operations remain a gap, and drag, screenshot, and bounding-box behavior in OOPIFs is not yet claimed as full parity.
- Anti-bot and stealth behavior is partial. Rustwright suppresses some common automation signals, but recent public fingerprint checks were only clean on about 2 of 4 targets. Rustwright does not promise undetectability.
- Drop-in compatibility import names are intended to be opt-in for the public alpha. The final compatibility-mode API is being finalized separately.
- The implementation still has large monolithic files. A module split is planned before beta.
## Node.js subset
This table is parsed from `node/README.md`; it does not infer capabilities from the native binding.
| `chromium.launch()` | ✅ bridged |
| `browser.newPage()` | ✅ bridged |
| `page.goto()` | ✅ bridged |
| `page.click()` | ✅ bridged |
| `page.fill()` | ✅ bridged |
| `page.title()` | ✅ bridged |
| `page.textContent()` | ✅ bridged |
| `page.evaluate()` | ✅ bridged |
| `page.screenshot()` | ✅ bridged |
| `page.close()` | ✅ bridged |
| `browser.close()` | ✅ bridged |
| browser contexts | ❌ not yet bridged |
| routes | ❌ not yet bridged |
| downloads | ❌ not yet bridged |
| tracing | ❌ not yet bridged |
| workers | ❌ not yet bridged |
| event waiters | ❌ not yet bridged |
| JS handles | ❌ not yet bridged |
| locators as first-class objects | ❌ not yet bridged |
| Firefox | ❌ not yet bridged |
| WebKit | ❌ not yet bridged |
## Methodology
- The reference surface was introspected from real Playwright Python 1.61.0. When Playwright is unavailable to the invoking interpreter, the generator uses the ignored `.venv-parity` environment and installs the pinned fallback `playwright==1.61.0`. It never installs into `.venv`.
- API classes are discovered from `sync_api`, `async_api`, and their generated modules. Public methods and properties declared on those classes are compared with matching Rustwright classes. Inherited event-emitter implementation helpers are excluded. Names are converted to snake_case before exact matching; normalization collisions fail generation.
- Method totals count methods, not properties. Properties remain in the detailed tables because they are part of the usable API and because their return annotations make chained receiver types resolvable.
- The exercised state starts only from the 520 functions actually present in the `CASES` registry. The generator verifies that `tests/test_playwright_parity_cases.py` imports that registry, runs `_run_parity` for a `playwright` parameter, and checks `len(CASES)`.
- Exercise detection is conservative static analysis. It propagates `Page` and `Playwright` case parameters through assignments, reference return annotations, property chains, collection indexing, local helper calls, callback annotations, and literal event names. A member becomes green only when its receiver resolves to one reference class. Dynamic `getattr`, aliases returned through untyped helpers, and callbacks with ambiguous receiver types remain yellow even if a case reaches them at runtime.
- 4 call site(s) had more than one plausible reference receiver class and were left uncredited rather than guessed.
- A green mark means the shared suite invokes or reads the member while running the same registered case against real Playwright and Rustwright. It does not prove all options, errors, events, browser engines, or edge cases match.
- The limitations and Node.js sections are parsed from `LIMITATIONS.md` and `node/README.md` on each run.
- Source digest (case registry, parity test, limitations, Node README): `73532a56375f4be0`.