Full Code of autoscrape-labs/pydoll for AI

main 9e236b887ab7 cached
464 files
5.0 MB
1.3M tokens
3939 symbols
1 requests
Download .txt
Showing preview only (5,289K chars total). Download the full file or copy to clipboard to get everything.
Repository: autoscrape-labs/pydoll
Branch: main
Commit: 9e236b887ab7
Files: 464
Total size: 5.0 MB

Directory structure:
gitextract_ulcsxv0t/

├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── documentation.yml
│   │   ├── feature_request.yml
│   │   └── refactoring.yml
│   ├── PULL_REQUEST_TEMPLATE/
│   │   ├── bug_fix.md
│   │   ├── refactoring.md
│   │   └── release.md
│   ├── pull_request_template.md
│   └── workflows/
│       ├── deploy-docs.yml
│       ├── mypy.yml
│       ├── publish.yml
│       ├── release.yml
│       ├── ruff-ci.yml
│       └── tests.yml
├── .gitignore
├── .python-version
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── README_zh.md
├── SPONSORS.md
├── codecov.yml
├── cz.yaml
├── docs/
│   ├── en/
│   │   ├── api/
│   │   │   ├── browser/
│   │   │   │   ├── chrome.md
│   │   │   │   ├── edge.md
│   │   │   │   ├── managers.md
│   │   │   │   ├── options.md
│   │   │   │   ├── requests.md
│   │   │   │   └── tab.md
│   │   │   ├── commands/
│   │   │   │   ├── browser.md
│   │   │   │   ├── dom.md
│   │   │   │   ├── fetch.md
│   │   │   │   ├── index.md
│   │   │   │   ├── input.md
│   │   │   │   ├── network.md
│   │   │   │   ├── page.md
│   │   │   │   ├── runtime.md
│   │   │   │   ├── storage.md
│   │   │   │   └── target.md
│   │   │   ├── connection/
│   │   │   │   ├── connection.md
│   │   │   │   └── managers.md
│   │   │   ├── core/
│   │   │   │   ├── constants.md
│   │   │   │   ├── exceptions.md
│   │   │   │   └── utils.md
│   │   │   ├── elements/
│   │   │   │   ├── mixins.md
│   │   │   │   ├── shadow_root.md
│   │   │   │   └── web_element.md
│   │   │   ├── index.md
│   │   │   └── protocol/
│   │   │       ├── base.md
│   │   │       ├── browser.md
│   │   │       ├── dom.md
│   │   │       ├── fetch.md
│   │   │       ├── input.md
│   │   │       ├── network.md
│   │   │       ├── page.md
│   │   │       ├── runtime.md
│   │   │       ├── storage.md
│   │   │       └── target.md
│   │   ├── deep-dive/
│   │   │   ├── architecture/
│   │   │   │   ├── browser-domain.md
│   │   │   │   ├── browser-requests-architecture.md
│   │   │   │   ├── event-architecture.md
│   │   │   │   ├── find-elements-mixin.md
│   │   │   │   ├── index.md
│   │   │   │   ├── shadow-dom.md
│   │   │   │   ├── tab-domain.md
│   │   │   │   └── webelement-domain.md
│   │   │   ├── fingerprinting/
│   │   │   │   ├── behavioral-fingerprinting.md
│   │   │   │   ├── browser-fingerprinting.md
│   │   │   │   ├── evasion-techniques.md
│   │   │   │   ├── index.md
│   │   │   │   └── network-fingerprinting.md
│   │   │   ├── fundamentals/
│   │   │   │   ├── cdp.md
│   │   │   │   ├── connection-layer.md
│   │   │   │   ├── iframes-and-contexts.md
│   │   │   │   ├── index.md
│   │   │   │   └── typing-system.md
│   │   │   ├── guides/
│   │   │   │   ├── index.md
│   │   │   │   └── selectors-guide.md
│   │   │   ├── index.md
│   │   │   └── network/
│   │   │       ├── build-proxy.md
│   │   │       ├── http-proxies.md
│   │   │       ├── index.md
│   │   │       ├── network-fundamentals.md
│   │   │       ├── proxy-detection.md
│   │   │       ├── proxy-legal.md
│   │   │       └── socks-proxies.md
│   │   ├── features/
│   │   │   ├── advanced/
│   │   │   │   ├── behavioral-captcha-bypass.md
│   │   │   │   ├── decorators.md
│   │   │   │   ├── event-system.md
│   │   │   │   └── remote-connections.md
│   │   │   ├── automation/
│   │   │   │   ├── file-operations.md
│   │   │   │   ├── human-interactions.md
│   │   │   │   ├── iframes.md
│   │   │   │   ├── keyboard-control.md
│   │   │   │   ├── mouse-control.md
│   │   │   │   └── screenshots-and-pdfs.md
│   │   │   ├── browser-management/
│   │   │   │   ├── contexts.md
│   │   │   │   ├── cookies-sessions.md
│   │   │   │   └── tabs.md
│   │   │   ├── configuration/
│   │   │   │   ├── browser-options.md
│   │   │   │   ├── browser-preferences.md
│   │   │   │   └── proxy.md
│   │   │   ├── core-concepts.md
│   │   │   ├── element-finding.md
│   │   │   ├── index.md
│   │   │   └── network/
│   │   │       ├── http-requests.md
│   │   │       ├── interception.md
│   │   │       ├── monitoring.md
│   │   │       └── network-recording.md
│   │   └── index.md
│   ├── pt/
│   │   ├── api/
│   │   │   ├── browser/
│   │   │   │   ├── chrome.md
│   │   │   │   ├── edge.md
│   │   │   │   ├── managers.md
│   │   │   │   ├── options.md
│   │   │   │   ├── requests.md
│   │   │   │   └── tab.md
│   │   │   ├── commands/
│   │   │   │   ├── browser.md
│   │   │   │   ├── dom.md
│   │   │   │   ├── fetch.md
│   │   │   │   ├── index.md
│   │   │   │   ├── input.md
│   │   │   │   ├── network.md
│   │   │   │   ├── page.md
│   │   │   │   ├── runtime.md
│   │   │   │   ├── storage.md
│   │   │   │   └── target.md
│   │   │   ├── connection/
│   │   │   │   ├── connection.md
│   │   │   │   └── managers.md
│   │   │   ├── core/
│   │   │   │   ├── constants.md
│   │   │   │   ├── exceptions.md
│   │   │   │   └── utils.md
│   │   │   ├── elements/
│   │   │   │   ├── mixins.md
│   │   │   │   ├── shadow_root.md
│   │   │   │   └── web_element.md
│   │   │   ├── index.md
│   │   │   └── protocol/
│   │   │       ├── base.md
│   │   │       ├── browser.md
│   │   │       ├── dom.md
│   │   │       ├── fetch.md
│   │   │       ├── input.md
│   │   │       ├── network.md
│   │   │       ├── page.md
│   │   │       ├── runtime.md
│   │   │       ├── storage.md
│   │   │       └── target.md
│   │   ├── deep-dive/
│   │   │   ├── architecture/
│   │   │   │   ├── browser-domain.md
│   │   │   │   ├── browser-requests-architecture.md
│   │   │   │   ├── event-architecture.md
│   │   │   │   ├── find-elements-mixin.md
│   │   │   │   ├── index.md
│   │   │   │   ├── shadow-dom.md
│   │   │   │   ├── tab-domain.md
│   │   │   │   └── webelement-domain.md
│   │   │   ├── fingerprinting/
│   │   │   │   ├── behavioral-fingerprinting.md
│   │   │   │   ├── browser-fingerprinting.md
│   │   │   │   ├── evasion-techniques.md
│   │   │   │   ├── index.md
│   │   │   │   └── network-fingerprinting.md
│   │   │   ├── fundamentals/
│   │   │   │   ├── cdp.md
│   │   │   │   ├── connection-layer.md
│   │   │   │   ├── iframes-and-contexts.md
│   │   │   │   ├── index.md
│   │   │   │   └── typing-system.md
│   │   │   ├── guides/
│   │   │   │   ├── index.md
│   │   │   │   └── selectors-guide.md
│   │   │   ├── index.md
│   │   │   └── network/
│   │   │       ├── build-proxy.md
│   │   │       ├── http-proxies.md
│   │   │       ├── index.md
│   │   │       ├── network-fundamentals.md
│   │   │       ├── proxy-detection.md
│   │   │       ├── proxy-legal.md
│   │   │       └── socks-proxies.md
│   │   ├── features/
│   │   │   ├── advanced/
│   │   │   │   ├── behavioral-captcha-bypass.md
│   │   │   │   ├── decorators.md
│   │   │   │   ├── event-system.md
│   │   │   │   └── remote-connections.md
│   │   │   ├── automation/
│   │   │   │   ├── file-operations.md
│   │   │   │   ├── human-interactions.md
│   │   │   │   ├── iframes.md
│   │   │   │   ├── keyboard-control.md
│   │   │   │   ├── mouse-control.md
│   │   │   │   └── screenshots-and-pdfs.md
│   │   │   ├── browser-management/
│   │   │   │   ├── contexts.md
│   │   │   │   ├── cookies-sessions.md
│   │   │   │   └── tabs.md
│   │   │   ├── configuration/
│   │   │   │   ├── browser-options.md
│   │   │   │   ├── browser-preferences.md
│   │   │   │   └── proxy.md
│   │   │   ├── core-concepts.md
│   │   │   ├── element-finding.md
│   │   │   ├── index.md
│   │   │   └── network/
│   │   │       ├── http-requests.md
│   │   │       ├── interception.md
│   │   │       ├── monitoring.md
│   │   │       └── network-recording.md
│   │   └── index.md
│   ├── resources/
│   │   ├── scripts/
│   │   │   ├── extra.js
│   │   │   └── termynal.js
│   │   └── stylesheets/
│   │       ├── extra.css
│   │       └── termynal.css
│   └── zh/
│       ├── api/
│       │   ├── browser/
│       │   │   ├── chrome.md
│       │   │   ├── edge.md
│       │   │   ├── managers.md
│       │   │   ├── options.md
│       │   │   ├── requests.md
│       │   │   └── tab.md
│       │   ├── commands/
│       │   │   ├── browser.md
│       │   │   ├── dom.md
│       │   │   ├── fetch.md
│       │   │   ├── index.md
│       │   │   ├── input.md
│       │   │   ├── network.md
│       │   │   ├── page.md
│       │   │   ├── runtime.md
│       │   │   ├── storage.md
│       │   │   └── target.md
│       │   ├── connection/
│       │   │   ├── connection.md
│       │   │   └── managers.md
│       │   ├── core/
│       │   │   ├── constants.md
│       │   │   ├── exceptions.md
│       │   │   └── utils.md
│       │   ├── elements/
│       │   │   ├── mixins.md
│       │   │   ├── shadow_root.md
│       │   │   └── web_element.md
│       │   ├── index.md
│       │   └── protocol/
│       │       ├── base.md
│       │       ├── browser.md
│       │       ├── dom.md
│       │       ├── fetch.md
│       │       ├── input.md
│       │       ├── network.md
│       │       ├── page.md
│       │       ├── runtime.md
│       │       ├── storage.md
│       │       └── target.md
│       ├── deep-dive/
│       │   ├── architecture/
│       │   │   ├── browser-domain.md
│       │   │   ├── browser-requests-architecture.md
│       │   │   ├── event-architecture.md
│       │   │   ├── find-elements-mixin.md
│       │   │   ├── index.md
│       │   │   ├── shadow-dom.md
│       │   │   ├── tab-domain.md
│       │   │   └── webelement-domain.md
│       │   ├── fingerprinting/
│       │   │   ├── behavioral-fingerprinting.md
│       │   │   ├── browser-fingerprinting.md
│       │   │   ├── evasion-techniques.md
│       │   │   ├── index.md
│       │   │   └── network-fingerprinting.md
│       │   ├── fundamentals/
│       │   │   ├── cdp.md
│       │   │   ├── connection-layer.md
│       │   │   ├── iframes-and-contexts.md
│       │   │   ├── index.md
│       │   │   └── typing-system.md
│       │   ├── guides/
│       │   │   ├── index.md
│       │   │   └── selectors-guide.md
│       │   ├── index.md
│       │   └── network/
│       │       ├── build-proxy.md
│       │       ├── http-proxies.md
│       │       ├── index.md
│       │       ├── network-fundamentals.md
│       │       ├── proxy-detection.md
│       │       ├── proxy-legal.md
│       │       └── socks-proxies.md
│       ├── features/
│       │   ├── advanced/
│       │   │   ├── behavioral-captcha-bypass.md
│       │   │   ├── decorators.md
│       │   │   ├── event-system.md
│       │   │   └── remote-connections.md
│       │   ├── automation/
│       │   │   ├── file-operations.md
│       │   │   ├── human-interactions.md
│       │   │   ├── iframes.md
│       │   │   ├── keyboard-control.md
│       │   │   ├── mouse-control.md
│       │   │   └── screenshots-and-pdfs.md
│       │   ├── browser-management/
│       │   │   ├── contexts.md
│       │   │   ├── cookies-sessions.md
│       │   │   └── tabs.md
│       │   ├── configuration/
│       │   │   ├── browser-options.md
│       │   │   ├── browser-preferences.md
│       │   │   └── proxy.md
│       │   ├── core-concepts.md
│       │   ├── element-finding.md
│       │   ├── index.md
│       │   └── network/
│       │       ├── http-requests.md
│       │       ├── interception.md
│       │       ├── monitoring.md
│       │       └── network-recording.md
│       └── index.md
├── examples/
│   └── cloudflare_bypass.py
├── mkdocs.yml
├── public/
│   ├── index.html
│   ├── robots.txt
│   ├── script.js
│   ├── scripts/
│   │   ├── extra.js
│   │   └── termynal.js
│   ├── sitemap.xml
│   └── stylesheets/
│       ├── extra.css
│       └── termynal.css
├── pydoll/
│   ├── __init__.py
│   ├── browser/
│   │   ├── __init__.py
│   │   ├── chromium/
│   │   │   ├── __init__.py
│   │   │   ├── base.py
│   │   │   ├── chrome.py
│   │   │   └── edge.py
│   │   ├── interfaces.py
│   │   ├── managers/
│   │   │   ├── __init__.py
│   │   │   ├── browser_options_manager.py
│   │   │   ├── browser_process_manager.py
│   │   │   ├── proxy_manager.py
│   │   │   └── temp_dir_manager.py
│   │   ├── options.py
│   │   ├── requests/
│   │   │   ├── __init__.py
│   │   │   ├── har_recorder.py
│   │   │   ├── request.py
│   │   │   └── response.py
│   │   └── tab.py
│   ├── commands/
│   │   ├── __init__.py
│   │   ├── browser_commands.py
│   │   ├── dom_commands.py
│   │   ├── emulation_commands.py
│   │   ├── fetch_commands.py
│   │   ├── input_commands.py
│   │   ├── network_commands.py
│   │   ├── page_commands.py
│   │   ├── runtime_commands.py
│   │   ├── storage_commands.py
│   │   └── target_commands.py
│   ├── connection/
│   │   ├── __init__.py
│   │   ├── connection_handler.py
│   │   └── managers/
│   │       ├── __init__.py
│   │       ├── commands_manager.py
│   │       └── events_manager.py
│   ├── constants.py
│   ├── decorators.py
│   ├── elements/
│   │   ├── __init__.py
│   │   ├── mixins/
│   │   │   ├── __init__.py
│   │   │   └── find_elements_mixin.py
│   │   ├── shadow_root.py
│   │   ├── utils/
│   │   │   ├── __init__.py
│   │   │   └── selector_parser.py
│   │   └── web_element.py
│   ├── exceptions.py
│   ├── interactions/
│   │   ├── __init__.py
│   │   ├── iframe.py
│   │   ├── keyboard.py
│   │   ├── mouse.py
│   │   ├── scroll.py
│   │   └── utils.py
│   ├── protocol/
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── browser/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── debugger/
│   │   │   └── types.py
│   │   ├── dom/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── emulation/
│   │   │   ├── __init__.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── fetch/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── input/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── io/
│   │   │   └── types.py
│   │   ├── network/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── har_types.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── page/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── runtime/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── security/
│   │   │   └── types.py
│   │   ├── storage/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   └── target/
│   │       ├── __init__.py
│   │       ├── events.py
│   │       ├── methods.py
│   │       └── types.py
│   ├── py.typed
│   └── utils/
│       ├── __init__.py
│       ├── bundle.py
│       ├── general.py
│       ├── socks5_proxy_forwarder.py
│       └── user_agent_parser.py
├── pyproject.toml
└── tests/
    ├── conftest.py
    ├── pages/
    │   ├── oopif/
    │   │   ├── oopif_content.html
    │   │   ├── oopif_main.html
    │   │   ├── oopif_nested.html
    │   │   └── oopif_shadow_iframe.html
    │   ├── shadow_dom_test.html
    │   ├── test_children.html
    │   ├── test_click_nested.html
    │   ├── test_click_nested_iframe_content.html
    │   ├── test_core_simple.html
    │   ├── test_frame_content.html
    │   ├── test_frameset.html
    │   ├── test_har_recording.html
    │   ├── test_iframe_content.html
    │   ├── test_iframe_nested.html
    │   ├── test_iframe_nested_level.html
    │   ├── test_iframe_parent_level.html
    │   ├── test_iframe_simple.html
    │   └── test_multiple_iframes.html
    ├── test_browser/
    │   ├── test_browser_base.py
    │   ├── test_browser_chrome.py
    │   ├── test_browser_edge.py
    │   ├── test_browser_options.py
    │   ├── test_browser_tab.py
    │   ├── test_har_recorder.py
    │   ├── test_requests_request.py
    │   ├── test_requests_response.py
    │   └── test_tab_request_integration.py
    ├── test_click_nested_integration.py
    ├── test_commands/
    │   ├── test_browser_commands.py
    │   ├── test_dom_commands.py
    │   ├── test_emulation_commands.py
    │   ├── test_fetch_commands.py
    │   ├── test_input_commands.py
    │   ├── test_network_commands.py
    │   ├── test_page_commands.py
    │   ├── test_runtime_commands.py
    │   ├── test_storage_commands.py
    │   └── test_target_commands.py
    ├── test_connection_handler.py
    ├── test_core_integration.py
    ├── test_decorators.py
    ├── test_events.py
    ├── test_exceptions.py
    ├── test_find_elements_mixin.py
    ├── test_har_recording_integration.py
    ├── test_iframe_integration.py
    ├── test_interactions/
    │   ├── __init__.py
    │   ├── test_iframe.py
    │   ├── test_keyboard.py
    │   ├── test_mouse.py
    │   └── test_scroll.py
    ├── test_managers/
    │   ├── test_browser_managers.py
    │   └── test_connection_managers.py
    ├── test_nested_oopif_integration.py
    ├── test_shadow_root.py
    ├── test_shadow_root_integration.py
    ├── test_socks5_proxy_forwarder.py
    ├── test_user_agent_parser.py
    ├── test_utils.py
    └── test_web_element.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: [thalissonvs]



================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Report a bug in pydoll
title: "[Bug]: "
labels: ["bug", "needs-triage"]
body:
  - type: markdown
    attributes:
      value: |
        # pydoll Bug Report
        
        Thank you for taking the time to report a bug. This form will guide you through providing the information needed to address the issue effectively.
  
  - type: checkboxes
    id: checklist
    attributes:
      label: Checklist before reporting
      description: Please make sure you've completed the following steps before submitting a bug report.
      options:
        - label: I have searched for [similar issues](https://github.com/thalissonvs/pydoll/issues) and didn't find a duplicate.
          required: true
        - label: I have updated to the latest version of pydoll to verify the issue still exists.
          required: true
  
  - type: input
    id: version
    attributes:
      label: pydoll Version
      description: What version of pydoll are you using when encountering this bug?
      placeholder: e.g., 1.3.2
    validations:
      required: true
  
  - type: input
    id: python_version
    attributes:
      label: Python Version
      description: What version of Python are you using?
      placeholder: e.g., 3.10.4
    validations:
      required: true
  
  - type: dropdown
    id: os
    attributes:
      label: Operating System
      description: What operating system are you using?
      options:
        - Windows
        - macOS
        - Linux
        - Other (specify in environment details)
    validations:
      required: true
  
  - type: textarea
    id: description
    attributes:
      label: Bug Description
      description: A clear and concise description of what the bug is.
      placeholder: When I try to use X feature, the library fails with error message Y...
    validations:
      required: true
  
  - type: textarea
    id: reproduction_steps
    attributes:
      label: Steps to Reproduce
      description: Step by step instructions to reproduce the bug.
      placeholder: |
        1. Import the library using `import pydoll`
        2. Set up the client with `...`
        3. Call method X with parameters Y
        4. See error
    validations:
      required: true
  
  - type: textarea
    id: code_example
    attributes:
      label: Code Example
      description: |
        A minimal, self-contained code example that demonstrates the issue.
        This will be automatically formatted into code, so no need for backticks.
      render: python
      placeholder: |
        from pydoll import Client
        
        client = Client(...)
        
        # Code that triggers the bug
        result = client.some_method(...)
        print(result)
    validations:
      required: true
  
  - type: textarea
    id: expected_behavior
    attributes:
      label: Expected Behavior
      description: A clear and concise description of what you expected to happen.
      placeholder: The method should return X or perform Y...
    validations:
      required: false
  
  - type: textarea
    id: actual_behavior
    attributes:
      label: Actual Behavior
      description: What actually happened instead? Include full error messages and stack traces if applicable.
      placeholder: The method raised an exception...
    validations:
      required: false
  
  - type: textarea
    id: logs
    attributes:
      label: Relevant Log Output
      description: |
        If applicable, include any logs or error messages. 
        This will be automatically formatted, so no need for backticks.
      render: shell
      placeholder: |
        Traceback (most recent call last):
          File "example.py", line 10, in <module>
            ...
          File ".../pydoll/...", line N, in some_method
            ...
        SomeError: Error message
  
  - type: textarea
    id: additional_context
    attributes:
      label: Additional Context
      description: Add any other context about the problem here (environment details, potential causes, solutions you've tried, etc.)
      placeholder: I've tried reinstalling the package and using a different Python version, but the issue persists... 


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
  - name: Questions & Discussions
    url: https://github.com/thalissonvs/pydoll/discussions
    about: Please ask and answer questions here. 


================================================
FILE: .github/ISSUE_TEMPLATE/documentation.yml
================================================
name: Documentation Issue
description: Report missing, incorrect, or unclear documentation
title: "[Docs]: "
labels: ["documentation", "needs-triage"]
body:
  - type: markdown
    attributes:
      value: |
        # pydoll Documentation Issue
        
        Thank you for helping us improve the documentation. This form will guide you through providing the information needed to address documentation issues effectively.
  
  - type: checkboxes
    id: checklist
    attributes:
      label: Checklist before reporting
      description: Please make sure you've completed the following steps before submitting a documentation issue.
      options:
        - label: I have searched for [similar documentation issues](https://github.com/thalissonvs/pydoll/issues) and didn't find a duplicate.
          required: true
        - label: I have checked the latest documentation to verify this issue still exists.
          required: true
  
  - type: dropdown
    id: type
    attributes:
      label: Type of Documentation Issue
      description: What type of documentation issue are you reporting?
      options:
        - Missing documentation (information does not exist)
        - Incorrect documentation (information is wrong)
        - Unclear documentation (information is confusing or ambiguous)
        - Outdated documentation (information is no longer valid)
        - Other (please specify in description)
    validations:
      required: true
  
  - type: input
    id: location
    attributes:
      label: Documentation Location
      description: Where is the documentation with issues located? Provide URLs, file paths, or section names.
      placeholder: e.g., https://docs.example.com/pydoll/api.html#section, README.md, API Reference for Client class
    validations:
      required: true
  
  - type: textarea
    id: description
    attributes:
      label: Issue Description
      description: Describe the issue with the documentation in detail.
      placeholder: |
        The documentation for the `Client.connect()` method doesn't mention the timeout parameter, 
        which I discovered by looking at the source code.
    validations:
      required: true
  
  - type: textarea
    id: suggested_fix
    attributes:
      label: Suggested Fix
      description: If you have a suggestion for how to fix the documentation, please provide it here.
      placeholder: |
        Add the following to the `Client.connect()` documentation:
        
        ```
        Parameters:
          timeout (float, optional): Connection timeout in seconds. Defaults to 30.
        ```
  
  - type: textarea
    id: additional_info
    attributes:
      label: Additional Information
      description: Any additional context or information that might help address this documentation issue.
      placeholder: |
        I found this issue when trying to implement a connection with a shorter timeout for my specific use case.
  
  - type: dropdown
    id: contribution
    attributes:
      label: Contribution
      description: Would you be willing to contribute a fix for this documentation?
      options:
        - Yes, I'd be willing to submit a PR with the fix
        - No, I don't have the capacity to fix this
    validations:
      required: true 

================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature Request
description: Suggest a new feature or enhancement for pydoll
title: "[Feature Request]: "
labels: ["enhancement", "needs-triage"]
body:
  - type: markdown
    attributes:
      value: |
        # pydoll Feature Request
        
        Thank you for taking the time to suggest a new feature. This form will guide you through providing the information needed to consider your suggestion effectively.
  
  - type: checkboxes
    id: checklist
    attributes:
      label: Checklist before requesting
      description: Please make sure you've completed the following steps before submitting a feature request.
      options:
        - label: I have searched for [similar feature requests](https://github.com/thalissonvs/pydoll/issues) and didn't find a duplicate.
          required: true
        - label: I have checked the documentation to confirm this feature doesn't already exist.
          required: true
  
  - type: textarea
    id: problem
    attributes:
      label: Problem Statement
      description: Is your feature request related to a problem? Please describe what you're trying to accomplish.
      placeholder: I'm trying to accomplish X, but I'm unable to because Y...
    validations:
      required: true
  
  - type: textarea
    id: solution
    attributes:
      label: Proposed Solution
      description: Describe the solution you'd like to see implemented. Be as specific as possible.
      placeholder: |
        I would like to see a new method/class that can...
        
        Example usage might look like:
        ```python
        client.new_feature(param1, param2)
        ```
    validations:
      required: true
  
  - type: textarea
    id: alternatives
    attributes:
      label: Alternatives Considered
      description: Describe any alternative solutions or features you've considered.
      placeholder: I've tried accomplishing this using X and Y approaches, but they don't work well because...
  
  - type: textarea
    id: context
    attributes:
      label: Additional Context
      description: Add any other context, code examples, or references that might help explain your feature request.
      placeholder: |
        Other libraries like X and Y have similar features that work like...
        
        This would help users who need to...
  
  - type: dropdown
    id: importance
    attributes:
      label: Importance
      description: How important is this feature to your use case?
      options:
        - Nice to have
        - Important
        - Critical (blocking my usage)
    validations:
      required: true
  
  - type: dropdown
    id: contribution
    attributes:
      label: Contribution
      description: Would you be willing to contribute this feature yourself?
      options:
        - Yes, I'd be willing to implement this feature
        - I could help with parts of the implementation
        - No, I don't have the capacity to implement this 

================================================
FILE: .github/ISSUE_TEMPLATE/refactoring.yml
================================================
name: Refactoring Request
description: Suggest code refactoring to improve pydoll's quality, performance, or maintainability
title: "[Refactor]: "
labels: ["refactor", "needs-triage"]
body:
  - type: markdown
    attributes:
      value: |
        # pydoll Refactoring Request
        
        Thank you for suggesting improvements to our codebase. This form will guide you through providing the information needed to consider your refactoring suggestion effectively.
  
  - type: checkboxes
    id: checklist
    attributes:
      label: Checklist before suggesting refactoring
      description: Please make sure you've completed the following steps before submitting a refactoring request.
      options:
        - label: I have searched for [similar refactoring requests](https://github.com/thalissonvs/pydoll/issues) and didn't find a duplicate.
          required: true
        - label: I have reviewed the current implementation to ensure my understanding is accurate.
          required: true
  
  - type: textarea
    id: current_implementation
    attributes:
      label: Current Implementation
      description: Describe the current implementation and its limitations. Include file paths if known.
      placeholder: |
        The current implementation in `pydoll/module/file.py` has the following issues:
        1. It uses an inefficient algorithm for...
        2. The code structure makes it difficult to maintain because...
    validations:
      required: true
  
  - type: textarea
    id: proposed_changes
    attributes:
      label: Proposed Changes
      description: Describe the changes you're suggesting. Be as specific as possible.
      placeholder: |
        I suggest refactoring this code to:
        1. Replace the current algorithm with X, which would improve performance by...
        2. Restructure the class hierarchy to better separate concerns by...
        
        Example code sketch (if applicable):
        ```python
        def improved_method():
            # better implementation
        ```
    validations:
      required: true
  
  - type: textarea
    id: benefits
    attributes:
      label: Benefits
      description: Explain the benefits of this refactoring.
      placeholder: |
        This refactoring would:
        - Improve performance by X%
        - Make the code more maintainable by...
        - Reduce code complexity by...
        - Fix potential bugs such as...
    validations:
      required: true
  
  - type: dropdown
    id: impact
    attributes:
      label: API Impact
      description: Would this refactoring change the public API?
      options:
        - No API changes (internal refactoring only)
        - Minor API changes (backward compatible)
        - Breaking API changes
    validations:
      required: true
  
  - type: textarea
    id: testing_approach
    attributes:
      label: Testing Approach
      description: How can we verify that the refactoring doesn't break existing functionality?
      placeholder: |
        The refactoring can be tested by:
        - Running the existing test suite
        - Adding new tests for edge cases such as...
        - Benchmarking performance before and after
  
  - type: dropdown
    id: contribution
    attributes:
      label: Contribution
      description: Would you be willing to contribute this refactoring yourself?
      options:
        - Yes, I'd be willing to implement this refactoring
        - I could help with parts of the implementation
        - No, I don't have the capacity to implement this 

================================================
FILE: .github/PULL_REQUEST_TEMPLATE/bug_fix.md
================================================
# Bug Fix Pull Request

## Related Issue(s)
<!-- Link the bug report that's being fixed by this PR. Use the format: "Fixes #123" or "Resolves #123" -->

## Bug Description
<!-- Briefly describe the bug that's being fixed -->

## Root Cause
<!-- Explain the root cause of the bug -->

## Solution
<!-- Describe your solution to fix the bug -->

## Verification Steps
<!-- List the steps to verify this fix works -->
1. 
2. 
3. 

## Code Example
<!-- If applicable, provide a code example demonstrating the fix -->
```python
# Example code showing the fix
```

## Before / After
<!-- If applicable, provide before/after screenshots or code snippets -->

## Testing
<!-- Describe the tests you added or modified to verify your fix -->

## Testing Checklist
- [ ] Added regression test that would have caught this bug
- [ ] Modified existing tests to account for this fix
- [ ] All tests pass
- [ ] Edge cases have been tested

## Impact
<!-- Describe any potential impact this fix might have on existing functionality -->
- [ ] Low (isolated fix with no side effects)
- [ ] Medium (might affect closely related functionality)
- [ ] High (affects multiple areas or changes core behavior)

## Backwards Compatibility
- [ ] This change is fully backward compatible
- [ ] This change introduces backward incompatibilities (explain below)

## Checklist before requesting a review
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have added test cases that prove my fix is effective
- [ ] I have run `poetry run task lint` and fixed any issues
- [ ] I have run `poetry run task test` and all tests pass
- [ ] My commits follow the [conventional commits](https://www.conventionalcommits.org/) style with message explaining the fix 

================================================
FILE: .github/PULL_REQUEST_TEMPLATE/refactoring.md
================================================
# Refactoring Pull Request

## Refactoring Scope
<!-- Describe which part of the codebase is being refactored -->

## Related Issue(s)
<!-- Link the refactoring issue that's being addressed by this PR. Use the format: "Fixes #123" or "Resolves #123" -->

## Description
<!-- Provide a clear and detailed description of the refactoring changes -->

## Motivation
<!-- Explain why this refactoring is necessary -->

## Before / After
<!-- If applicable, provide code examples showing the before and after of the refactoring -->

### Before
```python
# Original code
```

### After
```python
# Refactored code
```

## Performance Impact
<!-- If applicable, describe any performance improvements or potential impacts -->
- [ ] Performance improved
- [ ] Performance potentially decreased
- [ ] No significant performance change
- [ ] Performance impact unknown

## Technical Debt
<!-- Describe how this refactoring addresses technical debt -->

## API Changes
- [ ] No changes to public API
- [ ] Public API changed, but backward compatible
- [ ] Breaking changes to public API

## Testing Strategy
<!-- Describe how you've tested the refactoring -->

## Testing Checklist
- [ ] Existing tests updated
- [ ] New tests added for previously uncovered cases
- [ ] All tests pass
- [ ] Code coverage maintained or improved

## Risks and Mitigations
<!-- Describe any potential risks introduced by this refactoring and how they were mitigated -->

## Checklist before requesting a review
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a thorough self-review of the refactored code
- [ ] I have commented my code, particularly in complex areas
- [ ] I have updated documentation if needed
- [ ] I have run `poetry run task lint` and fixed any issues
- [ ] I have run `poetry run task test` and all tests pass
- [ ] My commits follow the [conventional commits](https://www.conventionalcommits.org/) style 

================================================
FILE: .github/PULL_REQUEST_TEMPLATE/release.md
================================================
# Release Pull Request

## Version
<!-- Specify the new version number (e.g., 1.4.0) -->

## Release Date
<!-- Proposed date for this release -->

## Release Type
- [ ] Major (breaking changes)
- [ ] Minor (new features, non-breaking)
- [ ] Patch (bug fixes, non-breaking)

## Change Summary
<!-- Provide a high-level summary of the changes in this release -->

## Key Changes
<!-- List the major changes/features included in this release -->

## Breaking Changes
<!-- If applicable, list all breaking changes and migration instructions -->

## Dependencies
<!-- List any new or updated dependencies -->

## Deprecations 
- While `get_element_text()` is still supported, it is **recommended** to use the new async property `element.text`.


## Documentation
<!-- Link to updated documentation -->

## Release Checklist
- [ ] Version number updated in pyproject.toml
- [ ] Version number updated in cz.yaml
- [ ] CHANGELOG.md updated with all changes
- [ ] All tests passing
- [ ] Documentation updated
- [ ] API reference updated
- [ ] Breaking changes documented
- [ ] Migration guides prepared (if applicable)

## Additional Release Notes
<!-- Any additional information that should be included in release notes --> 

================================================
FILE: .github/pull_request_template.md
================================================
<!-- 
Please choose the appropriate PR template for your change:

For bug fixes: .github/PULL_REQUEST_TEMPLATE/bug_fix.md
For refactoring: .github/PULL_REQUEST_TEMPLATE/refactoring.md
For releases: .github/PULL_REQUEST_TEMPLATE/release.md

Or use this general template for other types of changes.
-->

# Pull Request

## Description
<!-- Provide a clear and concise description of what this PR accomplishes -->

## Related Issue(s)
<!-- Link the issues that are being addressed by this PR. Use the format: "Fixes #123" or "Resolves #123" -->

## Type of Change
<!-- Check the appropriate options that apply to this PR -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation update
- [ ] Refactoring (no functional changes, no API changes)
- [ ] Performance improvement
- [ ] Tests (adding missing tests or correcting existing tests)
- [ ] Build or CI/CD related changes

## How Has This Been Tested?
<!-- Describe the tests you ran to verify your changes. Provide instructions so reviewers can reproduce. -->

```python
# Include code examples if relevant
```

## Testing Checklist
<!-- Check the testing aspects that apply to your change -->
- [ ] Unit tests added/updated
- [ ] Integration tests added/updated
- [ ] All existing tests pass

## Screenshots
<!-- If applicable, add screenshots to help explain your changes -->

## Implementation Details
<!-- Provide any important details or context about the implementation -->

## API Changes
<!-- If applicable, describe any API changes -->

## Additional Info
<!-- Any additional information that might be useful for reviewers -->

## Checklist before requesting a review
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] I have run `poetry run task lint` and fixed any issues
- [ ] I have run `poetry run task test` and all tests pass
- [ ] My commits follow the [conventional commits](https://www.conventionalcommits.org/) style 

================================================
FILE: .github/workflows/deploy-docs.yml
================================================
name: Deploy site + docs

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Code Checkout
        uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.x'

      - name: Install Dependencies
        run: |
          python -m pip install --upgrade pip
          pip install mkdocs mkdocs-material pymdown-extensions mkdocstrings[python] mkdocs-static-i18n

      # Build MkDocs em pasta temporária
      - name: Build MkDocs into temp folder
        run: mkdocs build --site-dir temp_docs

      # Criar estrutura final do site
      - name: Prepare final site
        run: |
          mkdir -p site/docs
          mkdir -p site/images
          cp -r temp_docs/* site/docs/
          cp -r public/* site/

      - name: Deploy to GitHub Pages
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./site
          cname: pydoll.tech


================================================
FILE: .github/workflows/mypy.yml
================================================
name: MyPy CI

on:
  push:
    branches:
      - '*'         # matches every branch that doesn't contain a '/'
      - '*/*'       # matches every branch containing a single '/'
      - '**'        # matches every branch
  pull_request:

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      max-parallel: 4
      matrix:
        python-version: ["3.11"]

    steps:
      - uses: actions/checkout@v2

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install Dependencies
        run: |
          python -m pip install --upgrade pip
          python -m pip install mypy
          python -m pip install -e .
          python -m mypy --install-types --non-interactive pydoll 

      - name: mypy
        run: python -m mypy .


================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish to PyPI (Poetry)

on: workflow_dispatch

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.10"

      - name: Install Poetry
        run: |
          python -m pip install --upgrade pip
          pip install poetry

      - name: Configure Poetry
        run: poetry config pypi-token.pypi ${{ secrets.PYPI_API_TOKEN }}

      - name: Install dependencies
        run: poetry install

      - name: Build package
        run: poetry build

      - name: Publish to PyPI
        run: poetry publish


================================================
FILE: .github/workflows/release.yml
================================================
name: Release
on: workflow_dispatch

jobs:
  version-cz:
    runs-on: ubuntu-latest
    name: "Version CZ"
    outputs:
      version: ${{ steps.cz.outputs.version }}

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          token: ${{ secrets.GITHUB_TOKEN }}

      - id: cz
        name: Create bump and changelog
        uses: commitizen-tools/commitizen-action@master
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}

      - name: Print Version
        run: echo "Bumped to version ${{ steps.cz.outputs.version }}"
  
  version-pyproject:
    runs-on: ubuntu-latest
    name: "Version Pyproject"
    needs: version-cz
    outputs:
      version: ${{ needs.version-cz.outputs.version }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Install Poetry
        run: |
          curl -sSL https://install.python-poetry.org | python3 -
          export PATH="$HOME/.local/bin:$PATH"

      - name: Update Poetry version in pyproject.toml
        run: |
          git config --global user.name "github-actions[bot]"
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
          poetry version "${{ needs.version-cz.outputs.version }}"
          git add pyproject.toml
          git commit -m "Update pyproject.toml to version ${{ needs.version-cz.outputs.version }}"
          git pull --rebase
          git push

      - name: Update poetry.lock
        continue-on-error: true
        run: |
          git config --global user.name "github-actions[bot]"
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
          poetry lock
          git add poetry.lock
          git commit -m "Update poetry.lock"
          git pull --rebase
          git push


  release:
    name: Release
    needs: version-pyproject
    runs-on: ubuntu-latest
    steps:
      - name: Create Release
        uses: softprops/action-gh-release@v1
        with:
          draft: false
          prerelease: false
          generate_release_notes: true
          tag_name: ${{ needs.version-pyproject.outputs.version }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/ruff-ci.yml
================================================
name: Ruff CI

on:
  push:
    branches:
      - '*'         # matches every branch that doesn't contain a '/'
      - '*/*'       # matches every branch containing a single '/'
      - '**'        # matches every branch
  pull_request:

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      max-parallel: 4
      matrix:
        python-version: ["3.11"]

    steps:
      - uses: actions/checkout@v2

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install Dependencies
        run: |
          python -m pip install --upgrade pip
          python -m pip install ruff==0.7.1

      - name: ruff
        run: python -m ruff check .


================================================
FILE: .github/workflows/tests.yml
================================================
name: PyDoll Tests

on:
  push:
  pull_request:

jobs:
  tests:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest]
        python-version: ["3.10", "3.11", "3.12", "3.13"]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install dependencies
        run: |
          python -m pip install poetry
          poetry install
      - name: Install Chrome
        uses: browser-actions/setup-chrome@v1
        with:
          chrome-version: 132
      - name: Run tests with coverage
        run: |
          poetry run pytest -s -x --cov=pydoll -vv --cov-report=xml

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v5
        with:
          file: ./coverage.xml
          flags: tests
          name: PyDoll Tests
          fail_ci_if_error: true
          token: ${{ secrets.CODECOV_TOKEN }}


================================================
FILE: .gitignore
================================================
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/


# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
#   For a library or package, you might want to ignore these files since the code is
#   intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# poetry
#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
#   This is especially recommended for binary packages to ensure reproducibility, and is more
#   commonly ignored for libraries.
#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
#   in version control.
#   https://pdm.fming.dev/latest/usage/project/#working-with-version-control
.pdm.toml
.pdm-python
.pdm-build/

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
#  and can be added to the global gitignore or merged into this file.  For a more nuclear
#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

.czrc
.ruff_cache/

# Dev test file
dev_test_file.py


================================================
FILE: .python-version
================================================
3.12.5


================================================
FILE: CHANGELOG.md
================================================
## 2.21.3 (2026-03-14)

### Fix

- **test**: improve OOPIF integration test reliability
- **iframe**: resolve nested OOPIF iframes inside shadow roots

## 2.21.2 (2026-03-12)

### Fix

- release commit

## 2.21.1 (2026-03-03)

### Fix

- **keyboard**: send correct key, code and keycode in type_text
- **elements**: fix humanized interactions inside iframes
- humanized scroll overshoot correction causes infinite loop

## 2.21.0 (2026-03-01)

### Feat

- **interactions**: change humanize default from True to False

### Fix

- **elements**: forward humanize flag to click in type_text

## 2.20.2 (2026-02-18)

### Fix

- **command**: increase default command timeout from 10s to 60s across multiple components
- **tab**: remove temporary flag to avoid duplicate callback removal

## 2.20.1 (2026-02-16)

### Fix

- **tab**: replace readyState polling with CDP events in navigation

## 2.20.0 (2026-02-13)

### Feat

- **mouse**: add timing property for runtime configuration
- **requests**: add record() and replay() to Request class
- **requests**: add HAR network recorder
- **protocol**: add HAR 1.2 type definitions

### Fix

- **requests**: use surgical callback removal instead of nuclear clear_callbacks

### Refactor

- **tab**: extract bundle static methods to utils module

## 2.19.0 (2026-02-12)

### Feat

- **interactions**: default humanize=True for keyboard type_text
- **elements**: integrate Mouse API into WebElement.click()
- **interactions**: add Mouse API with humanized simulation
- **browser**: add webrtc_leak_protection property to ChromiumOptions
- **browser**: add automatic User-Agent consistency override

### Fix

- **utils**: harden SOCKS5 proxy forwarder security and robustness

## 2.18.0 (2026-02-11)

### Feat

- **utils**: add SOCKS5 proxy forwarder and convert utils to package
- **elements**: add cross-iframe selector support for XPath and CSS

## 2.17.0 (2026-02-08)

### Feat

- **tab**: refactor cloudflare bypass to use shadow root traversal
- **elements**: add shadow root timeout, CSS restriction and context propagation
- **tab**: add find_shadow_roots with OOPIF traversal and timeout
- **elements**: add shadow DOM support

### Fix

- **docs**: replace shadow.find() with query() in all documentation
- **tests**: replace shadow.find() with query() in integration tests
- **elements**: use float timeout and add contextual WaitElementTimeout messages

## 2.16.0 (2026-02-06)

### Feat

- add clear method for input and enhance page load state handling

### Fix

- **browser**: support secure websocket connections

## 2.15.1 (2026-01-04)

### Fix

- filter Symbol properties from element query results

## 2.15.0 (2025-12-24)

### Feat

- Implement incognito mode cookie retrieval for `tab.get_cookies()` and update related documentation

### Fix

- inconsistence in type checking
- Dispatch `KEY_DOWN` and `KEY_UP` events for character typing

## 2.14.0 (2025-12-10)

### Feat

- get_tab_by_target method added
- get_tab_by_target method added

### Fix

- adding type: ignore in JavascriptDialogOpeningEvent object
- adding type: ignore in JavascriptDialogOpeningEvent object

## 2.13.1 (2025-12-07)

### Fix

- add stuck scroll detection and minimum flick distance to humanized scroll, and correct scroll distance calculation.

## 2.13.0 (2025-12-07)

### Feat

- Implement humanized keyboard typing and physics-based scroll, and add iframe interaction support.

## 2.12.4 (2025-11-29)

### Fix

- optimize iframe resolution logic by adjusting backend node ID checks and enhancing child frame handling
- refine OOPIF resolution and frame attachment logic for improved handling of backend node IDs
- enhance OOPIF target attachment logic for improved session handling

## 2.12.3 (2025-11-27)

### Fix

- improve frame retrieval logic for better session handling

## 2.12.2 (2025-11-19)

### Fix

- adjust find_elements_mixin.py to refine return types and defaults

## 2.12.1 (2025-11-14)

### Fix

- continue cleanup process if temporary directory still exists
- adjust sleep duration for Windows and enhance temp dir cleanup
- enhance error handling for locked files on Windows systems
- remove unnecessary retry_times parameter in file processing
- ensure temp directory cleanup handles Chromium locked files
- enhance element selection and text extraction for better stability
- handle oopif targets
- change way to interact with iframes

### Refactor

- refactor iframe context handling in FindElementsMixin class

### Perf

- update Chrome options for better memory management and stability

## 2.12.0 (2025-11-04)

### Feat

- **execute_script**: validate element argument usage
- **tab,element,chrome**: revert arguments and add Chromium paths
- add a retry decorator for handling function execution failures

### Fix

- import TopLevelTargetRequired in test_browser_tab.py
- allow one additional retry attempt in the retry decorator

### Refactor

- **tab,element**: simplify execute_script parameters
- **element**: move and enhance execute_script from tab
- **tab**: separate execute_script concerns and enhance with comprehensive options

## 2.11.0 (2025-11-02)

### Feat

- add input handling functions and key constants for editing
- add KeyboardAPI for simulating keyboard input actions
- add KeyboardAPI integration for enhanced keyboard control

### Fix

- enhance text insertion and deprecate legacy key methods

## 2.10.0 (2025-11-01)

### Feat

- add ScrollAPI for enhanced page scrolling capabilities

## 2.9.3 (2025-10-30)

### Refactor

- keep take_screenshot consistent
- refactor type hints for better clarity and future compatibility

## 2.9.2 (2025-10-19)

### Fix

- update process creation to capture output and clean proxy format
- preserve query and fragment in WebSocket URL for tabs

### Refactor

- remove debug logging for request status and network events
- refactor logger messages to use consistent single quotes
- fix merge conflicts
- add logging for browser lifecycle and context management events
- refactor proxy parsing logic for improved clarity and efficiency

## 2.9.1 (2025-10-15)

### Fix

- change download event handling to use PageEvent instead of BrowserEvent

### Refactor

- use early return in setup proxy method

## 2.9.0 (2025-10-05)

### Feat

- add configurable page load state

## 2.8.2 (2025-10-03)

### Fix

- implement proxy authentication handling for browser tabs
- map exception when try to take screenshot of an iframe

## 2.8.1 (2025-09-27)

### Fix

- store the opened tab in the _tabs_opened dictionary
- **elements**: correctly detect parenthesized XPath expressions

### Refactor

- simplify FindElementsMixin._get_expression_type startswith checks into single tuple

## 2.8.0 (2025-08-28)

### Feat

- adding get_siblings_elements method
- adding get_children_elements method
- refactor Tab class to support optional WebSocket address handling
- add WebSocket connection support for existing browser instances
- add optional WebSocket address support in connection handler

### Fix

- add get siblings and get childen methods a raise_exc option
- improving children and parent retrive docstring and creating a private generic method for then
- using new execute_script public method
- solving conflicts
- rename pages fixtures files and adding a error test

### Refactor

- refactor Tab class to improve initialization and error handling
- refactor Browser class to manage opened tabs and WebSocket setup
- add new exception classes for connection and WebSocket errors

## 2.7.0 (2025-08-22)

### Feat

- refactor WebElement methods to use a unified naming convention
- add Response type and new bring_to_front method to Tab class
- improve element interactability scripts

### Fix

- **browser**: add google-chrome-stable path for Arch Linux AUR package
- run actions to fix badges
- enforce combined condition logic in wait_until
- **web_element**: raise WaitElementTimeout on wait_until timeout

### Refactor

- update command responses to use Response for empty responses
- **webelement**: simplify wait_until condition mapping

## 2.6.0 (2025-08-10)

### Feat

- add DownloadTimeout exception for file download timeouts
- add context manager for handling file downloads in Tab class

### Refactor

- add type checking for connection handler in mixin class
- add type overloads for event callback in Browser class

## 2.5.0 (2025-08-07)

### Feat

- add HTTP client functionality using the browser's fetch API
- add HTTP response object for browser-based fetch requests
- implement Request class for HTTP requests using fetch API
- add Request handling and improve network log retrieval methods

### Fix

- reject cookies with empty names during parsing in Request class
- refactor imports to include NotRequired and TypedDict from typing_extensions
- update imports to use typing_extensions for compatibility reasons
- check for None in events_enabled before updating params
- remove unused event type aliases and clean up imports

### Refactor

- depreciating headless argument in start method and adding it in to browser options properties
- add asynchronous function for makeRequest in JavaScript
- refactor imports for cleaner organization and improved clarity
- refactor type hints in FindElementsMixin for clarity and type safety
- refactor type hints and improve command method signatures
- refactor event handling to use specific event types for clarity
- refactor connection handler to use CDPEvent and typed commands
- refactor storage command methods to return specific command types
- refactor target command methods to use specific command types
- refactor command return types to specific command classes
- refactor page commands to use specific command types directly
- refactor network commands to use specific command types
- refactor input command methods to return specific command types
- refactor fetch_commands to use updated type definitions
- refactor enums to inherit from str for better compatibility
- refactor DOM command types for improved code clarity and structure
- refactor command and event parameter types for better typing
- refactor command responses to use EmptyResponse where applicable
- improve protocol types for target domain
- improve protocol types for storage domain
- refactor command response types for improved readability and consistency
- improve protocol types for page domain
- add IncludeWhitespace and RelationType enums to DOM types
- improve protocol types for input domain
- refactor AuthChallengeResponse and remove legacy definitions
- remove legacy WindowBoundsDict for cleaner type definitions
- add new TypedDicts and enums for runtime event parameters
- refactor DOM event types and methods for better clarity and structure
- refactor fetch command return types for better clarity and structure
- enhance browser command functionality with new methods and types
- add TypedDict and Enum definitions for emulation and debugging
- improve protocol types for network domain

## 2.4.0 (2025-08-01)

### Feat

- changing bool prefs to properties and adding support to user-data-dir preferences
- adding prefs options customization
- add overloads for find and query methods in FindElementsMixin
- add method to retrieve parent element and its attributes
- implements start_timeout option

### Fix

- adding typehint and fixing some codes
- removing options preferences private attributes
- set default URL to 'about:blank' in create_target method
- change navigation when creating a new tab
- add type hinting support and update project description

### Refactor

- remove redundant asterisk from find method overloads and reorganize query method overloads
- refine type hint for response parameter and improve key check

## 2.3.1 (2025-07-12)

### Fix

- refactor click_option_tag to use direct script reference
- update script to use closest for more reliable DOM selection
- improve selection script for higher accuracy
- use correct class name and id selector in query()
- add fetch command methods to handle request processing

### Refactor

- change body type from dict to string in fetch command parameters
- refactor continue_request and fulfill_request to use options
- enhance continue_request and fulfill_request with new options

## 2.3.0 (2025-06-25)

### Feat

- **connection**: Upgrade adapt websockets version to 14.0

### Fix

- refine selector condition to include attributes check

## 2.2.3 (2025-06-20)

### Fix

- fix contextmanager for file upload

## 2.2.2 (2025-06-18)

### Fix

- fix call_function_on parameters order

### Refactor

- replace BeautifulSoup with custom HTML text extractor

## 2.2.1 (2025-06-16)

### Fix

- fix call parameters order in call_function_on method

## 2.2.0 (2025-06-15)

### Feat

- add method to retrieve non-extension opened tabs as Tab instances

### Refactor

- refactor attribute assignments to include type annotations
- implement singleton pattern for Tab instances by target_id

## 2.1.0 (2025-06-14)

### Feat

- add new script-related exception classes for better handling
- add functions to clean scripts and check return statements
- add methods to retrieve network response body and logs

### Fix

- click in the input before typing and fix documentation

### Refactor

- add overloads for execute_script to improve type safety

## 2.0.1 (2025-06-08)

### Fix

- fix private proxy configuration

## 2.0.0 (2025-06-08)

### BREAKING CHANGE

- pydoll v2 finished

### Feat

- intuitive way to interact with iframes
- refactor Keys class to Key and add utility methods for enums
- add Event TypedDict for standardized event structure
- add TargetEvent enum for Chrome DevTools Protocol events
- add StorageEvent enumeration for Chrome DevTools Protocol events
- add RuntimeEvent enumeration for Chrome DevTools Protocol events
- add PageEvent enumeration for Chrome DevTools Protocol events
- add NetworkEvent enumeration for Chrome DevTools Protocol events
- add InputEvent enum for Chrome DevTools input events
- add FetchEvent enumeration for Chrome DevTools Protocol events
- add DomEvent enumeration for Chrome DevTools Protocol events
- add BrowserEvent enum for Chrome DevTools protocol events
- add methods to enable and disable the runtime domain commands
- add new enums for whitespace, axes, pseudo types, and modes
- add DOM response types and corresponding response classes
- add DOM command types and parameter definitions for pydoll
- add enums for key, mouse, touch, and drag event types
- add input command types for touch, mouse, and keyboard events
- enhance TargetCommands class with new methods for targets management
- add TypedDicts for target response types and browser contexts
- add TypedDict definitions for target command parameters
- add storage-related enumerations for bucket durability and types
- enhance StorageCommands with new methods for data management
- add storage response types and related classes for handling data
- add storage command types using TypedDict for structured params
- add new enumeration classes for serialization and object types
- add runtime response types for handling various object previews
- add initial runtime command types for protocol handling
- add constants for various encoding, formats, and policies
- add TypedDict definitions for page response types and results
- add typed dictionaries for various page command parameters
- add new command parameter classes for network resource handling
- add TypedDict definitions for network response types
- organize command types into structured imports and exports
- add network command types and parameters for cookie management
- add enums for cookie priorities, connection types, and encodings
- add response classes for browser window target retrieval
- setup mkdocs and install related packages
- add async text property for retrieving element text

### Fix

- remove target directory from .gitignore file
- fix typo in USB_UNRESTRICTED constant for consistency
- add new network command parameters and methods for cookies
- change postData type from dict to string in ContinueRequestParams

### Refactor

- refactor screenshot path handling and enhance error checking
- refactor type hints from List to built-in list for consistency
- refine XPath condition handling and ensure integer coordinates
- refactor condition checks to ensure against None values
- refactor exception handling and add browser path validation function
- rename BrowserOptionsManager to ChromiumOptionsManager
- refactor Edge class to use ChromiumOptionsManager and simplify path validation
- refactor Chrome class to use Chromium-specific options manager
- refactor Browser class to use options manager and improve methods
- refactor Options class to ChromiumOptions and use type hints
- refactor to create ChromiumOptionsManager for better clarity
- add abstract base classes for browser options management
- use `message.get('id')` for safer ID checks in response
- refactor message handling to support multiple message types
- refactor element finding methods for enhanced flexibility and clarity
- rename method for better clarity in captcha element handling
- refactor type hints for event callback parameters and options
- simplify ping call by inlining WebSocketClientProtocol cast
- refactor EventsManager to use typed Event objects consistently
- add runtime events management to the Tab class functionality
- update event callback signatures for better type handling
- remove unused import of Response in runtime_commands.py
- add Response import to page_commands for improved functionality
- refactor response classes to use TypedDict for better typing
- refactor WebElement class to organize exception imports clearly
- refactor exception handling in FindElementsMixin class
- refactor exception handling to use custom timeout and connection errors
- remove unused import statements in events_manager.py
- refactor error handling to use specific exceptions for clarity
- refactor error handling to use custom exception for arguments
- fix PermissionError raising in TempDirectoryManager class
- refactor error handling to use specific exceptions for clarity
- handle unsupported OS with a custom exception in Edge class
- raise UnsupportedOS exception for unsupported operating systems
- refactor browser error handling and improve method return types
- refactor exception classes to improve organization and clarity
- refactor element finding methods to use updated command structure
- refactor WebElement class for improved structure and clarity
- refactor import statements and clean up code formatting
- refactor command imports and enhance download behavior method
- refactor Tab import and update FetchCommands method calls
- refactor ConnectionHandler docstrings for clarity and conciseness
- refactor command and event managers for improved type safety
- refactor ConnectionHandler to improve WebSocket management and clarity
- add Tab class for managing browser tabs via CDP integration
- enhance TempDirectoryManager with detailed docstrings and type hints
- refactor ProxyManager to enhance proxy credential handling
- refactor Browser class to enhance automation capabilities and structure
- move commands to a different module
- define base structures for commands and responses in protocol
- import Rect from dom_commands_types for response handling
- refactor cookie-related types for improved clarity and consistency
- remove unnecessary whitespace in docstring of InputCommands class
- refactor DOM commands to improve structure and add functionality
- refactor InputCommands to enhance user input simulation methods
- add CookieParam TypedDict to define cookie attributes
- add new runtime command methods for JavaScript bindings and promises
- remove unused method to clear accepted encodings in network commands
- update ResetPermissionsParams to use NotRequired for context ID
- refactor PageCommands to improve structure and add type hints
- simplify import statements by using wildcard imports for responses
- add new response types and update existing response classes
- consolidate command imports using wildcard imports for clarity
- correct post_data type from dict to str in FetchCommands class
- refactor NetworkCommands to use structured command parameters
- refactor fetch command methods to use static methods directly
- refactor BrowserCommands to use static methods and improve clarity
- refactor response imports and update __all__ definitions
- refactor import statements for better readability and structure
- refactor import statements for consistency in response types
- refactor import and rename EnableParams to FetchEnableParams
- refactor import statement for CommandParams module path
- refactor fetch command templates to use Command class
- add enums for window states, download behaviors, and permissions
- remove unused enum imports and rename base_types module
- refactor command structures for better organization and clarity
- rename command and response modules for better clarity
- refactor imports for better organization and readability
- add browser command methods for version, permissions, and downloads
- add command and response types for protocol implementation
- refactor execute_command to use type annotations for clarity
- refactor command methods to specify response types in BrowserCommands
- refactor command structures and introduce base CommandParams class
- refactor browser command constants to use Command class type
- refactor connection imports and rename manager files for clarity
- refactor BrowserType import to a common constants module
- refactor browser modules to use the new chromium structure
- refactor element imports and remove deprecated element file
- refactor import paths to use the protocol submodule structure
- move command files to the protocol directory for better structure
- rename insert_text to paste_text and remove unused files
- refactor the `InputCommands` class to enhance clarity and simplicity in its operations
- add deprecation warning to get_element_text()

## 1.7.0 (2025-04-06)

### Feat

- refactor captcha handling with adjustable wait times and parameters

## 1.6.0 (2025-04-06)

### Feat

- add connect method to handle existing port scenarios
- create enable_auto_solve_cloudflare_captcha method
- add context manager to bypass Cloudflare Turnstile captcha

## 1.5.1 (2025-03-31)

### Fix

- handle headers input as list or dictionary in fetch command

## 1.5.0 (2025-03-26)

### Feat

- add flag to run browser on headless mode on start function

### Fix

- Wait for the file `CrashpadMetrics-active.pma` to be deoccupied and cleaned up
- Catch websockets.ConnectionClosed errors on duplicate close()
- move connection closed log inside if statement

## 1.4.0 (2025-03-23)

### Feat

- Update initialize_options method to allow optional browser_type parameter
- Refactor Edge browser options handling to use EdgeOptions class
- Supports initialization options based on browser type
- Edge browser constructors to support optional connection port parameters
- Add Microsoft Edge browser support
- 为 Edge 浏览器添加默认用户数据目录支持
- Add Microsoft Edge browser support

### Refactor

- Clean up imports and improve code formatting across browser modules
- Simplify user data directory setup and enhance Edge browser path handling

## 1.3.3 (2025-03-18)

### Fix

- solve browser invalid domain events issue
- improve process termination
- improve process management and deactivate websockets connection size limit

### Refactor

- import commands and evebts from __init__.py

## 1.3.2 (2025-03-13)

### Fix

- fixed the tests and used lint for the OS multi path support
- support multiple default Chrome paths on each OS

## 1.3.1 (2025-03-12)

### Fix

- remove unnecessary encoding from screenshot response data

## 1.3.0 (2025-03-12)

### Feat

- add method to retrieve screenshot as base64 encoded string

## 1.2.4 (2025-03-11)

### Fix

- refactor Chrome constructor to use Optional for parameters

## 1.2.3 (2025-03-11)

### Fix

- refactor proxy configuration retrieval for cleaner code flow

## 1.2.2 (2025-03-10)

### Fix

- Get file extension from file path and changes use of reserved word 'format' to 'fmt'

## 1.2.1 (2025-03-09)

### Fix

- resolve issue #29 where browser path was not found on macOS
- Quickstart code given in README is wrong

## 1.2.0 (2025-02-11)

### Feat

- add close method and command to Page class functionality

## 1.1.0 (2025-02-11)

### Feat

- add method to retrieve Page instance by its ID in Browser class

## 1.0.1 (2025-02-10)

### Fix

- add dialog property to ConnectionHandler and manage dialog state

## 1.0.0 (2025-02-05)

### BREAKING CHANGE

- now you'll have to use By.CSS_SELECTOR instead of By.CSS

### Feat

- refactor import and export statements for better readability
- update changelog for version 0.7.0 and fix dependency versions
- add ping method to ConnectionHandler for browser connectivity check
- add tests for BrowserCommands in test_browser_commands.py

### Fix

- add initial module files for commands, connection, events, and mixins
- add connection port parameter to Chrome browser initialization
- use deepcopy for templates to prevent mutation issues

### Refactor

- rename constant CSS to CSS_SELECTOR
- add command imports and remove obsolete connection handler code
- refactor methods to be static in ConnectionHandler class
- refactor proxy configuration and cleanup logic in Browser class
- refactor ConnectionHandler to improve WebSocket management logic
- refactor Browser class initialization for better clarity and structure
- refactor Browser initialization to enhance flexibility and defaults
- refactor import statement for ConnectionHandler module
- refactor import paths for ConnectionHandler in browser modules
- implement ConnectionHandler for WebSocket browser automation
- implement command and event management for asynchronous processing
- remove unnecessary logging for WebSocket address fetching
- refactor Chrome class to use BrowserOptionsManager for path validation
- implement proxy and browser management in the new managers module
- refactor Browser class to use manager classes for better structure
- refactor DOM command scripts for clarity and efficiency

## 0.7.0 (2024-12-09)

### Feat

- autoremove dialog from connection_handler when closed
- add handle_dialog method to PageCommands class
- add dialog handling methods to Page class
- add support for handling JavaScript dialog opening events
- refactor network response handling for base64 encoding support
- add clipping option for screenshots and implement element capture

### Fix

- index error on method get_dialog_message
- update screenshot format from 'jpg' to 'jpeg' for consistency
- handle potential IndexError when retrieving valid page targetId
- filter valid pages using URL condition instead of title check

### Refactor

- run ruff formatter to ensure code consistency
- run ruff formatter to ensure code consistency
- change screenshot format from PNG to JPG in commands and element

## 0.6.0 (2024-11-18)

### Feat

- add callback ID handling for page load events in Page class
- update event registration to return callback IDs and add removal
- refactor DOM commands to use object_id instead of node_id

### Fix

- refactor page navigation and loading logic for efficiency
- add page reload after navigating to a new URL in Page class
- refactor URL navigation to use evaluate_script for efficiency
- implement page refresh on URL unchanged and add navigation event
- update object ID reference in Page class for clarity
- refactor element search logic to simplify error handling
- DomCommands using `object_id` instead of `node_id` to prevent bugs
- handle OSError when cleaning up temporary directories in Browser

### Refactor

- change error log to warning for missing callback ID
- refactor DOM command scripts for improved readability and reuse
- rename methods for clarity and consistency in WebElement class
- refactor parameter names for consistency in target methods
- normalize variable naming for consistency in fetch commands

## 0.5.1 (2024-11-12)

### Fix

- simplify outer HTML retrieval for consistent object handling
- refactor click method to check option tag earlier in flow
- refactor bounding box retrieval to access nested response value
- handle KeyError instead of IndexError for element bounds retrieval
- enhance DOM command methods and rename for clarity and consistency
- add JavaScript bounding box retrieval for web elements
- remove redundant top-checks for element clicks in WebElement

## 0.5.0 (2024-11-11)

### Feat

- add method to generate command for calling a function on an object
- implement script execution and visibility checks in click method
- add JavaScript functions for element visibility and interaction

### Refactor

- enhance exception classes with descriptive error messages
- simplify command creation by using RuntimeCommands.evaluate_script
- refactor JavaScript execution and introduce runtime commands

## 0.4.4 (2024-11-11)

### Fix

- remove redundant DOM content loaded event handling logic

## 0.4.3 (2024-11-11)

### Fix

- rename event variables for clarity and improve timeout handling

### Refactor

- remove debug print statement from connection event handling

## 0.4.2 (2024-11-11)

### Fix

- update event handling to use DOM_CONTENT_LOADED for page load
- convert Browser context management to async methods

### Refactor

- fix string formatting in logger info message for clarity

## 0.4.1 (2024-11-08)

### Fix

- fixes workflow removing unnecessary hifen
- reduce sleep duration in key press handling for improved speed

## 0.4.0 (2024-11-08)

### Feat

- add type_keys method for realistic key input simulation

## 0.3.1 (2024-11-08)

### Fix

- addning new package version
- removing encode utf8 in get_pdf_base64

## 0.3.0 (2024-11-08)

### Feat

- set_download_path added in browser class methods

## 0.2.0 (2024-11-08)

### Feat

- dynamic lib version using pyproject

## 0.1.1 (2024-11-07)

### Fix

- ensure browser process terminates after executing close command

## 0.1.0 (2024-11-07)

### Feat

- add method to delete all cookies from the browser session
- add is_enabled property to check element's enabled status
- add option to raise exception in wait_element method
- add method to set browser download path via command
- refactor text extraction using BeautifulSoup for accuracy
- add method to get properties and improve XPath handling
- refactor text retrieval methods and improve code readability
- add timeout parameter to page navigation and loading methods
- add cookie management and scroll into view functionality
- add method to retrieve page PDF data as base64 string
- add async property to retrieve inner HTML of the element
- add async page_source property to retrieve page source code
- add async property to retrieve the current page URL
- add method to find multiple DOM elements using selectors
- refactor WebElement to use FindElementsMixin for clarity
- add FindElementsMixin for asynchronous DOM element handling
- add methods to retrieve network response bodies from logs
- add method to retrieve matching network logs from the page
- add cookie management methods to the Browser class
- add ElementNotFound exception to handle missing elements
- add value property and handle option tag clicks in WebElement
- rename FIND_ELEMENT_XPATH_TEMPLATE to EVALUATE_TEMPLATE
- add exception handling for element not found in find_element method
- downgrade Python version requirement to 3.10 in pyproject.toml
- add async function to fetch browser WebSocket address
- simplify text input handling by using insert_text command
- add TargetCommands class for managing target operations
- add method to generate command for disabling the Page domain
- add method to generate text insertion commands for inputs
- add Page class to manage browser page interactions and events
- add page management methods to the Browser class
- add detailed logging for command responses and event handling
- add event classes for browser, DOM, fetch, and network actions
- add NetworkCommands class for managing network operations
- implement fetch command methods for handling requests and responses
- add method to enable DOM domain events in DomCommands class
- add proxy configuration and fetch event handling to Browser
- refactor connection errors to use custom exceptions for clarity
- add methods to clear callbacks and close WebSocket connection
- remove unnecessary newline at the end of PageEvents class file
- add context managers and async file handling for efficiency
- implement singleton pattern and prevent multiple initializations
- add dynamic connection port handling for browser instance
- add temporary directory management for browser session storage
- add logging for connection events and command executions
- add PageEvents class with PAGE_LOADED event constant
- add temporary callback option to event registration method
- add page event handling and improve loading timeout management
- add utility function to decode base64 images to bytes
- add WebElement class for handling browser elements asynchronously
- add enumeration for selector types in constants module
- add PageCommands class for browser page control functions
- add InputCommands class for handling mouse and keyboard events
- implement DOM commands for interacting with web elements
- refactor BrowserCommands to include new window management methods
- implement some basic methods to navigate and control the browser instance
- enhance ConnectionHandler with detailed docstrings for methods
- add .gitignore, .python-version, and poetry.lock files

### Fix

- browser context now uses the storage commands to get cookies, while the page context us cookies, while page context uses network
- update cookie retrieval to use NetworkCommands for consistency
- remove download path method from Browser and add to Page class
- add options to disable first-run and browser check flags
- handle KeyError when retrieving network response bodies
- use get() to safely retrieve attributes in WebElement class
- rename class attribute retrieval for clarity and consistency
- enhance get_properties and simplify text retrieval method
- enhance create_web_element call with additional value parameter
- fix incorrect key access in JavaScript evaluation result
- update cookie management to clear browser cookies correctly
- filter pages by title instead of URL in Browser class
- filter out non-page entries when fetching valid page IDs
- xpath element solved
- refactor event callback storage to use unique callback IDs
- add JavaScript execution method and enhance click offsets
- simplify response handling and improve event callback structure
- reorder page event enabling to ensure proper browser startup
- add JSON handling and improve WebSocket command execution

### Refactor

- improve WebElement representation and handle None for nodeValue
- add newline at end of file for ElementNotFound exception class
- remove unused aiohttp import and clean up whitespace
- remove unnecessary blank lines in storage.py for clarity
- fix missing newline at the end of the file in page.py
- remove unnecessary whitespace in InputCommands class methods
- refactor DOM command methods for improved clarity and usability
- refactor Page class to inherit from FindElementsMixin
- refactor code to remove duplicate import of StorageCommands
- clarify error messages for command and callback validation
- refactor ConnectionHandler to simplify initialization and connect logic
- remove unnecessary whitespace in element.py for cleaner code
- refactor WebElement to enhance attribute retrieval methods
- refactor connection handling and improve error messaging
- refactor Browser class to use abstract base class and commands


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing Guide

Thank you for your interest in contributing to the project! This document provides guidelines and instructions to help you contribute effectively.

## Table of Contents

- [Environment Setup](#environment-setup)
- [Development Workflow](#development-workflow)
- [Code Standards](#code-standards)
- [Testing](#testing)
- [Commit Messages](#commit-messages)
- [Pull Request Process](#pull-request-process)

## Environment Setup

### Prerequisites

- Python 3.10 or higher
- [Poetry](https://python-poetry.org/docs/#installation) for dependency management

### Installation

1. Clone the repository:
   ```bash
   git clone [REPOSITORY_URL]
   cd pydoll
   ```

2. Install dependencies using Poetry:
   ```bash
   poetry install
   ```

3. Activate the virtual environment:
   ```bash
   poetry shell
   ```

## Development Workflow

1. Create a new branch for your contribution:
   ```bash
   git checkout -b feature/your-feature-name
   ```
   or
   ```bash
   git checkout -b fix/your-fix-name
   ```

2. Make your changes following the code and testing guidelines.

3. Check your code using the linter:
   ```bash
   poetry run task lint
   ```

4. Format your code:
   ```bash
   poetry run task format
   ```

5. Run the tests to ensure everything is working:
   ```bash
   poetry run task test
   ```

6. Commit your changes following the commit conventions (see below).

7. Push your changes and open a Pull Request.

## Code Standards

This project uses [Ruff](https://github.com/charliermarsh/ruff) for linting and code formatting. The code standards are defined in the `pyproject.toml` file.

### Linting and Formatting

To check if your code follows the standards:

```bash
poetry run task lint
```

To automatically fix some issues and format your code:

```bash
poetry run task format
```

**Important:** Make sure to resolve all linting issues before submitting your changes. Code that doesn't pass the linting checks will not be accepted.

## Testing

### Writing Tests

For each new feature or modification, it is **mandatory** to write corresponding tests. We use `pytest` for testing.

- Tests should be placed in the `tests/` directory
- Test file names should start with `test_`
- Test function names should start with `test_`

### Running Tests

To run all tests:

```bash
poetry run task test
```

This will also generate a code coverage report (HTML) that can be viewed in the `htmlcov/` folder.

## Commit Messages

This project follows the [Conventional Commits](https://www.conventionalcommits.org/) standard for commit messages. We use the `commitizen` tool to facilitate the creation of standardized commits.

### Commit Message Structure

```
<type>[optional scope]: <description>

[optional body]

[optional footer(s)]
```

### Commit Types

- **feat**: A new feature
- **fix**: A bug fix
- **docs**: Documentation-only changes
- **style**: Changes that do not affect the meaning of the code (whitespace, formatting, etc.)
- **refactor**: A code change that neither fixes a bug nor adds a feature
- **perf**: A code change that improves performance
- **test**: Adding or correcting tests
- **build**: Changes that affect the build system or external dependencies
- **ci**: Changes to CI configuration files
- **chore**: Other changes that don't modify src or test files

### Examples of Good Commit Messages

```
feat(parser): add ability to parse arrays
```

```
fix(networking): resolve connection timeout issue

A problem was identified in the networking library that
caused unexpected timeouts. This change increases the
default timeout from 10s to 30s.
```

## Pull Request Process

1. Verify that your code passes all tests and linting checks.
2. Push your branch to the repository.
3. Open a Pull Request to the main branch.
4. In the PR description, clearly explain what was changed and why.
5. Link any related issues to your PR.
6. Wait for the code review. Read the comments and make necessary changes.

## Questions?

If you have questions or need help, open an issue in the repository or contact the project maintainers.

---

We appreciate your contributions to make this project better! 

================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright © 2025 AutoscrapeLabs

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: README.md
================================================
<p align="center">
    <img src="https://github.com/user-attachments/assets/2c380638-b04a-4b04-b1c8-2958e4237a94" alt="Pydoll Logo" /> <br>
</p>
<p align="center">Async-native, fully typed, built for evasion and performance.</p>

<p align="center">
    <a href="https://github.com/autoscrape-labs/pydoll/stargazers"><img src="https://img.shields.io/github/stars/autoscrape-labs/pydoll?style=social"></a>
    <a href="https://codecov.io/gh/autoscrape-labs/pydoll" >
        <img src="https://codecov.io/gh/autoscrape-labs/pydoll/graph/badge.svg?token=40I938OGM9"/>
    </a>
    <img src="https://github.com/autoscrape-labs/pydoll/actions/workflows/tests.yml/badge.svg" alt="Tests">
    <img src="https://github.com/autoscrape-labs/pydoll/actions/workflows/ruff-ci.yml/badge.svg" alt="Ruff CI">
    <img src="https://github.com/autoscrape-labs/pydoll/actions/workflows/mypy.yml/badge.svg" alt="MyPy CI">
    <img src="https://img.shields.io/badge/python-%3E%3D3.10-blue" alt="Python >= 3.10">
    <a href="https://deepwiki.com/autoscrape-labs/pydoll"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
</p>

<p align="center">
    <a href="https://pydoll.tech/">Documentation</a> &middot;
    <a href="#getting-started">Getting Started</a> &middot;
    <a href="#features">Features</a> &middot;
    <a href="#support">Support</a>
</p>

Pydoll automates Chromium-based browsers (Chrome, Edge) by connecting directly to the Chrome DevTools Protocol over WebSocket. No WebDriver binary, no `navigator.webdriver` flag, no compatibility issues.

It combines a high-level API for common tasks with low-level CDP access for fine-grained control over network, fingerprinting, and browser behavior. The entire codebase is async-native and fully type-checked with mypy.

### Top Sponsors

<a href="https://substack.thewebscraping.club/p/pydoll-webdriver-scraping?utm_source=github&utm_medium=repo&utm_campaign=pydoll">
    <img src="public/images/banner-the-webscraping-club.png" alt="The Web Scraping Club" />
</a>

<sub>Read a full review of Pydoll on <b><a href="https://substack.thewebscraping.club/p/pydoll-webdriver-scraping?utm_source=github&utm_medium=repo&utm_campaign=pydoll">The Web Scraping Club</a></b>, the #1 newsletter dedicated to web scraping.</sub>

### Sponsors

<table>
  <tr>
    <td><a href="https://www.thordata.com/?ls=github&lk=pydoll"><img src="public/images/Thordata-logo.png" height="30" alt="Thordata" /></a></td>
    <td><a href="https://dashboard.capsolver.com/passport/register?inviteCode=WPhTbOsbXEpc"><img src="public/images/capsolver-logo.png" height="40" alt="CapSolver" /></a></td>
    <td><a href="https://www.testmuai.com/?utm_medium=sponsor&utm_source=pydoll"><img src="public/images/logo-lamda-test.svg" height="30" width="130" alt="LambdaTest" /></a></td>
  </tr>
</table>

<sub>[Learn more about our sponsors](SPONSORS.md) &middot; [Become a sponsor](https://github.com/sponsors/thalissonvs)</sub>

### Why Pydoll

- **Stealth-first**: Human-like mouse movement, realistic typing, and granular [browser preference](https://pydoll.tech/docs/features/configuration/browser-preferences/) control for fingerprint management.
- **Async and typed**: Built on `asyncio` from the ground up, 100% type-checked with `mypy`. Full IDE autocompletion and static error checking.
- **Network control**: [Intercept](https://pydoll.tech/docs/features/network/interception/) requests to block ads/trackers, [monitor](https://pydoll.tech/docs/features/network/monitoring/) traffic for API discovery, and make [authenticated HTTP requests](https://pydoll.tech/docs/features/network/http-requests/) that inherit the browser session.
- **Shadow DOM and iframes**: Full support for [shadow roots](https://pydoll.tech/docs/deep-dive/architecture/shadow-dom/) (including closed) and cross-origin iframes. Discover, query, and interact with elements inside them using the same API.
- **Ergonomic API**: `tab.find()` for most cases, `tab.query()` for complex [CSS/XPath selectors](https://pydoll.tech/docs/deep-dive/guides/selectors-guide/).

## Installation

```bash
pip install pydoll-python
```

No WebDriver binaries or external dependencies required.

## What's New

<details>
<summary><b>HAR Network Recording</b></summary>
<br>

Record network activity during a browser session and export as HAR 1.2. Replay recorded requests to reproduce exact API sequences.

```python
from pydoll.browser.chromium import Chrome

async with Chrome() as browser:
    tab = await browser.start()

    async with tab.request.record() as capture:
        await tab.go_to('https://example.com')

    capture.save('flow.har')
    print(f'Captured {len(capture.entries)} requests')

    responses = await tab.request.replay('flow.har')
```

Filter by resource type:

```python
from pydoll.protocol.network.types import ResourceType

async with tab.request.record(
    resource_types=[ResourceType.FETCH, ResourceType.XHR]
) as capture:
    await tab.go_to('https://example.com')
```

[HAR Recording Docs](https://pydoll.tech/docs/features/network/network-recording/)
</details>

<details>
<summary><b>Page Bundles</b></summary>
<br>

Save the current page and all its assets (CSS, JS, images, fonts) as a `.zip` bundle for offline viewing. Optionally inline everything into a single HTML file.

```python
await tab.save_bundle('page.zip')
await tab.save_bundle('page-inline.zip', inline_assets=True)
```

[Screenshots, PDFs & Bundles Docs](https://pydoll.tech/docs/features/automation/screenshots-and-pdfs/)
</details>

<details>
<summary><b>Shadow DOM Support</b></summary>
<br>

Full Shadow DOM support, including closed shadow roots. Because Pydoll operates at the CDP level (below JavaScript), the `closed` mode restriction doesn't apply.

```python
shadow = await element.get_shadow_root()
button = await shadow.query('.internal-btn')
await button.click()

# Discover all shadow roots on the page
shadow_roots = await tab.find_shadow_roots()
for sr in shadow_roots:
    checkbox = await sr.query('input[type="checkbox"]', raise_exc=False)
    if checkbox:
        await checkbox.click()
```

Highlights:
- Closed shadow roots work without workarounds
- `find_shadow_roots()` discovers every shadow root on the page
- `timeout` parameter for polling until shadow roots appear
- `deep=True` traverses cross-origin iframes (OOPIFs)
- Standard `find()`, `query()`, `click()` API inside shadow roots

```python
# Cloudflare Turnstile inside a cross-origin iframe
shadow_roots = await tab.find_shadow_roots(deep=True, timeout=10)
for sr in shadow_roots:
    checkbox = await sr.query('input[type="checkbox"]', raise_exc=False)
    if checkbox:
        await checkbox.click()
```

[Shadow DOM Docs](https://pydoll.tech/docs/deep-dive/architecture/shadow-dom/)
</details>

<details>
<summary><b>Humanized Mouse Movement</b></summary>
<br>

Mouse operations produce human-like cursor movement by default:

- **Bezier curve paths** with asymmetric control points
- **Fitts's Law timing**: duration scales with distance
- **Minimum-jerk velocity**: bell-shaped speed profile
- **Physiological tremor**: Gaussian noise scaled with velocity
- **Overshoot correction**: ~70% chance on fast movements, then corrects back

```python
await tab.mouse.move(500, 300)
await tab.mouse.click(500, 300)
await tab.mouse.drag(100, 200, 500, 400)

button = await tab.find(id='submit')
await button.click()

# Opt out when speed matters
await tab.mouse.click(500, 300, humanize=False)
```

[Mouse Control Docs](https://pydoll.tech/docs/features/automation/mouse-control/)
</details>

## Getting Started

```python
import asyncio
from pydoll.browser import Chrome
from pydoll.constants import Key

async def google_search(query: str):
    async with Chrome() as browser:
        tab = await browser.start()
        await tab.go_to('https://www.google.com')

        search_box = await tab.find(tag_name='textarea', name='q')
        await search_box.insert_text(query)
        await tab.keyboard.press(Key.ENTER)

        first_result = await tab.find(
            tag_name='h3',
            text='autoscrape-labs/pydoll',
            timeout=10,
        )
        await first_result.click()

        await tab.find(id='repository-container-header', timeout=10)
        print(f"Page loaded: {await tab.title}")

asyncio.run(google_search('pydoll site:github.com'))
```

## Features

<details>
<summary><b>Hybrid Automation (UI + API)</b></summary>
<br>

Use UI automation to pass login flows (CAPTCHAs, JS challenges), then switch to `tab.request` for fast API calls that inherit the full browser session: cookies, headers, and all.

```python
# Log in via UI
await tab.go_to('https://my-site.com/login')
await (await tab.find(id='username')).type_text('user')
await (await tab.find(id='password')).type_text('pass123')
await (await tab.find(id='login-btn')).click()

# Make authenticated API calls using the browser session
response = await tab.request.get('https://my-site.com/api/user/profile')
user_data = response.json()
```
[Hybrid Automation Docs](https://pydoll.tech/docs/features/network/http-requests/)
</details>

<details>
<summary><b>Network Interception and Monitoring</b></summary>
<br>

Monitor traffic for API discovery or intercept requests to block ads, trackers, and unnecessary resources.

```python
import asyncio
from pydoll.browser.chromium import Chrome
from pydoll.protocol.fetch.events import FetchEvent, RequestPausedEvent
from pydoll.protocol.network.types import ErrorReason

async def block_images():
    async with Chrome() as browser:
        tab = await browser.start()

        async def block_resource(event: RequestPausedEvent):
            request_id = event['params']['requestId']
            resource_type = event['params']['resourceType']

            if resource_type in ['Image', 'Stylesheet']:
                await tab.fail_request(request_id, ErrorReason.BLOCKED_BY_CLIENT)
            else:
                await tab.continue_request(request_id)

        await tab.enable_fetch_events()
        await tab.on(FetchEvent.REQUEST_PAUSED, block_resource)

        await tab.go_to('https://example.com')
        await asyncio.sleep(3)
        await tab.disable_fetch_events()

asyncio.run(block_images())
```
[Network Monitoring](https://pydoll.tech/docs/features/network/monitoring/) | [Request Interception](https://pydoll.tech/docs/features/network/interception/)
</details>

<details>
<summary><b>Browser Fingerprint Control</b></summary>
<br>

Granular control over [browser preferences](https://pydoll.tech/docs/features/configuration/browser-preferences/): hundreds of internal Chrome settings for building consistent fingerprints.

```python
options = ChromiumOptions()

options.browser_preferences = {
    'profile': {
        'default_content_setting_values': {
            'notifications': 2,
            'geolocation': 2,
        },
        'password_manager_enabled': False
    },
    'intl': {
        'accept_languages': 'en-US,en',
    },
    'browser': {
        'check_default_browser': False,
    }
}
```
[Browser Preferences Guide](https://pydoll.tech/docs/features/configuration/browser-preferences/)
</details>

<details>
<summary><b>Concurrency, Contexts and Remote Connections</b></summary>
<br>

Manage [multiple tabs](https://pydoll.tech/docs/features/browser-management/tabs/) and [browser contexts](https://pydoll.tech/docs/features/browser-management/contexts/) (isolated sessions) concurrently. Connect to browsers running in Docker or remote servers.

```python
async def scrape_page(url, tab):
    await tab.go_to(url)
    return await tab.title

async def concurrent_scraping():
    async with Chrome() as browser:
        tab_google = await browser.start()
        tab_ddg = await browser.new_tab()

        results = await asyncio.gather(
            scrape_page('https://google.com/', tab_google),
            scrape_page('https://duckduckgo.com/', tab_ddg)
        )
        print(results)
```
[Multi-Tab Management](https://pydoll.tech/docs/features/browser-management/tabs/) | [Remote Connections](https://pydoll.tech/docs/features/advanced/remote-connections/)
</details>

<details>
<summary><b>Retry Decorator</b></summary>
<br>

The `@retry` decorator supports custom recovery logic between attempts (e.g., refreshing the page, rotating proxies) and exponential backoff.

```python
from pydoll.decorators import retry
from pydoll.exceptions import ElementNotFound, NetworkError

@retry(
    max_retries=3,
    exceptions=[ElementNotFound, NetworkError],
    on_retry=my_recovery_function,
    exponential_backoff=True
)
async def scrape_product(self, url: str):
    # scraping logic
    ...
```
[Retry Decorator Docs](https://pydoll.tech/docs/features/advanced/decorators/)
</details>

---

## Contributing

Contributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

## Support

If you find Pydoll useful, consider [sponsoring the project on GitHub](https://github.com/sponsors/thalissonvs).

## License

[MIT License](LICENSE)


================================================
FILE: README_zh.md
================================================
<p align="center">
    <img src="https://github.com/user-attachments/assets/219f2dbc-37ed-4aea-a289-ba39cdbb335d" alt="Pydoll Logo" /> <br>
</p>
<h1 align="center">Pydoll: Automate the Web, Naturally</h1>

<p align="center">
    <a href="https://github.com/autoscrape-labs/pydoll/stargazers"><img src="https://img.shields.io/github/stars/autoscrape-labs/pydoll?style=social"></a>
    <a href="https://codecov.io/gh/autoscrape-labs/pydoll" >
        <img src="https://codecov.io/gh/autoscrape-labs/pydoll/graph/badge.svg?token=40I938OGM9"/>
    </a>
    <img src="https://github.com/thalissonvs/pydoll/actions/workflows/tests.yml/badge.svg" alt="Tests">
    <img src="https://github.com/thalissonvs/pydoll/actions/workflows/ruff-ci.yml/badge.svg" alt="Ruff CI">
    <img src="https://github.com/thalissonvs/pydoll/actions/workflows/mypy.yml/badge.svg" alt="MyPy CI">
    <img src="https://img.shields.io/badge/python-%3E%3D3.10-blue" alt="Python >= 3.10">
    <a href="https://deepwiki.com/autoscrape-labs/pydoll"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
</p>


<p align="center">
  📖 <a href="https://autoscrape-labs.github.io/pydoll/">文档</a> •
  🚀 <a href="#-getting-started">快速上手</a> •
  ⚡ <a href="#-advanced-features">高级特性</a> •
  🤝 <a href="#-contributing">贡献</a> •
  💖 <a href="#-support-my-work">赞助我</a>
</p>

- [English](README.md)

设想以下场景:你需要实现浏览器任务的自动化操作——无论是测试Web应用程序、从网站采集数据,还是批量处理重复性流程。传统方法往往需要配置外部驱动程序、进行复杂的系统设置,还可能面临诸多兼容性问题。

**Pydoll的诞生就是解决这些问题!!!**

Pydoll 采用全新设计理念,从零构建,直接对接 Chrome DevTools Protocol(CDP),无需依赖外部驱动。 这种精简的实现方式,结合高度拟真的点击、导航及元素交互机制,使其行为与真实用户几乎毫无区别。

我们坚信,真正强大的自动化工具,不应让用户困于繁琐的配置学习,也不该让用户疲于应对反爬系统的风控。使用Pydoll,你只需专注核心业务逻辑——让自动化回归本质,而非纠缠于底层技术细节或防护机制。

<div>
  <h4>做一个好人,给我们一个星星 ⭐</h4> 
    没有星星,就没有Bug修复。开玩笑的(也许)
</div>

## 🌟 Pydoll 的核心优势

- **零 WebDriver 依赖**:彻底告别驱动兼容性烦恼
- **类人交互引擎**:能够通过行为验证码如 reCAPTCHA v3 或 Turnstile,取决于 IP 声誉和交互模式
- **异步高性能**:支持高速自动化与多任务并行处理
- **拟真交互体验**:完美复刻真实用户行为模式
- **极简部署**:安装即用,开箱即自动化

## 最新功能

### 类人页面滚动 —— 像真实用户一样滚动!

现在你可以控制页面滚动,支持平滑动画并自动等待完成:

```python
from pydoll.constants import ScrollPosition

# 带平滑动画向下滚动(等待完成)
await tab.scroll.by(ScrollPosition.DOWN, 500, smooth=True)

# 导航至特定位置
await tab.scroll.to_bottom(smooth=True)
await tab.scroll.to_top(smooth=True)

# 需要速度时的即时滚动
await tab.scroll.by(ScrollPosition.UP, 300, smooth=False)
```

不同于立即返回的 `execute_script("window.scrollBy(...)")`,滚动API使用CDP的`awaitPromise`等待浏览器的`scrollend`事件,确保后续操作仅在滚动完全完成后执行。非常适合截取屏幕截图、加载延迟内容或创建真实的阅读模式。

### 键盘 API —— 完全控制键盘输入

全新的 `KeyboardAPI` 为页面级别的所有键盘交互提供了简洁、集中的接口:

```python
from pydoll.constants import Key

# 按单个键
await tab.keyboard.press(Key.ENTER)
await tab.keyboard.press(Key.TAB)

# 使用快捷键/组合键(最多3个键)
await tab.keyboard.hotkey(Key.CONTROL, Key.A)  # 全选(有效!)
await tab.keyboard.hotkey(Key.CONTROL, Key.C)  # 复制(有效!)
await tab.keyboard.hotkey(Key.CONTROL, Key.SHIFT, Key.ARROWRIGHT)  # 向右选择单词

# 复杂序列的手动控制
await tab.keyboard.down(Key.SHIFT)
await tab.keyboard.press(Key.ARROWRIGHT)  # 按住 Shift 选择文本
await tab.keyboard.up(Key.SHIFT)
```

**主要改进:**
- **集中化**:所有键盘操作通过 `tab.keyboard` 访问
- **智能修饰键检测**:快捷键自动检测并应用修饰键(Ctrl、Shift、Alt、Meta)
- **完整按键支持**:26个字母(A-Z)、10个数字(0-9)、所有功能键、数字键盘和特殊键
- **页面级快捷键**:适用于 Ctrl+C、Ctrl+V、Ctrl+A 等(由于 CDP 限制,浏览器 UI 快捷键不起作用)

> **⚠️ CDP 限制:** 浏览器 UI 快捷键(如 Ctrl+T 打开新标签,F12 打开开发者工具)通过 CDP 无法使用。请改用 Pydoll 的方法:`await browser.new_tab()`、`await tab.close()`。

### Retry 装饰器:生产级错误恢复

使用 `@retry` 装饰器将脆弱的脚本转变为强大的生产级爬虫。通过指数退避和自定义恢复策略,自动从网络故障、超时和临时错误中恢复:

```python
import asyncio
from pydoll.browser.chromium import Chrome
from pydoll.decorators import retry
from pydoll.exceptions import ElementNotFound, NetworkError

class ProductScraper:
    def __init__(self):
        self.tab = None
        self.retry_count = 0
    
    # 在每次重试前执行的恢复回调
    async def recover_from_failure(self):
        self.retry_count += 1
        print(f"尝试 {self.retry_count} 失败。恢复中...")
        
        # 刷新页面并恢复状态
        if self.tab:
            await self.tab.refresh()
            await asyncio.sleep(2)
    
    @retry(
        max_retries=3,
        exceptions=[ElementNotFound, NetworkError],
        on_retry=recover_from_failure,  # 执行恢复逻辑
        delay=2.0,
        exponential_backoff=True
    )
    async def scrape_product(self, url: str):
        if not self.tab:
            browser = Chrome()
            self.tab = await browser.start()
        
        await self.tab.go_to(url)
        title = await self.tab.find(class_name='product-title', timeout=5)
        return await title.text
```

**强大功能:**
- **智能重试逻辑**:仅对您定义的特定异常重试
- **指数退避**:逐步增加等待时间(1秒 → 2秒 → 4秒 → 8秒)
- **恢复回调**:在重试之间执行自定义逻辑(刷新页面、切换代理、重启浏览器)
- **生产验证**:自信地处理真实世界爬虫的混乱情况

非常适合处理速率限制、网络不稳定、动态内容加载和验证码检测。将不可靠的爬虫转变为防弹自动化。

[**📖 完整文档**](https://pydoll.tech/docs/zh/features/advanced/decorators/)

### 通过 WebSocket 进行远程连接 —— 随时随地控制浏览器!

现在你可以使用浏览器的 WebSocket 地址直接连接到已运行的实例,并立即使用完整的 Pydoll API:

```python
from pydoll.browser.chromium import Chrome

chrome = Chrome()
tab = await chrome.connect('ws://YOUR_HOST:9222/devtools/browser/XXXX')

# 直接开干:导航、元素自动化、请求、事件…
await tab.go_to('https://example.com')
title = await tab.execute_script('return document.title')
print(title)
```

这让你可以轻松对接远程/CI 浏览器、容器或共享调试目标——无需本地启动,只需指向 WS 端点即可自动化。

### 像专业人士一样漫游 DOM:get_children_elements() 与 get_siblings_elements()

两个让复杂布局遍历更优雅的小助手:

```python
# 获取容器的直接子元素
container = await tab.find(id='cards')
cards = await container.get_children_elements(max_depth=1)

# 想更深入?这将返回子元素的子元素(以此类推)
elements = await container.get_children_elements(max_depth=2) 

# 在横向列表中无痛遍历兄弟元素
active = await tab.find(class_name='item--active')
siblings = await active.get_siblings_elements()

print(len(cards), len(siblings))
```

用更少样板代码表达更多意图,特别适合动态网格、列表与菜单的场景,让抓取/自动化逻辑更清晰、更可读。

### WebElement:状态等待与新的公共 API

- 新增 `wait_until(...)` 用于等待元素状态,使用更简单:

```python
# 等待元素变为可见,直到超时
await element.wait_until(is_visible=True, timeout=5)

# 等待元素变为可交互(可见、位于顶层并可接收事件)
await element.wait_until(is_interactable=True, timeout=10)
```

- 以下 `WebElement` 方法现已公开:
  - `is_visible()`
    - 判断元素是否具有可见区域、未被 CSS 隐藏,并在需要时滚动进入视口。适用于交互前的快速校验。
  - `is_interactable()`
    - “可点击”状态:综合可见性、启用状态与指针事件命中等条件,适合构建更稳健的交互流程。
  - `is_on_top()`
    - 检查元素在点击位置是否为顶部命中目标,避免被覆盖导致点击失效。
  - `execute_script(script: str, return_by_value: bool = False)`
    - 在元素上下文中执行 JavaScript(this 指向该元素),便于细粒度调整与快速检查。

```python
# 使用 JS 高亮元素
await element.execute_script("this.style.outline='2px solid #22d3ee'")

# 校验状态
visible = await element.is_visible()
interactable = await element.is_interactable()
on_top = await element.is_on_top()
```

以上新增能力能显著简化“等待+验证”场景,降低自动化过程中的不稳定性,使用例更可预测。

### 浏览器上下文 HTTP 请求 - 混合自动化的游戏规则改变者!
你是否曾经希望能够发出自动继承浏览器所有会话状态的 HTTP 请求?**现在你可以了!**<br>
`tab.request` 属性为你提供了一个美观的 `requests` 风格接口,可在浏览器的 JavaScript 上下文中直接执行 HTTP 调用。这意味着每个请求都会自动获得 cookies、身份验证标头、CORS 策略和会话状态,就像浏览器本身发出请求一样。

**混合自动化的完美选择:**
```python
# 使用 PyDoll 正常导航到网站并登录
await tab.go_to('https://example.com/login')
await (await tab.find(id='username')).type_text('user@example.com')
await (await tab.find(id='password')).type_text('password')
await (await tab.find(id='login-btn')).click()

# 现在发出继承已登录会话的 API 调用!
response = await tab.request.get('https://example.com/api/user/profile')
user_data = response.json()

# 在保持身份验证的同时 POST 数据
response = await tab.request.post(
    'https://example.com/api/settings', 
    json={'theme': 'dark', 'notifications': True}
)

# 以不同格式访问响应内容
raw_data = response.content
text_data = response.text
json_data = response.json()

# 检查设置的 cookies
for cookie in response.cookies:
    print(f"Cookie: {cookie['name']} = {cookie['value']}")

# 向你的请求添加自定义标头
headers = [
    {'name': 'X-Custom-Header', 'value': 'my-value'},
    {'name': 'X-API-Version', 'value': '2.0'}
]

await tab.request.get('https://api.example.com/data', headers=headers)

```

**为什么这很棒:**
- **无需会话切换** - 请求自动继承浏览器 cookies
- **CORS 无缝工作** - 请求遵循浏览器安全策略  
- **现代 SPA 的完美选择** - 无缝混合 UI 自动化与 API 调用
- **身份验证变得简单** - 通过 UI 登录一次,然后调用 API
- **混合工作流** - 为每个步骤使用最佳工具(UI 或 API)

这为需要浏览器交互和 API 效率的自动化场景开启了令人难以置信的可能性!

### 使用自定义首选项完全控制浏览器!(感谢 [@LucasAlvws](https://github.com/LucasAlvws))
想要完全自定义 Chrome 的行为?**现在你可以控制一切!**<br>
新的 `browser_preferences` 系统让你可以访问数百个之前无法通过编程方式更改的内部 Chrome 设置。我们说的是远超命令行标志的深度浏览器自定义!

**可能性是无限的:**
```python
options = ChromiumOptions()

# 创建完美的自动化环境
options.browser_preferences = {
    'download': {
        'default_directory': '/tmp/downloads',
        'prompt_for_download': False,
        'directory_upgrade': True,
        'extensions_to_open': ''  # 不自动打开任何下载
    },
    'profile': {
        'default_content_setting_values': {
            'notifications': 2,        # 阻止所有通知
            'geolocation': 2,         # 阻止位置请求
            'media_stream_camera': 2, # 阻止摄像头访问
            'media_stream_mic': 2,    # 阻止麦克风访问
            'popups': 1               # 允许弹窗(对自动化有用)
        },
        'password_manager_enabled': False,  # 禁用密码提示
        'exit_type': 'Normal'              # 始终正常退出
    },
    'intl': {
        'accept_languages': 'zh-CN,zh,en-US,en',
        'charset_default': 'UTF-8'
    },
    'browser': {
        'check_default_browser': False,    # 不询问默认浏览器
        'show_update_promotion_infobar': False
    }
}

# 或使用便捷的辅助方法
options.set_default_download_directory('/tmp/downloads')
options.set_accept_languages('zh-CN,zh,en-US,en')  
options.prompt_for_download = False
```

**实际应用的强大示例:**
- **静默下载** - 无提示、无对话框,只有自动化下载
- **阻止所有干扰** - 通知、弹窗、摄像头请求,应有尽有
- **CI/CD 的完美选择** - 禁用更新检查、默认浏览器提示、崩溃报告
- **多区域测试** - 即时更改语言、时区和区域设置
- **安全加固** - 锁定权限并禁用不必要的功能
- **高级指纹控制** - 修改浏览器安装日期、参与历史和行为模式

**用于隐蔽自动化的指纹自定义:**
```python
import time

# 模拟一个已经存在几个月的浏览器
fake_engagement_time = int(time.time()) - (7 * 24 * 60 * 60)  # 7天前

options.browser_preferences = {
    'settings': {
        'touchpad': {
            'natural_scroll': True,
        }
    },
    'profile': {
        'last_engagement_time': fake_engagement_time,
        'exit_type': 'Normal',
        'exited_cleanly': True
    },
    'newtab_page_location_override': 'https://www.google.com',
    'session': {
        'restore_on_startup': 1,  # 恢复上次会话
        'startup_urls': ['https://www.google.com']
    }
}
```

这种控制级别以前只有 Chrome 扩展开发者才能使用 - 现在它在你的自动化工具包中!

查看[文档](https://pydoll.tech/docs/zh/features/#custom-browser-preferences/)了解更多详情。

### 新的 `get_parent_element()` 方法
检索任何 WebElement 的父元素,使导航 DOM 结构更加容易:
```python
element = await tab.find(id='button')
parent = await element.get_parent_element()
```

### 新的 start_timeout 选项 (感谢 [@j0j1j2](https://github.com/j0j1j2))
添加到 ChromiumOptions 来控制浏览器启动可以花费多长时间。在较慢的机器或 CI 环境中很有用。

```python
options = ChromiumOptions()
options.start_timeout = 20  # 等待 20 秒
```

### 新的 expect_download() 上下文管理器 —— 稳健、优雅的文件下载!
还在为不稳定的下载流程、丢失的文件或混乱的事件监听而头疼吗?`tab.expect_download()` 来了:一种可靠、简洁的下载方式。

- 自动配置浏览器下载行为
- 支持自定义下载目录或临时目录(自动清理!)
- 内置超时等待,防止任务卡住
- 提供便捷句柄:读取字节/BASE64,获取 `file_path`

一个“开箱即用”的小示例:

```python
import asyncio
from pathlib import Path
from pydoll.browser import Chrome

async def download_report():
    async with Chrome() as browser:
        tab = await browser.start()
        await tab.go_to('https://example.com/reports')

        target_dir = Path('/tmp/my-downloads')
        async with tab.expect_download(keep_file_at=target_dir, timeout=10) as dl:
            # 触发页面上的下载(按钮/链接等)
            await (await tab.find(text='Download latest report')).click()

            # 等待完成并读取内容
            data = await dl.read_bytes()
            print(f"已下载 {len(data)} 字节,保存至: {dl.file_path}")

asyncio.run(download_report())
```

想要“零成本清理”?不传 `keep_file_at` 即可——我们会创建临时目录,并在上下文退出后自动清理。对测试场景非常友好。

## 📦 安装

```bash
pip install pydoll-python
```

就这么简单!安装即用,马上开始自动化

## 🚀 快速上手

### 你的第一个自动化任务

让我们从一个实际例子开始:一个自动执行谷歌搜索并点击第一个结果的自动化流程。通过这个示例,你可以了解该库的工作原理,以及如何开始将日常任务自动化。

```python
import asyncio

from pydoll.browser import Chrome
from pydoll.constants import Key

async def google_search(query: str):
    async with Chrome() as browser:
        tab = await browser.start()
        await tab.go_to('https://www.google.com')
        search_box = await tab.find(tag_name='textarea', name='q')
        await search_box.insert_text(query)
        await tab.keyboard.press(Key.ENTER)
        await (await tab.find(
            tag_name='h3',
            text='autoscrape-labs/pydoll',
            timeout=10,
        )).click()
        await tab.find(id='repository-container-header', timeout=10)

asyncio.run(google_search('pydoll site:github.com'))
```

无需任何配置,只需一个简单脚本,我们就能完成一次完整的谷歌搜索!
好了,现在让我们看看如何从网页中提取数据,依然沿用之前的示例。

假设在以下代码中,我们已经进入了 Pydoll 项目页面。我们需要提取以下信息:

- 项目描述
- 星标数量
- Fork 数量
- Issue 数量
- Pull Request 数量
如果想要获取项目描述,我们将使用 XPath 查询。你可以查阅相关文档,学习如何构建自己的查询语句。

```python
description = await (await tab.query(
    '//h2[contains(text(), "About")]/following-sibling::p',
    timeout=10,
)).text
```

下面让我们来理解这条查询语句的作用:

1. `//h2[contains(text(), "About")]` - 选择第一个包含"About"的 `<h2>` 标签
2. `/following-sibling::p` - 选择第一个在`<h2>` 标签之后的`<p>`标签

然后你可以获取到剩下的数据:

```python
number_of_stars = await (await tab.find(
    id='repo-stars-counter-star'
)).text

number_of_forks = await (await tab.find(
    id='repo-network-counter'
)).text
number_of_issues = await (await tab.find(
    id='issues-repo-tab-count',
)).text
number_of_pull_requests = await (await tab.find(
    id='pull-requests-repo-tab-count',
)).text

data = {
    'description': description,
    'number_of_stars': number_of_stars,
    'number_of_forks': number_of_forks,
    'number_of_issues': number_of_issues,
    'number_of_pull_requests': number_of_pull_requests,
}
print(data)

```

下图展示了本次自动化任务的执行速度与结果。
(为演示需要,浏览器界面未显示。)

![google_seach](./docs/images/google-search-example.gif)


短短5秒内,我们就成功提取了所需数据!  
这就是使用Pydoll进行自动化所能达到的速度。

### 更多复杂的例子

接下来我们来看一个你可能经常遇到的场景:类似Cloudflare的验证码防护。  
Pydoll提供了相应的处理方法,但需要说明的是,正如前文所述,其有效性会受到多种因素影响。  
下面的代码展示了一个完整的Cloudflare验证码处理示例。

```python
import asyncio

from pydoll.browser import Chrome
from pydoll.constants import By

async def cloudflare_example():
    async with Chrome() as browser:
        tab = await browser.start()
        async with tab.expect_and_bypass_cloudflare_captcha():
            await tab.go_to('https://2captcha.com/demo/cloudflare-turnstile')
        print('Captcha handled, continuing...')
        await asyncio.sleep(5)  # just to see the result :)

asyncio.run(cloudflare_example())

```

执行结果如下:

![cloudflare_example](./docs/images/cloudflare-example.gif)


仅需数行代码,我们就成功攻克了最棘手的验证码防护之一。
而这仅仅是Pydoll所提供的众多强大功能之一。但这还远不是全部!


### 自定义配置

有时我们需要对浏览器进行更精细的控制。Pydoll提供了灵活的配置方式来实现这一点。下面我们来看具体示例:


```python
from pydoll.browser import Chrome
from pydoll.browser.options import ChromiumOptions as Options

async def custom_automation():
    # Configure browser options
    options = Options()
    options.add_argument('--proxy-server=username:password@ip:port')
    options.add_argument('--window-size=1920,1080')
    options.binary_location = '/path/to/your/browser'
    options.start_timeout = 20

    async with Chrome(options=options) as browser:
        tab = await browser.start()
        # Your automation code here
        await tab.go_to('https://example.com')
        # The browser is now using your custom settings

asyncio.run(custom_automation())
```

本示例中,我们配置浏览器使用代理服务器,并设置窗口分辨率为1920x1080。此外,还指定了Chrome二进制文件的自定义路径——适用于您的安装位置与常规默认路径不同的情况。

## ⚡ 高级功能

Pydoll提供了一系列高级特性满足高端玩家的需求。


### 高级元素定位

我们提供多种页面元素定位方式。无论您偏好那种方法,都能找到适合您的解决方案:

```python
import asyncio
from pydoll.browser import Chrome

async def element_finding_examples():
    async with Chrome() as browser:
        tab = await browser.start()
        await tab.go_to('https://example.com')

        # Find by attributes (most intuitive)
        submit_btn = await tab.find(
            tag_name='button',
            class_name='btn-primary',
            text='Submit'
        )
        # Find by ID
        username_field = await tab.find(id='username')
        # Find multiple elements
        all_links = await tab.find(tag_name='a', find_all=True)
        # CSS selectors and XPath
        nav_menu = await tab.query('nav.main-menu')
        specific_item = await tab.query('//div[@data-testid="item-123"]')
        # With timeout and error handling
        delayed_element = await tab.find(
            class_name='dynamic-content',
            timeout=10,
            raise_exc=False  # Returns None if not found
        )
        # Advanced: Custom attributes
        custom_element = await tab.find(
            data_testid='submit-button',
            aria_label='Submit form'
        )

asyncio.run(element_finding_examples())
```

find 方法更为友好。我们可以通过常见属性(如 id、tag_name、class_name 等)进行元素查找,甚至支持自定义属性(例如 data-testid)。

如果这些基础方式仍不能满足需求,还可使用 query 方法,通过 CSS 选择器、XPath 查询语句等多种方式进行元素定位。Pydoll 会自动识别当前使用的查询类型。

### 并发自动化

Pydoll 的一大优势在于其基于异步实现的多任务并行处理能力。我们可以同时自动化操作多个浏览器标签页!下面来看具体示例:

```python
import asyncio
from pydoll.browser import Chrome

async def scrape_page(url, tab):
    await tab.go_to(url)
    title = await tab.execute_script('return document.title')
    links = await tab.find(tag_name='a', find_all=True)
    return {
        'url': url,
        'title': title,
        'link_count': len(links)
    }

async def concurrent_scraping():
    browser = Chrome()
    tab_google = await browser.start()
    tab_duckduckgo = await browser.new_tab()
    tasks = [
        scrape_page('https://google.com/', tab_google),
        scrape_page('https://duckduckgo.com/', tab_duckduckgo)
    ]
    results = await asyncio.gather(*tasks)
    print(results)
    await browser.stop()

asyncio.run(concurrent_scraping())
```

下方展示令人惊叹的执行速度:

![concurrent_example](./docs/images/concurrent-example.gif)


这个例子,我们成功实现了同时对两个页面的数据提取.
还有更多强大功能!响应式自动化的事件系统、请求拦截与修改等等。赶快查阅文档!

## 🔧 快速问题排查

**找不到浏览器?**
```python
from pydoll.browser import Chrome
from pydoll.browser.options import ChromiumOptions

options = ChromiumOptions()
options.binary_location = '/path/to/your/chrome'
browser = Chrome(options=options)
```

**浏览器在 FailedToStartBrowser 错误后启动?**
```python
from pydoll.browser import Chrome
from pydoll.browser.options import ChromiumOptions

options = ChromiumOptions()
options.start_timeout = 20  # 默认是 10 秒

browser = Chrome(options=options)
```

**需要代理?**
```python
options.add_argument('--proxy-server=your-proxy:port')
```

**在 Docker 中运行?**
```python
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
```

## 📚 文档

Pydoll 的完整文档、详细示例以及对所有功能的深入探讨可以通过以下链接访问: [官方文档](https://autoscrape-labs.github.io/pydoll/).

文档包含以下部分:
- **快速上手指南** - 分步教程
- **API 参考** - 完整的方法文档
- **高级技巧** - 网络拦截、事件处理、性能优化

>此 README 的中文版本在[这里](README_zh.md)。

## 🤝 贡献

我们很乐意看到您的帮助让 Pydoll 变得更好!查看我们的[贡献指南](CONTRIBUTING.md)开始贡献。无论是修复错误、添加功能还是改进文档 - 所有贡献都受欢迎!

请确保:
- 为新功能或错误修复编写测试
- 遵循代码风格和约定
- 对拉取请求使用约定式提交
- 在提交前运行 lint 检查和测试

## 💖 支持我的工作

如果您发现 Pydoll 有用,请考虑[在 GitHub 上支持我](https://github.com/sponsors/thalissonvs)。  
您将获得独家优惠,如优先支持、自定义功能等等!

现在无法赞助?没问题,您仍然可以通过以下方式提供很大帮助:
- 为仓库加星
- 在社交媒体上分享
- 撰写文章或教程
- 提供反馈或报告问题

每一点支持都很重要/

## 💬 传播消息

如果 Pydoll 为您节省了时间、心理健康或者拯救了一个键盘免于被砸,请给它一个 ⭐,分享它,或者告诉您奇怪的开发者朋友。

## 📄 许可证

Pydoll 在 [MIT 许可证](LICENSE) 下获得许可。

<p align="center">
  <b>Pydoll</b> — 让浏览器自动化变得神奇!
</p>


================================================
FILE: SPONSORS.md
================================================
# Sponsors

Pydoll is supported by these amazing sponsors. Their contributions help keep the project maintained and growing.

## Top Sponsors

<a href="https://substack.thewebscraping.club/p/pydoll-webdriver-scraping?utm_source=github&utm_medium=repo&utm_campaign=pydoll">
<img alt="The Web Scraping Club" src="public/images/banner-the-webscraping-club.png" />
</a>

Read a full review of Pydoll on **[The Web Scraping Club](https://substack.thewebscraping.club/p/pydoll-webdriver-scraping?utm_source=github&utm_medium=repo&utm_campaign=pydoll)**, the #1 newsletter dedicated to web scraping.

---

## Sponsors

<a href="https://www.thordata.com/?ls=github&lk=pydoll">
<img alt="Thordata" src="public/images/thordata.png" />
</a>

Pydoll is proudly sponsored by **[Thordata](https://www.thordata.com/?ls=github&lk=pydoll)**: a residential proxy network built for serious web scraping and automation. With **190+ real residential and ISP locations**, fully encrypted connections, and infrastructure optimized for high-performance workflows, Thordata is an excellent choice for scaling your Pydoll automations.

**[Sign up through our link](https://www.thordata.com/?ls=github&lk=pydoll)** to support the project and get **1GB free** to get started.

---

<a href="https://dashboard.capsolver.com/passport/register?inviteCode=WPhTbOsbXEpc">
<img alt="CapSolver" src="public/images/capsolver.jpeg" />
</a>

Pydoll excels at behavioral evasion, but it doesn't solve captchas. That's where **[CapSolver](https://dashboard.capsolver.com/passport/register?inviteCode=WPhTbOsbXEpc)** comes in. An AI-powered service that handles reCAPTCHA, Cloudflare challenges, and more, seamlessly integrating with your automation workflows.

**[Register with our invite code](https://dashboard.capsolver.com/passport/register?inviteCode=WPhTbOsbXEpc)** and use code **PYDOLL** to get an extra **6% balance bonus**.

---

Interested in sponsoring Pydoll? [Become a sponsor](https://github.com/sponsors/thalissonvs).


================================================
FILE: codecov.yml
================================================
coverage:
  status:
    project: 
      default:
        target: 90%
        threshold: 0%
        base: auto 

================================================
FILE: cz.yaml
================================================
---
commitizen:
  name: cz_conventional_commits
  tag_format: $version
  version: 2.21.3


================================================
FILE: docs/en/api/browser/chrome.md
================================================
# Chrome Browser
 
::: pydoll.browser.chromium.Chrome
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2 

================================================
FILE: docs/en/api/browser/edge.md
================================================
# Edge Browser
 
::: pydoll.browser.chromium.Edge
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2 

================================================
FILE: docs/en/api/browser/managers.md
================================================
# Browser Managers

The managers module provides specialized classes for managing different aspects of browser lifecycle and configuration.

## Overview

Browser managers handle specific responsibilities in browser automation:

::: pydoll.browser.managers
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Manager Classes

### Browser Process Manager
Manages the browser process lifecycle, including starting, stopping, and monitoring browser processes.

::: pydoll.browser.managers.browser_process_manager
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3

### Browser Options Manager
Handles browser configuration options and command-line arguments.

::: pydoll.browser.managers.browser_options_manager
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3

### Proxy Manager
Manages proxy configuration and authentication for browser instances.

::: pydoll.browser.managers.proxy_manager
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3

### Temporary Directory Manager
Handles creation and cleanup of temporary directories used by browser instances.

::: pydoll.browser.managers.temp_dir_manager
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3

## Usage

Managers are typically used internally by browser classes like `Chrome` and `Edge`. They provide modular functionality that can be composed together:

```python
from pydoll.browser.managers.proxy_manager import ProxyManager
from pydoll.browser.managers.temp_dir_manager import TempDirManager

# Managers are used internally by browser classes
# Direct usage is for advanced scenarios only
proxy_manager = ProxyManager()
temp_manager = TempDirManager()
```

!!! note "Internal Usage"
    These managers are primarily used internally by the browser classes. Direct usage is recommended only for advanced scenarios or when extending the library. 

================================================
FILE: docs/en/api/browser/options.md
================================================
# Browser Options

## ChromiumOptions

::: pydoll.browser.options.ChromiumOptions
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3

## Options Interface

::: pydoll.browser.interfaces.Options
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3

## BrowserOptionsManager Interface

::: pydoll.browser.interfaces.BrowserOptionsManager
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3 

================================================
FILE: docs/en/api/browser/requests.md
================================================
# Browser Requests

The requests module provides HTTP request capabilities within the browser context, enabling seamless API calls that inherit the browser's session state, cookies, and authentication.

## Overview

The browser requests module offers a `requests`-like interface for making HTTP calls directly within the browser's JavaScript context. This approach provides several advantages over traditional HTTP libraries:

- **Session inheritance**: Automatic cookie, authentication, and CORS handling
- **Browser context**: Requests execute in the same security context as the page
- **No session juggling**: Eliminate the need to transfer cookies and tokens between automation and API calls
- **SPA compatibility**: Perfect for Single Page Applications with complex authentication flows

## Request Class

The main interface for making HTTP requests within the browser context.

::: pydoll.browser.requests.request.Request
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3
      group_by_category: true
      members_order: source
      filters:
        - "!^__"

## Response Class

Represents the response from HTTP requests, providing a familiar interface similar to the `requests` library.

::: pydoll.browser.requests.response.Response
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3
      group_by_category: true
      members_order: source
      filters:
        - "!^__"

## Usage Examples

### Basic HTTP Methods

```python
from pydoll.browser.chromium import Chrome

async with Chrome() as browser:
    tab = await browser.start()
    await tab.go_to("https://api.example.com")
    
    # GET request
    response = await tab.request.get("/users/123")
    user_data = await response.json()
    
    # POST request
    response = await tab.request.post("/users", json={
        "name": "John Doe",
        "email": "john@example.com"
    })
    
    # PUT request with headers
    response = await tab.request.put("/users/123", 
        json={"name": "Jane Doe"},
        headers={"Authorization": "Bearer token123"}
    )
```

### Response Handling

```python
# Check response status
if response.ok:
    print(f"Success: {response.status_code}")
else:
    print(f"Error: {response.status_code}")
    response.raise_for_status()  # Raises HTTPError for 4xx/5xx

# Access response data
text_data = response.text
json_data = await response.json()
raw_bytes = response.content

# Inspect headers and cookies
print("Response headers:", response.headers)
print("Request headers:", response.request_headers)
for cookie in response.cookies:
    print(f"Cookie: {cookie.name}={cookie.value}")
```

### Advanced Features

```python
# Request with custom headers and parameters
response = await tab.request.get("/search", 
    params={"q": "python", "limit": 10},
    headers={
        "User-Agent": "Custom Bot 1.0",
        "Accept": "application/json"
    }
)

# File upload simulation
response = await tab.request.post("/upload",
    data={"description": "Test file"},
    files={"file": ("test.txt", "file content", "text/plain")}
)

# Form data submission
response = await tab.request.post("/login",
    data={"username": "user", "password": "pass"}
)
```

## Integration with Tab

The request functionality is accessed through the `tab.request` property, which provides a singleton `Request` instance for each tab:

```python
# Each tab has its own request instance
tab1 = await browser.get_tab(0)
tab2 = await browser.new_tab()

# These are separate Request instances
request1 = tab1.request  # Request bound to tab1
request2 = tab2.request  # Request bound to tab2

# Requests inherit the tab's context
await tab1.go_to("https://site1.com")
await tab2.go_to("https://site2.com")

# These requests will have different cookie/session contexts
response1 = await tab1.request.get("/api/data")  # Uses site1.com cookies
response2 = await tab2.request.get("/api/data")  # Uses site2.com cookies
```

!!! tip "Hybrid Automation"
    This module is particularly powerful for hybrid automation scenarios where you need to combine UI interactions with API calls. For example, log in through the UI, then use the authenticated session for API calls without manually handling cookies or tokens.

================================================
FILE: docs/en/api/browser/tab.md
================================================
# Tab

::: pydoll.browser.tab.Tab
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/api/commands/browser.md
================================================
# Browser Commands

Browser commands provide low-level control over browser instances and their configuration.

## Overview

The browser commands module handles browser-level operations such as version information, target management, and browser-wide settings.

::: pydoll.commands.browser_commands
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Usage

Browser commands are typically used internally by browser classes to manage browser instances:

```python
from pydoll.commands.browser_commands import get_version
from pydoll.connection.connection_handler import ConnectionHandler

# Get browser version information
connection = ConnectionHandler()
version_info = await get_version(connection)
```

## Available Commands

The browser commands module provides functions for:

- Getting browser version and user agent information
- Managing browser targets (tabs, windows)
- Controlling browser-wide settings and permissions
- Handling browser lifecycle events

!!! note "Internal Usage"
    These commands are primarily used internally by the `Chrome` and `Edge` browser classes. Direct usage is recommended only for advanced scenarios. 

================================================
FILE: docs/en/api/commands/dom.md
================================================
# DOM Commands

DOM commands provide comprehensive functionality for interacting with the Document Object Model of web pages.

## Overview

The DOM commands module is one of the most important modules in Pydoll, providing all the functionality needed to find, interact with, and manipulate HTML elements on web pages.

::: pydoll.commands.dom_commands
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Usage

DOM commands are used extensively by the `WebElement` class and element finding methods:

```python
from pydoll.commands.dom_commands import query_selector, get_attributes
from pydoll.connection.connection_handler import ConnectionHandler

# Find element and get its attributes
connection = ConnectionHandler()
node_id = await query_selector(connection, selector="#username")
attributes = await get_attributes(connection, node_id=node_id)
```

## Key Functionality

The DOM commands module provides functions for:

### Element Finding
- `query_selector()` - Find single element by CSS selector
- `query_selector_all()` - Find multiple elements by CSS selector
- `get_document()` - Get the document root node

### Element Interaction
- `click_element()` - Click on elements
- `focus_element()` - Focus elements
- `set_attribute_value()` - Set element attributes
- `get_attributes()` - Get element attributes

### Element Information
- `get_box_model()` - Get element positioning and dimensions
- `describe_node()` - Get detailed element information
- `get_outer_html()` - Get element HTML content

### DOM Manipulation
- `remove_node()` - Remove elements from DOM
- `set_node_value()` - Set element values
- `request_child_nodes()` - Get child elements

!!! tip "High-Level APIs"
    While these commands provide powerful low-level access, most users should use the higher-level `WebElement` class methods like `click()`, `type_text()`, and `get_attribute()` which use these commands internally. 

================================================
FILE: docs/en/api/commands/fetch.md
================================================
# Fetch Commands

Fetch commands provide advanced network request handling and interception capabilities using the Fetch API domain.

## Overview

The fetch commands module enables sophisticated network request management, including request modification, response interception, and authentication handling.

::: pydoll.commands.fetch_commands
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Usage

Fetch commands are used for advanced network interception and request handling:

```python
from pydoll.commands.fetch_commands import enable, request_paused, continue_request
from pydoll.connection.connection_handler import ConnectionHandler

# Enable fetch domain
connection = ConnectionHandler()
await enable(connection, patterns=[{
    "urlPattern": "*",
    "requestStage": "Request"
}])

# Handle paused requests
async def handle_paused_request(request_id, request):
    # Modify request or continue as-is
    await continue_request(connection, request_id=request_id)
```

## Key Functionality

The fetch commands module provides functions for:

### Request Interception
- `enable()` - Enable fetch domain with patterns
- `disable()` - Disable fetch domain
- `continue_request()` - Continue intercepted requests
- `fail_request()` - Fail requests with specific errors

### Request Modification
- Modify request headers
- Change request URLs
- Alter request methods (GET, POST, etc.)
- Modify request bodies

### Response Handling
- `fulfill_request()` - Provide custom responses
- `get_response_body()` - Get response content
- Response header modification
- Response status code control

### Authentication
- `continue_with_auth()` - Handle authentication challenges
- Basic authentication support
- Custom authentication flows

## Advanced Features

### Pattern-Based Interception
```python
# Intercept specific URL patterns
patterns = [
    {"urlPattern": "*/api/*", "requestStage": "Request"},
    {"urlPattern": "*.js", "requestStage": "Response"},
    {"urlPattern": "https://example.com/*", "requestStage": "Request"}
]

await enable(connection, patterns=patterns)
```

### Request Modification
```python
# Modify intercepted requests
async def modify_request(request_id, request):
    # Add authentication header
    headers = request.headers.copy()
    headers["Authorization"] = "Bearer token123"
    
    # Continue with modified headers
    await continue_request(
        connection,
        request_id=request_id,
        headers=headers
    )
```

### Response Mocking
```python
# Mock API responses
await fulfill_request(
    connection,
    request_id=request_id,
    response_code=200,
    response_headers=[
        {"name": "Content-Type", "value": "application/json"},
        {"name": "Access-Control-Allow-Origin", "value": "*"}
    ],
    body='{"status": "success", "data": {"mocked": true}}'
)
```

### Authentication Handling
```python
# Handle authentication challenges
await continue_with_auth(
    connection,
    request_id=request_id,
    auth_challenge_response={
        "response": "ProvideCredentials",
        "username": "user",
        "password": "pass"
    }
)
```

## Request Stages

Fetch commands can intercept requests at different stages:

| Stage | Description | Use Cases |
|-------|-------------|-----------|
| Request | Before request is sent | Modify headers, URL, method |
| Response | After response received | Mock responses, modify content |

## Error Handling

```python
# Fail requests with specific errors
await fail_request(
    connection,
    request_id=request_id,
    error_reason="ConnectionRefused"  # or "AccessDenied", "TimedOut", etc.
)
```

## Integration with Network Commands

Fetch commands work alongside network commands but provide more granular control:

- **Network Commands**: Broader network monitoring and control
- **Fetch Commands**: Specific request/response interception and modification

!!! tip "Performance Considerations"
    Fetch interception can impact page loading performance. Use specific URL patterns and disable when not needed to minimize overhead. 

================================================
FILE: docs/en/api/commands/index.md
================================================
# Commands Overview

The Commands module provides high-level interfaces for interacting with Chrome DevTools Protocol (CDP) domains. Each command module corresponds to a specific CDP domain and provides methods to execute various browser operations.

## Available Command Modules

### Browser Commands
- **Module**: `browser_commands.py`
- **Purpose**: Browser-level operations and window management
- **Documentation**: [Browser Commands](browser.md)

### DOM Commands
- **Module**: `dom_commands.py`
- **Purpose**: DOM tree manipulation and element operations
- **Documentation**: [DOM Commands](dom.md)

### Input Commands
- **Module**: `input_commands.py`
- **Purpose**: Input event simulation (keyboard, mouse, touch)
- **Documentation**: [Input Commands](input.md)

### Network Commands
- **Module**: `network_commands.py`
- **Purpose**: Network monitoring and request interception
- **Documentation**: [Network Commands](network.md)

### Page Commands
- **Module**: `page_commands.py`
- **Purpose**: Page lifecycle management and navigation
- **Documentation**: [Page Commands](page.md)

### Runtime Commands
- **Module**: `runtime_commands.py`
- **Purpose**: JavaScript execution and runtime management
- **Documentation**: [Runtime Commands](runtime.md)

### Storage Commands
- **Module**: `storage_commands.py`
- **Purpose**: Browser storage access (cookies, local storage, etc.)
- **Documentation**: [Storage Commands](storage.md)

### Target Commands
- **Module**: `target_commands.py`
- **Purpose**: Target management and tab operations
- **Documentation**: [Target Commands](target.md)

### Fetch Commands
- **Module**: `fetch_commands.py`
- **Purpose**: Network request interception and modification
- **Documentation**: [Fetch Commands](fetch.md)

## Usage Pattern

Commands are typically accessed through the browser or tab instances:

```python
from pydoll.browser.chromium import Chrome

# Initialize browser
browser = Chrome()
await browser.start()

# Get active tab
tab = await browser.get_active_tab()

# Use commands through the tab
await tab.navigate("https://example.com")
element = await tab.find(id="button")
await element.click()
```

## Command Structure

Each command module follows a consistent pattern:
- **Static methods**: For direct command execution
- **Type hints**: Full type safety with protocol types
- **Error handling**: Proper exception handling for CDP errors
- **Documentation**: Comprehensive docstrings with examples 

================================================
FILE: docs/en/api/commands/input.md
================================================
# Input Commands

Input commands handle mouse and keyboard interactions, providing human-like input simulation.

## Overview

The input commands module provides functionality for simulating user input including mouse movements, clicks, keyboard typing, and key presses.

::: pydoll.commands.input_commands
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Usage

Input commands are used by element interaction methods and can be used directly for advanced input scenarios:

```python
from pydoll.commands.input_commands import dispatch_mouse_event, dispatch_key_event
from pydoll.connection.connection_handler import ConnectionHandler

# Simulate mouse click
connection = ConnectionHandler()
await dispatch_mouse_event(
    connection, 
    type="mousePressed", 
    x=100, 
    y=200, 
    button="left"
)

# Simulate keyboard typing
await dispatch_key_event(
    connection,
    type="keyDown",
    key="Enter"
)
```

## Key Functionality

The input commands module provides functions for:

### Mouse Events
- `dispatch_mouse_event()` - Mouse clicks, movements, and wheel events
- Mouse button states (left, right, middle)
- Coordinate-based positioning
- Drag and drop operations

### Keyboard Events
- `dispatch_key_event()` - Key press and release events
- `insert_text()` - Direct text insertion
- Special key handling (Enter, Tab, Arrow keys, etc.)
- Modifier keys (Ctrl, Alt, Shift)

### Touch Events
- Touch screen simulation
- Multi-touch gestures
- Touch coordinates and pressure

## Human-like Behavior

The input commands support human-like behavior patterns:

- Natural mouse movement curves
- Realistic typing speeds and patterns
- Random micro-delays between actions
- Pressure-sensitive touch events

!!! tip "Element Methods"
    For most use cases, use the higher-level element methods like `element.click()` and `element.type_text()` which provide a more convenient API and handle common scenarios automatically. 

================================================
FILE: docs/en/api/commands/network.md
================================================
# Network Commands

Network commands provide comprehensive control over network requests, responses, and browser networking behavior.

## Overview

The network commands module enables request interception, response modification, cookie management, and network monitoring capabilities.

::: pydoll.commands.network_commands
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Usage

Network commands are used for advanced scenarios like request interception and network monitoring:

```python
from pydoll.commands.network_commands import enable, set_request_interception
from pydoll.connection.connection_handler import ConnectionHandler

# Enable network monitoring
connection = ConnectionHandler()
await enable(connection)

# Enable request interception
await set_request_interception(connection, patterns=[{"urlPattern": "*"}])
```

## Key Functionality

The network commands module provides functions for:

### Request Management
- `enable()` / `disable()` - Enable/disable network monitoring
- `set_request_interception()` - Intercept and modify requests
- `continue_intercepted_request()` - Continue or modify intercepted requests
- `get_request_post_data()` - Get request body data

### Response Handling
- `get_response_body()` - Get response content
- `fulfill_request()` - Provide custom responses
- `fail_request()` - Simulate network failures

### Cookie Management
- `get_cookies()` - Get browser cookies
- `set_cookies()` - Set browser cookies
- `delete_cookies()` - Delete specific cookies
- `clear_browser_cookies()` - Clear all cookies

### Cache Control
- `clear_browser_cache()` - Clear browser cache
- `set_cache_disabled()` - Disable browser cache
- `get_response_body_for_interception()` - Get cached responses

### Security & Headers
- `set_user_agent_override()` - Override user agent
- `set_extra_http_headers()` - Add custom headers
- `emulate_network_conditions()` - Simulate network conditions

## Advanced Use Cases

### Request Interception
```python
# Intercept and modify requests
await set_request_interception(connection, patterns=[
    {"urlPattern": "*/api/*", "requestStage": "Request"}
])

# Handle intercepted request
async def handle_request(request):
    if "api/login" in request.url:
        # Modify request headers
        headers = request.headers.copy()
        headers["Authorization"] = "Bearer token"
        await continue_intercepted_request(
            connection, 
            request_id=request.request_id,
            headers=headers
        )
```

### Response Mocking
```python
# Mock API responses
await fulfill_request(
    connection,
    request_id=request_id,
    response_code=200,
    response_headers={"Content-Type": "application/json"},
    body='{"status": "success"}'
)
```

!!! warning "Performance Impact"
    Network interception can impact page loading performance. Use selectively and disable when not needed. 

================================================
FILE: docs/en/api/commands/page.md
================================================
# Page Commands

Page commands handle page navigation, lifecycle events, and page-level operations.

## Overview

The page commands module provides functionality for navigating between pages, managing page lifecycle, handling JavaScript execution, and controlling page behavior.

::: pydoll.commands.page_commands
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Usage

Page commands are used extensively by the `Tab` class for navigation and page management:

```python
from pydoll.commands.page_commands import navigate, reload, enable
from pydoll.connection.connection_handler import ConnectionHandler

# Navigate to a URL
connection = ConnectionHandler()
await enable(connection)  # Enable page events
await navigate(connection, url="https://example.com")

# Reload the page
await reload(connection)
```

## Key Functionality

The page commands module provides functions for:

### Navigation
- `navigate()` - Navigate to URLs
- `reload()` - Reload current page
- `go_back()` - Navigate back in history
- `go_forward()` - Navigate forward in history
- `stop_loading()` - Stop page loading

### Page Lifecycle
- `enable()` / `disable()` - Enable/disable page events
- `get_frame_tree()` - Get page frame structure
- `get_navigation_history()` - Get navigation history

### Content Management
- `get_resource_content()` - Get page resource content
- `search_in_resource()` - Search within page resources
- `set_document_content()` - Set page HTML content

### Screenshots & PDF
- `capture_screenshot()` - Take page screenshots
- `print_to_pdf()` - Generate PDF from page
- `capture_snapshot()` - Capture page snapshots

### JavaScript Execution
- `add_script_to_evaluate_on_new_document()` - Add startup scripts
- `remove_script_to_evaluate_on_new_document()` - Remove startup scripts

### Page Settings
- `set_lifecycle_events_enabled()` - Control lifecycle events
- `set_ad_blocking_enabled()` - Enable/disable ad blocking
- `set_bypass_csp()` - Bypass Content Security Policy

## Advanced Features

### Frame Management
```python
# Get all frames in the page
frame_tree = await get_frame_tree(connection)
for frame in frame_tree.child_frames:
    print(f"Frame: {frame.frame.url}")
```

### Resource Interception
```python
# Get resource content
content = await get_resource_content(
    connection, 
    frame_id=frame_id, 
    url="https://example.com/script.js"
)
```

### Page Events
The page commands work with various page events:
- `Page.loadEventFired` - Page load completed
- `Page.domContentEventFired` - DOM content loaded
- `Page.frameNavigated` - Frame navigation
- `Page.frameStartedLoading` - Frame loading started

!!! tip "Tab Class Integration"
    Most page operations are available through the `Tab` class methods like `tab.go_to()`, `tab.reload()`, and `tab.screenshot()` which provide a more convenient API. 

================================================
FILE: docs/en/api/commands/runtime.md
================================================
# Runtime Commands

Runtime commands provide JavaScript execution capabilities and runtime environment management.

## Overview

The runtime commands module enables JavaScript code execution, object inspection, and runtime environment control within browser contexts.

::: pydoll.commands.runtime_commands
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Usage

Runtime commands are used for JavaScript execution and runtime management:

```python
from pydoll.commands.runtime_commands import evaluate, enable
from pydoll.connection.connection_handler import ConnectionHandler

# Enable runtime events
connection = ConnectionHandler()
await enable(connection)

# Execute JavaScript
result = await evaluate(
    connection, 
    expression="document.title",
    return_by_value=True
)
print(result.value)  # Page title
```

## Key Functionality

The runtime commands module provides functions for:

### JavaScript Execution
- `evaluate()` - Execute JavaScript expressions
- `call_function_on()` - Call functions on objects
- `compile_script()` - Compile JavaScript for reuse
- `run_script()` - Run compiled scripts

### Object Management
- `get_properties()` - Get object properties
- `release_object()` - Release object references
- `release_object_group()` - Release object groups

### Runtime Control
- `enable()` / `disable()` - Enable/disable runtime events
- `discard_console_entries()` - Clear console entries
- `set_custom_object_formatter_enabled()` - Enable custom formatters

### Exception Handling
- `set_async_call_stack_depth()` - Set call stack depth
- Exception capture and reporting
- Error object inspection

## Advanced Usage

### Complex JavaScript Execution
```python
# Execute complex JavaScript with error handling
script = """
try {
    const elements = document.querySelectorAll('.item');
    return Array.from(elements).map(el => ({
        text: el.textContent,
        href: el.href
    }));
} catch (error) {
    return { error: error.message };
}
"""

result = await evaluate(
    connection,
    expression=script,
    return_by_value=True,
    await_promise=True
)
```

### Object Inspection
```python
# Get detailed object properties
properties = await get_properties(
    connection,
    object_id=object_id,
    own_properties=True,
    accessor_properties_only=False
)

for prop in properties:
    print(f"{prop.name}: {prop.value}")
```

### Console Integration
Runtime commands integrate with browser console:
- Console messages and errors
- Console API method calls
- Custom console formatters

!!! note "Performance Considerations"
    JavaScript execution through runtime commands can be slower than native browser execution. Use judiciously for complex operations. 

================================================
FILE: docs/en/api/commands/storage.md
================================================
# Storage Commands

Storage commands provide comprehensive browser storage management including cookies, localStorage, sessionStorage, and IndexedDB.

## Overview

The storage commands module enables management of all browser storage mechanisms, providing functionality for data persistence and retrieval.

::: pydoll.commands.storage_commands
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Usage

Storage commands are used for managing browser storage across different mechanisms:

```python
from pydoll.commands.storage_commands import get_cookies, set_cookies, clear_data_for_origin
from pydoll.connection.connection_handler import ConnectionHandler

# Get cookies for a domain
connection = ConnectionHandler()
cookies = await get_cookies(connection, urls=["https://example.com"])

# Set a new cookie
await set_cookies(connection, cookies=[{
    "name": "session_id",
    "value": "abc123",
    "domain": "example.com",
    "path": "/",
    "httpOnly": True,
    "secure": True
}])

# Clear all storage for an origin
await clear_data_for_origin(
    connection,
    origin="https://example.com",
    storage_types="all"
)
```

## Key Functionality

The storage commands module provides functions for:

### Cookie Management
- `get_cookies()` - Get cookies by URL or domain
- `set_cookies()` - Set new cookies
- `delete_cookies()` - Delete specific cookies
- `clear_cookies()` - Clear all cookies

### Local Storage
- `get_dom_storage_items()` - Get localStorage items
- `set_dom_storage_item()` - Set localStorage item
- `remove_dom_storage_item()` - Remove localStorage item
- `clear_dom_storage()` - Clear localStorage

### Session Storage
- Session storage operations (similar to localStorage)
- Session-specific data management
- Tab-isolated storage

### IndexedDB
- `get_database_names()` - Get IndexedDB databases
- `request_database()` - Access database structure
- `request_data()` - Query database data
- `clear_object_store()` - Clear object stores

### Cache Storage
- `request_cache_names()` - Get cache names
- `request_cached_response()` - Get cached responses
- `delete_cache()` - Delete cache entries

### Application Cache (Deprecated)
- Legacy application cache support
- Manifest-based caching

## Advanced Features

### Bulk Operations
```python
# Clear all storage types for multiple origins
origins = ["https://example.com", "https://api.example.com"]
for origin in origins:
    await clear_data_for_origin(
        connection,
        origin=origin,
        storage_types="cookies,local_storage,session_storage,indexeddb"
    )
```

### Storage Quotas
```python
# Get storage quota information
quota_info = await get_usage_and_quota(connection, origin="https://example.com")
print(f"Used: {quota_info.usage} bytes")
print(f"Quota: {quota_info.quota} bytes")
```

### Cross-Origin Storage
```python
# Manage storage across different origins
await set_cookies(connection, cookies=[{
    "name": "cross_site_token",
    "value": "token123",
    "domain": ".example.com",  # Applies to all subdomains
    "sameSite": "None",
    "secure": True
}])
```

## Storage Types

The module supports various storage mechanisms:

| Storage Type | Persistence | Scope | Capacity |
|--------------|-------------|-------|----------|
| Cookies | Persistent | Domain/Path | ~4KB per cookie |
| localStorage | Persistent | Origin | ~5-10MB |
| sessionStorage | Session | Tab | ~5-10MB |
| IndexedDB | Persistent | Origin | Large (GB+) |
| Cache API | Persistent | Origin | Large |

!!! warning "Privacy Considerations"
    Storage operations can affect user privacy. Always handle storage data responsibly and in compliance with privacy regulations. 

================================================
FILE: docs/en/api/commands/target.md
================================================
# Target Commands

Target commands manage browser targets including tabs, windows, and other browsing contexts.

## Overview

The target commands module provides functionality for creating, managing, and controlling browser targets such as tabs, popup windows, and service workers.

::: pydoll.commands.target_commands
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Usage

Target commands are used internally by browser classes to manage tabs and windows:

```python
from pydoll.commands.target_commands import get_targets, create_target, close_target
from pydoll.connection.connection_handler import ConnectionHandler

# Get all browser targets
connection = ConnectionHandler()
targets = await get_targets(connection)

# Create a new tab
new_target = await create_target(connection, url="https://example.com")

# Close a target
await close_target(connection, target_id=new_target.target_id)
```

## Key Functionality

The target commands module provides functions for:

### Target Management
- `get_targets()` - List all browser targets
- `create_target()` - Create new tabs or windows
- `close_target()` - Close specific targets
- `activate_target()` - Bring target to foreground

### Target Information
- `get_target_info()` - Get detailed target information
- Target types: page, background_page, service_worker, browser
- Target states: attached, detached, crashed

### Session Management
- `attach_to_target()` - Attach to target for control
- `detach_from_target()` - Detach from target
- `send_message_to_target()` - Send commands to targets

### Browser Context
- `create_browser_context()` - Create isolated browser context
- `dispose_browser_context()` - Remove browser context
- `get_browser_contexts()` - List browser contexts

## Target Types

Different types of targets can be managed:

### Page Targets
```python
# Create a new tab
page_target = await create_target(
    connection,
    url="https://example.com",
    width=1920,
    height=1080,
    browser_context_id=None  # Default context
)
```

### Popup Windows
```python
# Create a popup window
popup_target = await create_target(
    connection,
    url="https://popup.example.com",
    width=800,
    height=600,
    new_window=True
)
```

### Incognito Contexts
```python
# Create incognito browser context
incognito_context = await create_browser_context(connection)

# Create tab in incognito context
incognito_tab = await create_target(
    connection,
    url="https://private.example.com",
    browser_context_id=incognito_context.browser_context_id
)
```

!!! info "Headless vs Headed: how contexts show up"
    Browser contexts are isolated logical environments. In headed mode, the first page created inside a new context will usually open in a new OS window. In headless mode, no window is shown — the isolation remains purely logical (cookies, storage, cache and auth state are still separate per context). Prefer contexts in headless/CI pipelines for performance and clean isolation.

## Advanced Features

### Target Events
Target commands work with various target events:
- `Target.targetCreated` - New target created
- `Target.targetDestroyed` - Target closed
- `Target.targetInfoChanged` - Target information updated
- `Target.targetCrashed` - Target crashed

### Multi-Target Coordination
```python
# Manage multiple tabs
targets = await get_targets(connection)
page_targets = [t for t in targets if t.type == "page"]

for target in page_targets:
    # Perform operations on each tab
    await activate_target(connection, target_id=target.target_id)
    # ... do work in this tab
```

### Target Isolation
```python
# Create isolated browser context for testing
test_context = await create_browser_context(connection)

# All targets in this context are isolated
test_tab1 = await create_target(
    connection, 
    url="https://test1.com",
    browser_context_id=test_context.browser_context_id
)

test_tab2 = await create_target(
    connection,
    url="https://test2.com", 
    browser_context_id=test_context.browser_context_id
)
```

!!! note "Browser Integration"
    Target commands are primarily used internally by the `Chrome` and `Edge` browser classes. The high-level browser APIs provide more convenient methods for tab management. 

================================================
FILE: docs/en/api/connection/connection.md
================================================
# Connection Handler

::: pydoll.connection.connection_handler.ConnectionHandler
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/api/connection/managers.md
================================================
# Connection Managers

## CommandsManager

::: pydoll.connection.managers.commands_manager.CommandsManager
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3

## EventsManager

::: pydoll.connection.managers.events_manager.EventsManager
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3 

================================================
FILE: docs/en/api/core/constants.md
================================================
# Constants

This section documents all constants, enums, and configuration values used throughout Pydoll.

::: pydoll.constants
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      group_by_category: true
      members_order: source 

================================================
FILE: docs/en/api/core/exceptions.md
================================================
# Exceptions

This section documents all custom exceptions that can be raised by Pydoll operations.

::: pydoll.exceptions
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      group_by_category: true
      members_order: source 

================================================
FILE: docs/en/api/core/utils.md
================================================
# Utilities

This section documents utility functions and helper classes used throughout Pydoll.

::: pydoll.utils
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      group_by_category: true
      members_order: source 

================================================
FILE: docs/en/api/elements/mixins.md
================================================
# Element Mixins

The mixins module provides reusable functionality that can be mixed into element classes to extend their capabilities.

## Find Elements Mixin

The `FindElementsMixin` provides element finding capabilities to classes that include it.

::: pydoll.elements.mixins.find_elements_mixin
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      filters:
        - "!^_"
        - "!^__"

## Usage

Mixins are typically used internally by the library to compose functionality. The `FindElementsMixin` is used by classes like `Tab` and `WebElement` to provide element finding methods:

```python
# These methods come from FindElementsMixin
element = await tab.find(id="username")
elements = await tab.find(class_name="item", find_all=True)
element = await tab.query("#submit-button")
```

## Available Methods

The `FindElementsMixin` provides several methods for finding elements:

- `find()` - Modern element finding with keyword arguments
- `query()` - CSS selector and XPath queries
- `find_element()` - Legacy element finding method
- `find_elements()` - Legacy method for finding multiple elements

!!! tip "Modern vs Legacy"
    The `find()` method is the modern, recommended approach for finding elements. The `find_element()` and `find_elements()` methods are maintained for backward compatibility. 

================================================
FILE: docs/en/api/elements/shadow_root.md
================================================
# ShadowRoot

::: pydoll.elements.shadow_root.ShadowRoot
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      members_order: source
      group_by_category: true


================================================
FILE: docs/en/api/elements/web_element.md
================================================
# WebElement

::: pydoll.elements.web_element.WebElement
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2
      members_order: source
      group_by_category: true 

================================================
FILE: docs/en/api/index.md
================================================
# API Reference

Welcome to the Pydoll API Reference! This section provides comprehensive documentation for all classes, methods, and functions available in the Pydoll library.

## Overview

Pydoll is organized into several key modules, each serving a specific purpose in browser automation:

### Browser Module
The browser module contains classes for managing browser instances and their lifecycle.

- **[Chrome](browser/chrome.md)** - Chrome browser automation
- **[Edge](browser/edge.md)** - Microsoft Edge browser automation  
- **[Options](browser/options.md)** - Browser configuration options
- **[Tab](browser/tab.md)** - Tab management and interaction
- **[Requests](browser/requests.md)** - HTTP requests within browser context
- **[Managers](browser/managers.md)** - Browser lifecycle managers

### Elements Module
The elements module provides classes for interacting with web page elements.

- **[WebElement](elements/web_element.md)** - Individual element interaction
- **[Mixins](elements/mixins.md)** - Reusable element functionality

### Connection Module
The connection module handles communication with the browser through the Chrome DevTools Protocol.

- **[Connection Handler](connection/connection.md)** - WebSocket connection management
- **[Managers](connection/managers.md)** - Connection lifecycle managers

### Commands Module
The commands module provides low-level Chrome DevTools Protocol command implementations.

- **[Commands Overview](commands/index.md)** - CDP command implementations by domain

### Protocol Module
The protocol module implements the Chrome DevTools Protocol commands and events.

- **[Base Types](protocol/base.md)** - Base types for Chrome DevTools Protocol
- **[Browser](protocol/browser.md)** - Browser domain commands and events
- **[DOM](protocol/dom.md)** - DOM domain commands and events
- **[Fetch](protocol/fetch.md)** - Fetch domain commands and events
- **[Input](protocol/input.md)** - Input domain commands and events
- **[Network](protocol/network.md)** - Network domain commands and events
- **[Page](protocol/page.md)** - Page domain commands and events
- **[Runtime](protocol/runtime.md)** - Runtime domain commands and events
- **[Storage](protocol/storage.md)** - Storage domain commands and events
- **[Target](protocol/target.md)** - Target domain commands and events

### Core Module
The core module contains fundamental utilities, constants, and exceptions.

- **[Constants](core/constants.md)** - Library constants and enums
- **[Exceptions](core/exceptions.md)** - Custom exception classes
- **[Utils](core/utils.md)** - Utility functions

## Quick Navigation

### Most Common Classes

| Class | Purpose | Module |
|-------|---------|--------|
| `Chrome` | Chrome browser automation | `pydoll.browser.chromium` |
| `Edge` | Edge browser automation | `pydoll.browser.chromium` |
| `Tab` | Tab interaction and control | `pydoll.browser.tab` |
| `WebElement` | Element interaction | `pydoll.elements.web_element` |
| `ChromiumOptions` | Browser configuration | `pydoll.browser.options` |

### Key Enums and Constants

| Name | Purpose | Module |
|------|---------|--------|
| `By` | Element selector strategies | `pydoll.constants` |
| `Key` | Keyboard key constants | `pydoll.constants` |
| `PermissionType` | Browser permission types | `pydoll.constants` |

### Common Exceptions

| Exception | When Raised | Module |
|-----------|-------------|--------|
| `ElementNotFound` | Element not found in DOM | `pydoll.exceptions` |
| `WaitElementTimeout` | Element wait timeout | `pydoll.exceptions` |
| `BrowserNotStarted` | Browser not started | `pydoll.exceptions` |

## Usage Patterns

### Basic Browser Automation

```python
from pydoll.browser.chromium import Chrome

async with Chrome() as browser:
    tab = await browser.start()
    await tab.go_to("https://example.com")
    element = await tab.find(id="my-element")
    await element.click()
```

### Element Finding

```python
# Using the modern find() method
element = await tab.find(id="username")
element = await tab.find(tag_name="button", class_name="submit")

# Using CSS selectors or XPath
element = await tab.query("#username")
element = await tab.query("//button[@class='submit']")
```

### Event Handling

```python
await tab.enable_page_events()
await tab.on('Page.loadEventFired', handle_page_load)
```

## Type Hints

Pydoll is fully typed and provides comprehensive type hints for better IDE support and code safety. All public APIs include proper type annotations.

```python
from typing import Optional, List
from pydoll.elements.web_element import WebElement

# Methods return properly typed objects
element: Optional[WebElement] = await tab.find(id="test", raise_exc=False)
elements: List[WebElement] = await tab.find(class_name="item", find_all=True)
```

## Async/Await Support

All Pydoll operations are asynchronous and must be used with `async`/`await`:

```python
import asyncio

async def main():
    # All Pydoll operations are async
    async with Chrome() as browser:
        tab = await browser.start()
        await tab.go_to("https://example.com")
        
asyncio.run(main())
```

Browse the sections below to explore the complete API documentation for each module. 

================================================
FILE: docs/en/api/protocol/base.md
================================================
# Protocol Base Types

Base types and structures for Chrome DevTools Protocol commands, responses, and events.

## Base Types

::: pydoll.protocol.base
    options:
      show_root_heading: true
      show_source: false
      heading_level: 3
      group_by_category: true
      members_order: source
      filters:
        - "!^__"

================================================
FILE: docs/en/api/protocol/browser.md
================================================
# Browser Protocol

Browser domain commands, events and types for Chrome DevTools Protocol.

## Methods

::: pydoll.protocol.browser.methods
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Events  

::: pydoll.protocol.browser.events
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Types

::: pydoll.protocol.browser.types
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/api/protocol/dom.md
================================================
# DOM Protocol

DOM domain commands and events for Chrome DevTools Protocol.

## Methods

::: pydoll.protocol.dom.methods
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Events

::: pydoll.protocol.dom.events
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Types

::: pydoll.protocol.dom.types
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/api/protocol/fetch.md
================================================
# Fetch Protocol

Fetch domain commands, events and types for Chrome DevTools Protocol.

## Methods

::: pydoll.protocol.fetch.methods
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Events

::: pydoll.protocol.fetch.events
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Types

::: pydoll.protocol.fetch.types
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/api/protocol/input.md
================================================
# Input Protocol

Input domain commands, events and types for Chrome DevTools Protocol.

## Methods

::: pydoll.protocol.input.methods
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Events

::: pydoll.protocol.input.events
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Types

::: pydoll.protocol.input.types
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/api/protocol/network.md
================================================
# Network Protocol

Network domain commands and events for Chrome DevTools Protocol.

## Methods

::: pydoll.protocol.network.methods
    options:
      show_root_heading: false
      show_source: false
      heading_level: 2

## Events

::: pydoll.protocol.network.events
    options:
      show_root_heading: false
      show_source: false
      heading_level: 2

## Types

::: pydoll.protocol.network.types
    options:
      show_root_heading: false
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/api/protocol/page.md
================================================
# Page Protocol

Page domain commands, events and types for Chrome DevTools Protocol.

## Methods

::: pydoll.protocol.page.methods
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Events

::: pydoll.protocol.page.events
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Types

::: pydoll.protocol.page.types
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/api/protocol/runtime.md
================================================
# Runtime Protocol

Runtime domain commands, events and types for Chrome DevTools Protocol.

## Methods

::: pydoll.protocol.runtime.methods
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Events

::: pydoll.protocol.runtime.events
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Types

::: pydoll.protocol.runtime.types
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/api/protocol/storage.md
================================================
# Storage Protocol

Storage domain commands, events and types for Chrome DevTools Protocol.

## Methods

::: pydoll.protocol.storage.methods
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Events

::: pydoll.protocol.storage.events
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Types

::: pydoll.protocol.storage.types
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/api/protocol/target.md
================================================
# Target Protocol

Target domain commands and events for Chrome DevTools Protocol.

## Methods

::: pydoll.protocol.target.methods
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Events

::: pydoll.protocol.target.events
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

## Types

::: pydoll.protocol.target.types
    options:
      show_root_heading: true
      show_source: false
      heading_level: 2

================================================
FILE: docs/en/deep-dive/architecture/browser-domain.md
================================================
# Browser Domain Architecture

The Browser domain represents the highest level of Pydoll's automation hierarchy, managing the browser process lifecycle, CDP connections, context isolation, and global browser operations. This document explores the internal architecture, design decisions, and technical implementation of browser-level control.

!!! info "Practical Usage Guide"
    For practical examples and usage patterns, see the [Browser Management](../features/browser-management/tabs.md) and [Browser Contexts](../features/browser-management/contexts.md) guides.

## Architectural Overview

The Browser domain sits at the intersection of process management, protocol communication, and resource coordination. It orchestrates multiple specialized components to provide a unified interface for browser automation:

```mermaid
graph LR
    Browser[Browser Instance]
    Browser --> ProcessManager[Process Manager]
    Browser --> ProxyManager[Proxy Manager]
    Browser --> TempDirManager[Temp Directory Manager]
    Browser --> TabRegistry[Tab Registry]
    Browser --> ConnectionHandler[Connection Handler]
    
    ProcessManager --> |Manages| BrowserProcess[Browser Process]
    ConnectionHandler <--> |WebSocket| CDP[Chrome DevTools Protocol]
    TabRegistry --> |Manages| Tabs[Tab Instances]
    CDP <--> BrowserProcess
```

### Hierarchy and Abstraction

The Browser domain is implemented as an **abstract base class** that defines the contract for all browser implementations:

```python
class Browser(ABC):
    """Abstract base class for browser automation via CDP."""
    
    @abstractmethod
    def _get_default_binary_location(self) -> str:
        """Subclasses must provide browser-specific executable path."""
        pass
    
    async def start(self, headless: bool = False) -> Tab:
        """Concrete implementation shared by all browsers."""
        # 1. Resolve binary location
        # 2. Setup user data directory
        # 3. Start browser process
        # 4. Verify CDP connection
        # 5. Configure proxy (if needed)
        # 6. Return initial tab
```

This design enables **polymorphism** - Chrome, Edge, and other Chromium-based browsers share 99% of their code, differing only in executable paths and minor flag variations.

## Component Architecture

The Browser class coordinates several specialized managers, each responsible for a specific aspect of browser automation. Understanding these components is key to understanding Pydoll's design.

### Connection Handler

The ConnectionHandler is the **communication bridge** between Pydoll and the browser process. It manages:

- **WebSocket lifecycle**: Connection establishment, keep-alive, reconnection
- **Command execution**: Sending CDP commands and awaiting responses
- **Event dispatching**: Routing CDP events to registered callbacks
- **Callback registry**: Maintaining event listeners per connection

```python
class Browser:
    def __init__(self, ...):
        # ConnectionHandler is initialized with port or WebSocket address
        self._connection_handler = ConnectionHandler(self._connection_port)
    
    async def _execute_command(self, command, timeout=10):
        """All CDP commands flow through the connection handler."""
        return await self._connection_handler.execute_command(command, timeout)
```

!!! info "Connection Layer Deep Dive"
    For detailed information on WebSocket communication, command/response flow, and async patterns, see [Connection Layer Architecture](./connection-layer.md).

### Process Manager

The BrowserProcessManager handles **operating system process lifecycle**:

```python
class BrowserProcessManager:
    def start_browser_process(self, binary, port, arguments):
        """
        1. Constructs command-line with binary path + arguments
        2. Spawns subprocess with proper stdio handling
        3. Monitors process startup
        4. Stores process handle for later termination
        """
        
    def stop_process(self):
        """
        1. Attempts graceful termination (SIGTERM)
        2. Waits for process exit
        3. Force-kills if timeout exceeded (SIGKILL)
        4. Cleans up process resources
        """
```

**Why separate process management?**

- **Testability**: Process manager can be mocked for unit tests
- **Cross-platform**: Encapsulates OS-specific process handling
- **Reliability**: Handles edge cases like zombie processes, orphaned children

### Tab Registry

The Browser maintains a **registry of Tab instances** to ensure singleton behavior per target:

```python
class Browser:
    def __init__(self, ...):
        self._tabs_opened: dict[str, Tab] = {}
    
    async def new_tab(self, url='', browser_context_id=None) -> Tab:
        # Create target via CDP
        response = await self._execute_command(
            TargetCommands.create_target(browser_context_id=browser_context_id)
        )
        target_id = response['result']['targetId']
        
        # Check if tab already exists in registry
        if target_id in self._tabs_opened:
            return self._tabs_opened[target_id]
        
        # Create new Tab instance and register it
        tab = Tab(self, target_id=target_id, ...)
        self._tabs_opened[target_id] = tab
        return tab
```

**Why singleton Tab instances?**

- **State consistency**: Multiple references to same tab share state (enabled domains, callbacks)
- **Memory efficiency**: Prevents duplicate Tab instances for same target
- **Event routing**: Ensures events route to correct Tab instance

### Proxy Authentication Architecture

Pydoll implements **automatic proxy authentication** via the Fetch domain to avoid exposing credentials in CDP commands. The implementation uses **two distinct mechanisms** depending on proxy scope:

#### Mechanism 1: Browser-Level Proxy Auth (Global Proxy)

When a proxy is configured via `ChromiumOptions` (applies to all tabs in the default context):

```python
# In Browser.start() -> _configure_proxy()
async def _configure_proxy(self, private_proxy, proxy_credentials):
    # Enable Fetch AT BROWSER LEVEL
    await self.enable_fetch_events(handle_auth_requests=True)
    
    # Register callbacks AT BROWSER LEVEL (affects ALL tabs)
    await self.on(FetchEvent.REQUEST_PAUSED, self._continue_request_callback, temporary=True)
    await self.on(FetchEvent.AUTH_REQUIRED, 
                  partial(self._continue_request_with_auth_callback,
                          proxy_username=credentials[0],
                          proxy_password=credentials[1]),
                  temporary=True)
```

**Scope:** Browser-wide WebSocket connection → affects **all tabs in default context**

#### Mechanism 2: Tab-Level Proxy Auth (Per-Context Proxy)

When a proxy is configured per-context via `create_browser_context(proxy_server=...)`:

```python
# Store credentials per context
async def create_browser_context(self, proxy_server, ...):
    sanitized_proxy, extracted_auth = self._sanitize_proxy_and_extract_auth(proxy_server)
    
    response = await self._execute_command(
        TargetCommands.create_browser_context(proxy_server=sanitized_proxy)
    )
    context_id = response['result']['browserContextId']
    
    if extracted_auth:
        self._context_proxy_auth[context_id] = extracted_auth  # Store per context
    
    return context_id

# Setup auth for EACH tab in that context
async def _setup_context_proxy_auth_for_tab(self, tab, browser_context_id):
    creds = self._context_proxy_auth.get(browser_context_id)
    if not creds:
        return
    
    # Enable Fetch ON THE TAB (tab-level WebSocket)
    await tab.enable_fetch_events(handle_auth=True)
    
    # Register callbacks ON THE TAB (affects only this tab)
    await tab.on(FetchEvent.REQUEST_PAUSED, 
                 partial(self._tab_continue_request_callback, tab=tab), 
                 temporary=True)
    await tab.on(FetchEvent.AUTH_REQUIRED,
                 partial(self._tab_continue_request_with_auth_callback,
                         tab=tab,
                         proxy_username=creds[0],
                         proxy_password=creds[1]),
                 temporary=True)
```

**Scope:** Tab-level WebSocket connection → affects **only that specific tab**

#### Why Two Mechanisms?

| Aspect | Browser-Level | Tab-Level |
|--------|---------------|-----------|
| **Trigger** | Proxy in `ChromiumOptions` | Proxy in `create_browser_context()` |
| **WebSocket** | Browser-level connection | Tab-level connection |
| **Scope** | All tabs in default context | Only tabs in that context |
| **Efficiency** | One listener for all tabs | One listener per tab |
| **Isolation** | No context separation | Each context has different credentials |

**Design rationale for tab-level auth:**

- **Context isolation**: Each context can have a **different proxy** with **different credentials**
- **CDP limitation**: Fetch domain cannot be scoped to a specific context at browser level
- **Tradeoff**: Slightly less efficient (one listener per tab), but necessary for per-context proxy support

This architecture ensures **credentials never appear in CDP logs** and authentication is handled transparently.

!!! warning "Fetch Domain Side Effects"
    - **Browser-level Fetch**: Temporarily pauses **all requests across all tabs** in the default context until auth completes
    - **Tab-level Fetch**: Temporarily pauses **all requests in that specific tab** until auth completes
    
    This is a CDP limitation - Fetch enables request interception. After authentication completes, Fetch is disabled to minimize overhead.

## Initialization and Lifecycle

### Constructor Design

The Browser constructor initializes all internal components but **does not start the browser process**. This separation allows configuration before launch:

```python
class Browser(ABC):
    def __init__(
        self,
        options_manager: BrowserOptionsManager,
        connection_port: Optional[int] = None,
    ):
        # 1. Validate parameters
        self._validate_connection_port(connection_port)
        
        # 2. Initialize options via manager
        self.options = options_manager.initialize_options()
        
        # 3. Determine CDP port (random if not specified)
        self._connection_port = connection_port or randint(9223, 9322)
        
        # 4. Initialize specialized managers
        self._proxy_manager = ProxyManager(self.options)
        self._browser_process_manager = BrowserProcessManager()
        self._temp_directory_manager = TempDirectoryManager()
        self._connection_handler = ConnectionHandler(self._connection_port)
        
        # 5. Initialize state tracking
        self._tabs_opened: dict[str, Tab] = {}
        self._context_proxy_auth: dict[str, tuple[str, str]] = {}
        self._ws_address: Optional[str] = None
```

**Key design decisions:**

- **Lazy process start**: Constructor is synchronous; `start()` is async
- **Port flexibility**: Random port prevents collisions in parallel automation
- **Options manager pattern**: Strategy pattern for browser-specific configuration
- **Component composition**: Specialized managers instead of monolithic class

### Start Sequence

The `start()` method orchestrates browser launch and connection:

```python
async def start(self, headless: bool = False) -> Tab:
    # 1. Resolve binary location
    binary_location = self.options.binary_location or self._get_default_binary_location()
    
    # 2. Setup user data directory (temp or persistent)
    self._setup_user_dir()
    
    # 3. Extract proxy credentials (if private proxy)
    proxy_config = self._proxy_manager.get_proxy_credentials()
    
    # 4. Start browser process with arguments
    self._browser_process_manager.start_browser_process(
        binary_location, self._connection_port, self.options.arguments
    )
    
    # 5. Verify CDP endpoint is responsive
    await self._verify_browser_running()
    
    # 6. Configure proxy authentication (via Fetch domain)
    await self._configure_proxy(proxy_config[0], proxy_config[1])
    
    # 7. Get first valid target and create Tab
    valid_tab_id = await self._get_valid_tab_id(await self.get_targets())
    tab = Tab(self, target_id=valid_tab_id, connection_port=self._connection_port)
    self._tabs_opened[valid_tab_id] = tab
    
    return tab
```

!!! tip "Why start() Returns a Tab"
    This is a **design compromise** for ergonomics. Ideally, `start()` would only launch the browser, and users would call `new_tab()` separately. However, returning the initial tab reduces boilerplate for the 90% use case (single-tab automation). The tradeoff: the initial tab cannot be avoided even in multi-tab scenarios.

### Context Manager Protocol

The Browser implements `__aenter__` and `__aexit__` for automatic cleanup:

```python
async def __aexit__(self, exc_type, exc_val, exc_tb):
    # 1. Restore backup preferences (if modified)
    if self._backup_preferences_dir:
        shutil.copy2(self._backup_preferences_dir, ...)
    
    # 2. Check if browser is still running
    if await self._is_browser_running(timeout=2):
        await self.stop()
    
    # 3. Close WebSocket connection
    await self._connection_handler.close()
```

This ensures proper cleanup even if exceptions occur during automation.

## Browser Context Architecture

Browser contexts are Pydoll's most sophisticated isolation mechanism, providing **complete browsing environment separation** within a single browser process. Understanding their architecture is essential for advanced automation.

### CDP Hierarchy: Browser, Context, Target

CDP organizes browser structure into three levels:

```mermaid
graph TB
    Browser[Browser Process]
    Browser --> DefaultContext[Default BrowserContext]
    Browser --> Context1[BrowserContext ID: abc-123]
    Browser --> Context2[BrowserContext ID: def-456]
    
    DefaultContext --> Target1[Target/Page ID: page-1]
    DefaultContext --> Target2[Target/Page ID: page-2]
    
    Context1 --> Target3[Target/Page ID: page-3]
    
    Context2 --> Target4[Target/Page ID: page-4]
    Context2 --> Target5[Target/Page ID: page-5]
```

**Key concepts:**

1. **Browser Process**: Single Chromium instance with one CDP endpoint
2. **BrowserContext**: Isolated storage/cache/permission boundary (similar to incognito mode)
3. **Target**: Individual page, popup, worker, or background target

### Context Isolation Boundaries

Each browser context maintains **strict isolation** for:

| Resource | Isolation Level | Implementation |
|----------|----------------|----------------|
| Cookies | Full | Separate cookie jar per context |
| localStorage | Full | Separate storage per origin per context |
| IndexedDB | Full | Separate database per origin per context |
| Cache | Full | Independent HTTP cache per context |
| Permissions | Full | Context-specific permission grants |
| Network proxy | Full | Per-context proxy configuration |
| Authentication | Full | Independent auth state per context |

!!! info "Why Contexts Are Lightweight"
    Unlike launching multiple browser processes, contexts share the **rendering engine, GPU process, and network stack**. Only storage and state are isolated. This makes contexts 10-100x faster to create than new browser instances.

### Context Creation and Target Binding

Creating a context and target involves two CDP commands:

```python
# Step 1: Create isolated browsing context
response = await self._execute_command(
    TargetCommands.create_browser_context(
        proxy_server='http://proxy.example.com:8080',
        proxy_bypass_list='localhost,127.0.0.1'
    )
)
context_id = response['result']['browserContextId']

# Step 2: Create target (page) within that context
response = await self._execute_command(
    TargetCommands.create_target(
        browser_context_id=context_id  # Binds target to context
    )
)
target_id = response['result']['targetId']
```

**Critical detail:** The `browser_context_id` parameter **binds the target to the context's isolation boundary**. Without it, the target is created in the default context.

### Window Materialization in Headed Mode

In **headed mode** (visible UI), browser contexts have an important physical constraint:

- A context initially exists only **in memory** (no window)
- The **first target** created in a context **must** open a top-level window
- **Subsequent targets** can open as tabs within that window

This is a **CDP/Chromium limitation**, not a Pydoll design choice:

```python
# First target in context: MUST create window
tab1 = await browser.new_tab(browser_context_id=context_id)  # Opens new window

# Subsequent targets: CAN open as tabs in existing window
tab2 = await browser.new_tab(browser_context_id=context_id)  # Opens as tab
```

**Why does this matter?**

- In **headless mode**: Completely irrelevant (no windows rendered)
- In **headed mode**: First target per context will open a visible window
- In **test environments**: Multiple contexts → multiple windows (can be confusing)

!!! tip "Headless Contexts Are Cleaner"
    For CI/CD, scraping, or batch automation, use headless mode. Context isolation works identically, but without window materialization overhead.

### Context Deletion and Cleanup

Deleting a context **immediately closes all targets** within it:

```python
await browser.delete_browser_context(context_id)
# All tabs in this context are now closed
# All storage for this context is cleared
# Context cannot be reused (ID is invalid)
```

**Cleanup sequence:**

1. CDP sends `Target.disposeBrowserContext` command
2. Browser closes all targets in that context
3. Browser clears all storage for that context
4. Browser invalidates the context ID
5. Pydoll removes context from internal registries

## Event System at Browser Level

The Browser domain supports **browser-wide event listeners** that operate across all tabs and contexts. This is distinct from tab-level events.

### Browser vs Tab Event Scope

```python
# Browser-level event: applies to ALL tabs
await browser.on('Target.targetCreated', handle_new_target)

# Tab-level event: applies to ONE tab
await tab.on('Page.loadEventFired', handle_page_load)
```

**Architectural difference:**

- **Browser events** use the **browser-level WebSocket connection** (port-based or `ws://host/devtools/browser/...`)
- **Tab events** use **tab-level WebSocket connections** (`ws://host/devtools/page/<target_id>`)

### Fetch Domain: Global Request Interception

The Fetch domain can be enabled at **both** browser and tab levels, with different scopes:

```python
# Browser-level Fetch: intercepts requests for ALL tabs
await browser.enable_fetch_events(handle_auth_requests=True)
await browser.on('Fetch.requestPaused', handle_request)

# Tab-level Fetch: intercepts requests for ONE tab
await tab.enable_fetch_events(handle_auth_requests=True)
await tab.on('Fetch.requestPaused', handle_request)
```

**When to use each:**

| Use Case | Level | Reason |
|----------|-------|--------|
| Proxy authentication | Browser | Applies globally to all contexts |
| Ad blocking | Browser | Block ads across all tabs |
| API mocking | Tab | Mock specific API for specific test |
| Request logging | Tab | Log only relevant tab's requests |

!!! warning "Fetch Performance Impact"
    Enabling Fetch at the browser level **pauses all requests** across all tabs until callbacks execute. This adds latency to every request. Use tab-level Fetch when possible to minimize impact.

### Command Routing

All CDP commands flow through the Browser's connection handler:

```python
async def _execute_command(self, command, timeout=10):
    """
    Routes command to appropriate connection:
    - Browser-level commands → browser WebSocket
    - Tab-level commands → delegated to Tab instance
    """
    return await self._connection_handler.execute_command(command, timeout)
```

This centralized routing enables:

- **Request/response correlation**: Match responses to requests via ID
- **Timeout management**: Cancel commands that exceed timeout
- **Error handling**: Convert CDP errors to Python exceptions

## Resource Management

### Cookie and Storage Operations

The Browser domain exposes **browser-wide** and **context-specific** storage operations:

```python
# Browser-level operations (all contexts)
await browser.set_cookies(cookies)
await browser.get_cookies()
await browser.delete_all_cookies()

# Context-specific operations
await browser.set_cookies(cookies, browser_context_id=context_id)
await browser.get_cookies(browser_context_id=context_id)
await browser.delete_all_cookies(browser_context_id=context_id)
```

These operations use the **Storage domain** under the hood:

- `Storage.getCookies`: Retrieve cookies for context or all contexts
- `Storage.setCookies`: Set cookies with domain/path/expiry
- `Storage.clearCookies`: Clear cookies for context or all contexts

!!! info "Browser vs Tab Storage Scope"
    - **Browser-level**: Operates on entire browser or specific context
    - **Tab-level**: Scoped to tab's current origin
    
    Use browser-level for global cookie management (e.g., setting session cookies for all domains). Use tab-level for origin-specific operations (e.g., clearing cookies after logout).

### Permission Grants

The Browser domain provides **programmatic permission control**, bypassing browser prompts:

```python
await browser.grant_permissions(
    [PermissionType.GEOLOCATION, PermissionType.NOTIFICATIONS],
    origin='https://example.com',
    browser_context_id=context_id
)
```

**Architecture:**

- Permissions are granted via the `Browser.grantPermissions` CDP command
- Permissions are **context-specific** (isolated per context)
- Grants override default prompt behavior
- `reset_permissions()` reverts to default behavior

### Download Management

Download behavior is configured via the `Browser.setDownloadBehavior` command:

```python
await browser.set_download_behavior(
    behavior=DownloadBehavior.ALLOW,
    download_path='/path/to/downloads',
    events_enabled=True,  # Emit download progress events
    browser_context_id=context_id
)
```

**Options:**

- `ALLOW`: Save to specified path
- `DENY`: Cancel all downloads
- `DEFAULT`: Show browser's default download UI

### Window Management

Window operations apply to the **physical OS window** of a target:

```python
window_id = await browser.get_window_id_for_target(target_id)
await browser.set_window_bounds({
    'left': 100, 'top': 100,
    'width': 1920, 'height': 1080,
    'windowState': 'normal'  # or 'minimized', 'maximized', 'fullscreen'
})
```

**Implementation details:**

- Uses `Browser.getWindowForTarget` to resolve window ID from target ID
- `Browser.setWindowBounds` modifies window geometry
- **Headless mode**: Window operations are no-ops (no physical windows exist)

## Architectural Insights and Design Tradeoffs

### Singleton Tab Registry: Why?

The tab registry pattern (`_tabs_opened: dict[str, Tab]`) ensures that:

1. **Event routing works correctly**: CDP events contain a `targetId` but no Tab reference. The registry maps `targetId` → `Tab` for correct callback dispatch.
2. **State consistency**: Multiple code paths that reference the same target get the **same Tab instance**, preventing state divergence.
3. **Memory efficiency**: Without the registry, `get_opened_tabs()` would create duplicate Tab instances for every call.

**Tradeoff:** Memory usage grows with tab count, but this is unavoidable for stateful Tab instances.

### Why start() Returns a Tab

This design decision sacrifices purity for **ergonomics**:

- **Downside**: Initial tab cannot be avoided, even in multi-tab automation
- **Upside**: 90% of users (single-tab scripts) don't need boilerplate:

```python
# With start() returning Tab
tab = await browser.start()

# Without (pure design)
await browser.start()
tab = await browser.new_tab()
```

**Alternative explored:** Auto-close initial tab in `new_tab()`. Rejected because it's surprising behavior (implicit side effects).

### Proxy Authentication: Two-Level Architecture Tradeoff

Pydoll's proxy authentication uses two different Fetch domain strategies:

**Browser-Level (Global Proxy):**
- **Security benefit**: Credentials never logged in CDP traces
- **Performance cost**: Fetch pauses **all requests across all tabs** until auth completes
- **Efficiency**: Single listener for all tabs in default context
- **Mitigation**: Fetch is disabled after first auth, minimizing overhead

**Tab-Level (Per-Context Proxy):**
- **Security benefit**: Credentials never logged in CDP traces
- **Performance cost**: Fetch pauses **all requests in that tab** until auth completes
- **Efficiency**: Separate listener per tab (less efficient, but necessary for isolation)
- **Isolation benefit**: Each context can have different proxy credentials
- **Mitigation**: Fetch is disabled after first auth per tab

**Why not use Browser.setProxyAuth?** This CDP command doesn't exist. Fetch is the only mechanism for programmatic auth.

**Why tab-level for contexts?** CDP's Fetch domain cannot be scoped to a specific BrowserContext. Since each context can have a different proxy with different credentials, Pydoll must handle auth at the tab level to respect context boundaries.

### Port Randomization Strategy

Random CDP ports (9223-9322) prevent collisions when running parallel browser instances:

```python
self._connection_port = connection_port or randint(9223, 9322)
```

**Why not increment from 9222?**

- Race conditions in multi-process environments (e.g., pytest-xdist)
- Collision with user's manual port selection

**Tradeoff:** Random ports are harder to debug (can't hardcode). Solution: `browser._connection_port` exposes the chosen port.

### Component Separation: Why Managers?

The Browser class delegates to specialized managers (ProcessManager, ProxyManager, TempDirManager, ConnectionHandler) for:

1. **Testability**: Managers can be mocked independently
2. **Reusability**: ProxyManager logic shared across Browser implementations
3. **Maintainability**: Each manager has single responsibility
4. **Cross-platform**: OS-specific logic isolated in ProcessManager

**Tradeoff:** More indirection, but significantly better code organization at scale.

## Key Takeaways

1. **Browser is a coordinator**, not a monolith. It orchestrates managers and handles CDP communication.
2. **Tab registry ensures singleton instances** per target, critical for event routing and state consistency.
3. **Browser contexts are lightweight isolation**, sharing browser process but separating storage/cache/auth.
4. **Proxy auth via Fetch** is a security tradeoff - hides credentials but adds latency.
5. **Event system has two levels**: Browser-wide and tab-specific, with different WebSocket connections.
6. **Component separation** (managers) improves testability and cross-platform support.

## Related Documentation

For deeper understanding of related architectural components:

- **[Connection Layer](./connection-layer.md)**: WebSocket communication, command/response flow, async patterns
- **[Event Architecture](./event-architecture.md)**: Event dispatch, callback management, domain enabling
- **[Tab Domain](./tab-domain.md)**: Tab-level operations, page navigation, element finding
- **[CDP Deep Dive](./cdp.md)**: Chrome DevTools Protocol fundamentals
- **[Proxy Architecture](./proxy-architecture.md)**: Network-level proxy concepts and implementation

For practical usage patterns:

- **[Tab Management](../features/browser-management/tabs.md)**: Multi-tab automation patterns
- **[Browser Contexts](../features/browser-management/contexts.md)**: Context isolation in practice
- **[Proxy Configuration](../features/configuration/proxy.md)**: Setting up proxies and authentication


================================================
FILE: docs/en/deep-dive/architecture/browser-requests-architecture.md
================================================
# Browser-Context Requests Architecture

This document explores the architectural design of Pydoll's browser-context HTTP request system, which enables making HTTP requests that seamlessly inherit the browser's session state, cookies, and authentication.

!!! info "Practical Guide Available"
    This is the architectural deep dive. For practical examples and use cases, see [HTTP Requests Guide](../features/network/http-requests.md).

## Architectural Overview

Browser-context requests solve a fundamental problem in hybrid automation: maintaining session continuity between UI interactions and API calls. Traditional approaches require manually extracting cookies and headers, creating fragile coupling between browser and HTTP client.

Pydoll's architecture eliminates this complexity by executing HTTP requests **inside** the browser's JavaScript context, while leveraging CDP network events to capture comprehensive metadata that JavaScript alone cannot provide.

### Why This Architecture?

| Traditional Approach | Pydoll Architecture |
|---------------------|---------------------|
| Separate HTTP client (requests, aiohttp) | Unified browser-based execution |
| Manual cookie extraction and sync | Automatic cookie inheritance |
| Two separate session states | Single session state |
| Limited CORS handling | Browser-native CORS enforcement |
| Complex authentication flows | Transparent auth preservation |


## Component Architecture

The browser-context request system consists of two primary classes that work together with Pydoll's event system:

```mermaid
classDiagram
    class Tab {
        +request: Request
        +enable_network_events()
        +disable_network_events()
        +get_network_response_body()
        +on(event_name, callback)
        +clear_callbacks()
    }
    
    class Request {
        -tab: Tab
        -_network_events_enabled: bool
        -_requests_sent: list
        -_requests_received: list
        +get(url, params, kwargs)
        +post(url, data, json, kwargs)
        +put(url, data, json, kwargs)
        +patch(url, data, json, kwargs)
        +delete(url, kwargs)
        +head(url, kwargs)
        +options(url, kwargs)
        -_execute_fetch_request()
        -_register_callbacks()
        -_extract_headers()
        -_extract_cookies()
    }
    
    class Response {
        -_status_code: int
        -_content: bytes
        -_text: str
        -_json: dict
        -_response_headers: list
        -_request_headers: list
        -_cookies: list
        -_url: str
        +ok: bool
        +status_code: int
        +text: str
        +content: bytes
        +url: str
        +headers: list
        +request_headers: list
        +cookies: list
        +json()
        +raise_for_status()
    }
    
    Tab *-- Request
    Request ..> Response : creates
    Request ..> Tab : uses events
```

### Request Class

The `Request` class serves as the interface layer, providing a familiar `requests`-like API while orchestrating the complex interaction between JavaScript execution and network event monitoring.

**Key Responsibilities:**

- Translate Python method calls to Fetch API JavaScript
- Manage temporary network event listeners
- Accumulate network events during request execution
- Extract metadata from CDP events
- Construct Response objects with complete information

### Response Class

The `Response` class provides a `requests.Response`-compatible interface, making migration from traditional HTTP clients seamless.

**Key Features:**

- Multiple content accessors (text, bytes, JSON)
- Lazy JSON parsing with caching
- Comprehensive header information (both sent and received)
- Cookie extraction from Set-Cookie headers
- Final URL after redirects

## Execution Flow

The request execution follows a six-phase pipeline:

```mermaid
flowchart TD
    Start([tab.request.get#40;url#41;]) --> Phase1[<b>1. Preparation</b><br/>Build URL + options]
    
    Phase1 --> Phase2[<b>2. Event Registration</b><br/>Enable network events<br/>Register callbacks]
    
    Phase2 --> Phase3[<b>3. JavaScript Execution</b><br/>Runtime.evaluate&#40;fetch&#41;]
    
    Phase3 --> Phase4{<b>4. Network Activity</b>}
    Phase4 -->|Request sent| Event1[REQUEST_WILL_BE_SENT]
    Phase4 -->|Response received| Event2[RESPONSE_RECEIVED]
    Phase4 -->|Extra info| Event3[*_EXTRA_INFO events]
    
    Event1 --> Collect[Collect metadata]
    Event2 --> Collect
    Event3 --> Collect
    
    Collect --> Phase5[<b>5. Construction</b><br/>Extract headers/cookies<br/>Build Response object]
    
    Phase5 --> Phase6[<b>6. Cleanup</b><br/>Clear callbacks<br/>Disable events]
    
    Phase6 --> End([Return Response])
```

### Phase Details

| Phase | Layer | Key Operations | Asynchronous |
|-------|-------|----------------|--------------|
| **1. Preparation** | Request | URL building, options formatting | No |
| **2. Event Registration** | Tab | Enable events, register callbacks | Yes |
| **3. JavaScript Execution** | CDP/Browser | Execute fetch() in browser context | Yes |
| **4. Network Activity** | Browser/CDP | HTTP request, emit CDP events | Yes (parallel) |
| **5. Construction** | Request | Parse events, build Response | No |
| **6. Cleanup** | Tab | Remove callbacks, disable events | Yes |

## Event System Integration

Browser-context requests are tightly integrated with Pydoll's event system architecture. Understanding this relationship is crucial.

### Temporary Event Lifecycle

```mermaid
stateDiagram-v2
    [*] --> NoEvents: Request starts
    NoEvents --> EventsEnabled: Enable network events
    EventsEnabled --> CallbacksRegistered: Register callbacks
    CallbacksRegistered --> ExecutingRequest: Execute fetch
    ExecutingRequest --> CapturingEvents: Events fire
    CapturingEvents --> ExecutingRequest: More events
    ExecutingRequest --> CleaningUp: Fetch completes
    CleaningUp --> CallbacksRemoved: Clear callbacks
    CallbacksRemoved --> EventsDisabled: Disable if needed
    EventsDisabled --> [*]: Request complete
```

### Why Both JavaScript and Events?

A common question: if JavaScript can execute the request, why use network events?

| Information Source | JavaScript (Fetch API) | Network Events (CDP) |
|-------------------|------------------------|----------------------|
| Response status | Available | Available |
| Response body | Available | Not available |
| Response headers | Partial (CORS restricted) | Complete |
| Request headers | Not accessible | Complete |
| Set-Cookie headers | Hidden by browser | Available |
| Timing information | Limited | Comprehensive |
| Redirect chain | Only final URL | Full chain |

**The Solution:** Combine both sources for complete information.

!!! tip "Complementary Technologies"
    JavaScript provides the response body and triggers the request in the browser's context (with cookies, auth). Network events provide the metadata that JavaScript security policies hide.

### CDP Network Event Types

The architecture uses four CDP event types to capture complete metadata:

| Event | Purpose | Key Information |
|-------|---------|----------------|
| `REQUEST_WILL_BE_SENT` | Main outgoing request | URL, method, standard headers |
| `REQUEST_WILL_BE_SENT_EXTRA_INFO` | Additional request metadata | Associated cookies, raw headers |
| `RESPONSE_RECEIVED` | Main response received | Status, headers, MIME type, timing |
| `RESPONSE_RECEIVED_EXTRA_INFO` | Additional response metadata | Set-Cookie headers, security info |

!!! info "Event Multiplicity"
    A single HTTP request generates multiple CDP events. The Request class accumulates all related events and extracts non-duplicate information during the construction phase.

## Header and Cookie Architecture

### Header Extraction Strategy

Headers exist in multiple CDP event
Download .txt
gitextract_ulcsxv0t/

├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── documentation.yml
│   │   ├── feature_request.yml
│   │   └── refactoring.yml
│   ├── PULL_REQUEST_TEMPLATE/
│   │   ├── bug_fix.md
│   │   ├── refactoring.md
│   │   └── release.md
│   ├── pull_request_template.md
│   └── workflows/
│       ├── deploy-docs.yml
│       ├── mypy.yml
│       ├── publish.yml
│       ├── release.yml
│       ├── ruff-ci.yml
│       └── tests.yml
├── .gitignore
├── .python-version
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── README_zh.md
├── SPONSORS.md
├── codecov.yml
├── cz.yaml
├── docs/
│   ├── en/
│   │   ├── api/
│   │   │   ├── browser/
│   │   │   │   ├── chrome.md
│   │   │   │   ├── edge.md
│   │   │   │   ├── managers.md
│   │   │   │   ├── options.md
│   │   │   │   ├── requests.md
│   │   │   │   └── tab.md
│   │   │   ├── commands/
│   │   │   │   ├── browser.md
│   │   │   │   ├── dom.md
│   │   │   │   ├── fetch.md
│   │   │   │   ├── index.md
│   │   │   │   ├── input.md
│   │   │   │   ├── network.md
│   │   │   │   ├── page.md
│   │   │   │   ├── runtime.md
│   │   │   │   ├── storage.md
│   │   │   │   └── target.md
│   │   │   ├── connection/
│   │   │   │   ├── connection.md
│   │   │   │   └── managers.md
│   │   │   ├── core/
│   │   │   │   ├── constants.md
│   │   │   │   ├── exceptions.md
│   │   │   │   └── utils.md
│   │   │   ├── elements/
│   │   │   │   ├── mixins.md
│   │   │   │   ├── shadow_root.md
│   │   │   │   └── web_element.md
│   │   │   ├── index.md
│   │   │   └── protocol/
│   │   │       ├── base.md
│   │   │       ├── browser.md
│   │   │       ├── dom.md
│   │   │       ├── fetch.md
│   │   │       ├── input.md
│   │   │       ├── network.md
│   │   │       ├── page.md
│   │   │       ├── runtime.md
│   │   │       ├── storage.md
│   │   │       └── target.md
│   │   ├── deep-dive/
│   │   │   ├── architecture/
│   │   │   │   ├── browser-domain.md
│   │   │   │   ├── browser-requests-architecture.md
│   │   │   │   ├── event-architecture.md
│   │   │   │   ├── find-elements-mixin.md
│   │   │   │   ├── index.md
│   │   │   │   ├── shadow-dom.md
│   │   │   │   ├── tab-domain.md
│   │   │   │   └── webelement-domain.md
│   │   │   ├── fingerprinting/
│   │   │   │   ├── behavioral-fingerprinting.md
│   │   │   │   ├── browser-fingerprinting.md
│   │   │   │   ├── evasion-techniques.md
│   │   │   │   ├── index.md
│   │   │   │   └── network-fingerprinting.md
│   │   │   ├── fundamentals/
│   │   │   │   ├── cdp.md
│   │   │   │   ├── connection-layer.md
│   │   │   │   ├── iframes-and-contexts.md
│   │   │   │   ├── index.md
│   │   │   │   └── typing-system.md
│   │   │   ├── guides/
│   │   │   │   ├── index.md
│   │   │   │   └── selectors-guide.md
│   │   │   ├── index.md
│   │   │   └── network/
│   │   │       ├── build-proxy.md
│   │   │       ├── http-proxies.md
│   │   │       ├── index.md
│   │   │       ├── network-fundamentals.md
│   │   │       ├── proxy-detection.md
│   │   │       ├── proxy-legal.md
│   │   │       └── socks-proxies.md
│   │   ├── features/
│   │   │   ├── advanced/
│   │   │   │   ├── behavioral-captcha-bypass.md
│   │   │   │   ├── decorators.md
│   │   │   │   ├── event-system.md
│   │   │   │   └── remote-connections.md
│   │   │   ├── automation/
│   │   │   │   ├── file-operations.md
│   │   │   │   ├── human-interactions.md
│   │   │   │   ├── iframes.md
│   │   │   │   ├── keyboard-control.md
│   │   │   │   ├── mouse-control.md
│   │   │   │   └── screenshots-and-pdfs.md
│   │   │   ├── browser-management/
│   │   │   │   ├── contexts.md
│   │   │   │   ├── cookies-sessions.md
│   │   │   │   └── tabs.md
│   │   │   ├── configuration/
│   │   │   │   ├── browser-options.md
│   │   │   │   ├── browser-preferences.md
│   │   │   │   └── proxy.md
│   │   │   ├── core-concepts.md
│   │   │   ├── element-finding.md
│   │   │   ├── index.md
│   │   │   └── network/
│   │   │       ├── http-requests.md
│   │   │       ├── interception.md
│   │   │       ├── monitoring.md
│   │   │       └── network-recording.md
│   │   └── index.md
│   ├── pt/
│   │   ├── api/
│   │   │   ├── browser/
│   │   │   │   ├── chrome.md
│   │   │   │   ├── edge.md
│   │   │   │   ├── managers.md
│   │   │   │   ├── options.md
│   │   │   │   ├── requests.md
│   │   │   │   └── tab.md
│   │   │   ├── commands/
│   │   │   │   ├── browser.md
│   │   │   │   ├── dom.md
│   │   │   │   ├── fetch.md
│   │   │   │   ├── index.md
│   │   │   │   ├── input.md
│   │   │   │   ├── network.md
│   │   │   │   ├── page.md
│   │   │   │   ├── runtime.md
│   │   │   │   ├── storage.md
│   │   │   │   └── target.md
│   │   │   ├── connection/
│   │   │   │   ├── connection.md
│   │   │   │   └── managers.md
│   │   │   ├── core/
│   │   │   │   ├── constants.md
│   │   │   │   ├── exceptions.md
│   │   │   │   └── utils.md
│   │   │   ├── elements/
│   │   │   │   ├── mixins.md
│   │   │   │   ├── shadow_root.md
│   │   │   │   └── web_element.md
│   │   │   ├── index.md
│   │   │   └── protocol/
│   │   │       ├── base.md
│   │   │       ├── browser.md
│   │   │       ├── dom.md
│   │   │       ├── fetch.md
│   │   │       ├── input.md
│   │   │       ├── network.md
│   │   │       ├── page.md
│   │   │       ├── runtime.md
│   │   │       ├── storage.md
│   │   │       └── target.md
│   │   ├── deep-dive/
│   │   │   ├── architecture/
│   │   │   │   ├── browser-domain.md
│   │   │   │   ├── browser-requests-architecture.md
│   │   │   │   ├── event-architecture.md
│   │   │   │   ├── find-elements-mixin.md
│   │   │   │   ├── index.md
│   │   │   │   ├── shadow-dom.md
│   │   │   │   ├── tab-domain.md
│   │   │   │   └── webelement-domain.md
│   │   │   ├── fingerprinting/
│   │   │   │   ├── behavioral-fingerprinting.md
│   │   │   │   ├── browser-fingerprinting.md
│   │   │   │   ├── evasion-techniques.md
│   │   │   │   ├── index.md
│   │   │   │   └── network-fingerprinting.md
│   │   │   ├── fundamentals/
│   │   │   │   ├── cdp.md
│   │   │   │   ├── connection-layer.md
│   │   │   │   ├── iframes-and-contexts.md
│   │   │   │   ├── index.md
│   │   │   │   └── typing-system.md
│   │   │   ├── guides/
│   │   │   │   ├── index.md
│   │   │   │   └── selectors-guide.md
│   │   │   ├── index.md
│   │   │   └── network/
│   │   │       ├── build-proxy.md
│   │   │       ├── http-proxies.md
│   │   │       ├── index.md
│   │   │       ├── network-fundamentals.md
│   │   │       ├── proxy-detection.md
│   │   │       ├── proxy-legal.md
│   │   │       └── socks-proxies.md
│   │   ├── features/
│   │   │   ├── advanced/
│   │   │   │   ├── behavioral-captcha-bypass.md
│   │   │   │   ├── decorators.md
│   │   │   │   ├── event-system.md
│   │   │   │   └── remote-connections.md
│   │   │   ├── automation/
│   │   │   │   ├── file-operations.md
│   │   │   │   ├── human-interactions.md
│   │   │   │   ├── iframes.md
│   │   │   │   ├── keyboard-control.md
│   │   │   │   ├── mouse-control.md
│   │   │   │   └── screenshots-and-pdfs.md
│   │   │   ├── browser-management/
│   │   │   │   ├── contexts.md
│   │   │   │   ├── cookies-sessions.md
│   │   │   │   └── tabs.md
│   │   │   ├── configuration/
│   │   │   │   ├── browser-options.md
│   │   │   │   ├── browser-preferences.md
│   │   │   │   └── proxy.md
│   │   │   ├── core-concepts.md
│   │   │   ├── element-finding.md
│   │   │   ├── index.md
│   │   │   └── network/
│   │   │       ├── http-requests.md
│   │   │       ├── interception.md
│   │   │       ├── monitoring.md
│   │   │       └── network-recording.md
│   │   └── index.md
│   ├── resources/
│   │   ├── scripts/
│   │   │   ├── extra.js
│   │   │   └── termynal.js
│   │   └── stylesheets/
│   │       ├── extra.css
│   │       └── termynal.css
│   └── zh/
│       ├── api/
│       │   ├── browser/
│       │   │   ├── chrome.md
│       │   │   ├── edge.md
│       │   │   ├── managers.md
│       │   │   ├── options.md
│       │   │   ├── requests.md
│       │   │   └── tab.md
│       │   ├── commands/
│       │   │   ├── browser.md
│       │   │   ├── dom.md
│       │   │   ├── fetch.md
│       │   │   ├── index.md
│       │   │   ├── input.md
│       │   │   ├── network.md
│       │   │   ├── page.md
│       │   │   ├── runtime.md
│       │   │   ├── storage.md
│       │   │   └── target.md
│       │   ├── connection/
│       │   │   ├── connection.md
│       │   │   └── managers.md
│       │   ├── core/
│       │   │   ├── constants.md
│       │   │   ├── exceptions.md
│       │   │   └── utils.md
│       │   ├── elements/
│       │   │   ├── mixins.md
│       │   │   ├── shadow_root.md
│       │   │   └── web_element.md
│       │   ├── index.md
│       │   └── protocol/
│       │       ├── base.md
│       │       ├── browser.md
│       │       ├── dom.md
│       │       ├── fetch.md
│       │       ├── input.md
│       │       ├── network.md
│       │       ├── page.md
│       │       ├── runtime.md
│       │       ├── storage.md
│       │       └── target.md
│       ├── deep-dive/
│       │   ├── architecture/
│       │   │   ├── browser-domain.md
│       │   │   ├── browser-requests-architecture.md
│       │   │   ├── event-architecture.md
│       │   │   ├── find-elements-mixin.md
│       │   │   ├── index.md
│       │   │   ├── shadow-dom.md
│       │   │   ├── tab-domain.md
│       │   │   └── webelement-domain.md
│       │   ├── fingerprinting/
│       │   │   ├── behavioral-fingerprinting.md
│       │   │   ├── browser-fingerprinting.md
│       │   │   ├── evasion-techniques.md
│       │   │   ├── index.md
│       │   │   └── network-fingerprinting.md
│       │   ├── fundamentals/
│       │   │   ├── cdp.md
│       │   │   ├── connection-layer.md
│       │   │   ├── iframes-and-contexts.md
│       │   │   ├── index.md
│       │   │   └── typing-system.md
│       │   ├── guides/
│       │   │   ├── index.md
│       │   │   └── selectors-guide.md
│       │   ├── index.md
│       │   └── network/
│       │       ├── build-proxy.md
│       │       ├── http-proxies.md
│       │       ├── index.md
│       │       ├── network-fundamentals.md
│       │       ├── proxy-detection.md
│       │       ├── proxy-legal.md
│       │       └── socks-proxies.md
│       ├── features/
│       │   ├── advanced/
│       │   │   ├── behavioral-captcha-bypass.md
│       │   │   ├── decorators.md
│       │   │   ├── event-system.md
│       │   │   └── remote-connections.md
│       │   ├── automation/
│       │   │   ├── file-operations.md
│       │   │   ├── human-interactions.md
│       │   │   ├── iframes.md
│       │   │   ├── keyboard-control.md
│       │   │   ├── mouse-control.md
│       │   │   └── screenshots-and-pdfs.md
│       │   ├── browser-management/
│       │   │   ├── contexts.md
│       │   │   ├── cookies-sessions.md
│       │   │   └── tabs.md
│       │   ├── configuration/
│       │   │   ├── browser-options.md
│       │   │   ├── browser-preferences.md
│       │   │   └── proxy.md
│       │   ├── core-concepts.md
│       │   ├── element-finding.md
│       │   ├── index.md
│       │   └── network/
│       │       ├── http-requests.md
│       │       ├── interception.md
│       │       ├── monitoring.md
│       │       └── network-recording.md
│       └── index.md
├── examples/
│   └── cloudflare_bypass.py
├── mkdocs.yml
├── public/
│   ├── index.html
│   ├── robots.txt
│   ├── script.js
│   ├── scripts/
│   │   ├── extra.js
│   │   └── termynal.js
│   ├── sitemap.xml
│   └── stylesheets/
│       ├── extra.css
│       └── termynal.css
├── pydoll/
│   ├── __init__.py
│   ├── browser/
│   │   ├── __init__.py
│   │   ├── chromium/
│   │   │   ├── __init__.py
│   │   │   ├── base.py
│   │   │   ├── chrome.py
│   │   │   └── edge.py
│   │   ├── interfaces.py
│   │   ├── managers/
│   │   │   ├── __init__.py
│   │   │   ├── browser_options_manager.py
│   │   │   ├── browser_process_manager.py
│   │   │   ├── proxy_manager.py
│   │   │   └── temp_dir_manager.py
│   │   ├── options.py
│   │   ├── requests/
│   │   │   ├── __init__.py
│   │   │   ├── har_recorder.py
│   │   │   ├── request.py
│   │   │   └── response.py
│   │   └── tab.py
│   ├── commands/
│   │   ├── __init__.py
│   │   ├── browser_commands.py
│   │   ├── dom_commands.py
│   │   ├── emulation_commands.py
│   │   ├── fetch_commands.py
│   │   ├── input_commands.py
│   │   ├── network_commands.py
│   │   ├── page_commands.py
│   │   ├── runtime_commands.py
│   │   ├── storage_commands.py
│   │   └── target_commands.py
│   ├── connection/
│   │   ├── __init__.py
│   │   ├── connection_handler.py
│   │   └── managers/
│   │       ├── __init__.py
│   │       ├── commands_manager.py
│   │       └── events_manager.py
│   ├── constants.py
│   ├── decorators.py
│   ├── elements/
│   │   ├── __init__.py
│   │   ├── mixins/
│   │   │   ├── __init__.py
│   │   │   └── find_elements_mixin.py
│   │   ├── shadow_root.py
│   │   ├── utils/
│   │   │   ├── __init__.py
│   │   │   └── selector_parser.py
│   │   └── web_element.py
│   ├── exceptions.py
│   ├── interactions/
│   │   ├── __init__.py
│   │   ├── iframe.py
│   │   ├── keyboard.py
│   │   ├── mouse.py
│   │   ├── scroll.py
│   │   └── utils.py
│   ├── protocol/
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── browser/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── debugger/
│   │   │   └── types.py
│   │   ├── dom/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── emulation/
│   │   │   ├── __init__.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── fetch/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── input/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── io/
│   │   │   └── types.py
│   │   ├── network/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── har_types.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── page/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── runtime/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   ├── security/
│   │   │   └── types.py
│   │   ├── storage/
│   │   │   ├── __init__.py
│   │   │   ├── events.py
│   │   │   ├── methods.py
│   │   │   └── types.py
│   │   └── target/
│   │       ├── __init__.py
│   │       ├── events.py
│   │       ├── methods.py
│   │       └── types.py
│   ├── py.typed
│   └── utils/
│       ├── __init__.py
│       ├── bundle.py
│       ├── general.py
│       ├── socks5_proxy_forwarder.py
│       └── user_agent_parser.py
├── pyproject.toml
└── tests/
    ├── conftest.py
    ├── pages/
    │   ├── oopif/
    │   │   ├── oopif_content.html
    │   │   ├── oopif_main.html
    │   │   ├── oopif_nested.html
    │   │   └── oopif_shadow_iframe.html
    │   ├── shadow_dom_test.html
    │   ├── test_children.html
    │   ├── test_click_nested.html
    │   ├── test_click_nested_iframe_content.html
    │   ├── test_core_simple.html
    │   ├── test_frame_content.html
    │   ├── test_frameset.html
    │   ├── test_har_recording.html
    │   ├── test_iframe_content.html
    │   ├── test_iframe_nested.html
    │   ├── test_iframe_nested_level.html
    │   ├── test_iframe_parent_level.html
    │   ├── test_iframe_simple.html
    │   └── test_multiple_iframes.html
    ├── test_browser/
    │   ├── test_browser_base.py
    │   ├── test_browser_chrome.py
    │   ├── test_browser_edge.py
    │   ├── test_browser_options.py
    │   ├── test_browser_tab.py
    │   ├── test_har_recorder.py
    │   ├── test_requests_request.py
    │   ├── test_requests_response.py
    │   └── test_tab_request_integration.py
    ├── test_click_nested_integration.py
    ├── test_commands/
    │   ├── test_browser_commands.py
    │   ├── test_dom_commands.py
    │   ├── test_emulation_commands.py
    │   ├── test_fetch_commands.py
    │   ├── test_input_commands.py
    │   ├── test_network_commands.py
    │   ├── test_page_commands.py
    │   ├── test_runtime_commands.py
    │   ├── test_storage_commands.py
    │   └── test_target_commands.py
    ├── test_connection_handler.py
    ├── test_core_integration.py
    ├── test_decorators.py
    ├── test_events.py
    ├── test_exceptions.py
    ├── test_find_elements_mixin.py
    ├── test_har_recording_integration.py
    ├── test_iframe_integration.py
    ├── test_interactions/
    │   ├── __init__.py
    │   ├── test_iframe.py
    │   ├── test_keyboard.py
    │   ├── test_mouse.py
    │   └── test_scroll.py
    ├── test_managers/
    │   ├── test_browser_managers.py
    │   └── test_connection_managers.py
    ├── test_nested_oopif_integration.py
    ├── test_shadow_root.py
    ├── test_shadow_root_integration.py
    ├── test_socks5_proxy_forwarder.py
    ├── test_user_agent_parser.py
    ├── test_utils.py
    └── test_web_element.py
Download .txt
Showing preview only (380K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3939 symbols across 123 files)

FILE: docs/resources/scripts/extra.js
  function setupTermynal (line 1) | function setupTermynal() {
  function shuffle (line 109) | function shuffle(array) {
  function showRandomAnnouncement (line 121) | async function showRandomAnnouncement(groupId, timeInterval) {
  function main (line 138) | async function main() {

FILE: docs/resources/scripts/termynal.js
  class Termynal (line 14) | class Termynal {
    method constructor (line 30) | constructor(container = '#termynal', options = {}) {
    method loadLines (line 52) | loadLines() {
    method init (line 74) | init() {
    method start (line 96) | async start() {
    method generateRestart (line 129) | generateRestart() {
    method generateFinish (line 142) | generateFinish() {
    method addRestart (line 157) | addRestart() {
    method addFinish (line 162) | addFinish() {
    method type (line 171) | async type(line) {
    method progress (line 187) | async progress(line) {
    method _wait (line 212) | _wait(time) {
    method lineDataToElements (line 223) | lineDataToElements(lineData) {
    method _attributes (line 238) | _attributes(line) {

FILE: examples/cloudflare_bypass.py
  function example_with_context_manager (line 6) | async def example_with_context_manager():
  function example_with_enable_disable (line 26) | async def example_with_enable_disable():
  function main (line 57) | async def main():

FILE: public/script.js
  constant SPONSORS (line 340) | const SPONSORS = [
  function renderSponsors (line 371) | function renderSponsors(gridId = 'sponsorsGrid') {

FILE: public/scripts/extra.js
  function setupTermynal (line 1) | function setupTermynal() {
  function shuffle (line 109) | function shuffle(array) {
  function showRandomAnnouncement (line 121) | async function showRandomAnnouncement(groupId, timeInterval) {
  function main (line 138) | async function main() {

FILE: public/scripts/termynal.js
  class Termynal (line 14) | class Termynal {
    method constructor (line 30) | constructor(container = '#termynal', options = {}) {
    method loadLines (line 52) | loadLines() {
    method init (line 74) | init() {
    method start (line 96) | async start() {
    method generateRestart (line 129) | generateRestart() {
    method generateFinish (line 142) | generateFinish() {
    method addRestart (line 157) | addRestart() {
    method addFinish (line 162) | addFinish() {
    method type (line 171) | async type(line) {
    method progress (line 187) | async progress(line) {
    method _wait (line 212) | _wait(time) {
    method lineDataToElements (line 223) | lineDataToElements(lineData) {
    method _attributes (line 238) | _attributes(line) {

FILE: pydoll/browser/chromium/base.py
  class Browser (line 77) | class Browser(ABC):  # noqa: PLR0904
    method __init__ (line 85) | def __init__(
    method __aenter__ (line 117) | async def __aenter__(self) -> 'Browser':
    method __aexit__ (line 122) | async def __aexit__(self, exc_type, exc_val, exc_tb):
    method connect (line 137) | async def connect(self, ws_address: str) -> Tab:
    method start (line 159) | async def start(self, headless: bool = False) -> Tab:
    method stop (line 203) | async def stop(self):
    method close (line 225) | async def close(self):
    method create_browser_context (line 232) | async def create_browser_context(
    method delete_browser_context (line 270) | async def delete_browser_context(self, browser_context_id: str):
    method get_browser_contexts (line 285) | async def get_browser_contexts(self) -> list[str]:
    method new_tab (line 293) | async def new_tab(self, url: str = '', browser_context_id: Optional[st...
    method get_targets (line 320) | async def get_targets(self) -> list[TargetInfo]:
    method get_opened_tabs (line 334) | async def get_opened_tabs(self) -> list[Tab]:
    method get_tab_by_target (line 366) | async def get_tab_by_target(self, target: TargetInfo) -> Tab:
    method set_download_path (line 371) | async def set_download_path(self, path: str, browser_context_id: Optio...
    method set_download_behavior (line 382) | async def set_download_behavior(
    method delete_all_cookies (line 412) | async def delete_all_cookies(self, browser_context_id: Optional[str] =...
    method set_cookies (line 417) | async def set_cookies(
    method get_cookies (line 424) | async def get_cookies(self, browser_context_id: Optional[str] = None) ...
    method get_version (line 439) | async def get_version(self) -> GetVersionResult:
    method get_window_id_for_target (line 445) | async def get_window_id_for_target(self, target_id: str) -> int:
    method get_window_id_for_tab (line 453) | async def get_window_id_for_tab(self, tab: Tab) -> int:
    method get_window_id (line 461) | async def get_window_id(self) -> int:
    method set_window_maximized (line 472) | async def set_window_maximized(self):
    method set_window_minimized (line 478) | async def set_window_minimized(self):
    method set_window_bounds (line 484) | async def set_window_bounds(self, bounds: Bounds):
    method grant_permissions (line 496) | async def grant_permissions(
    method reset_permissions (line 519) | async def reset_permissions(self, browser_context_id: Optional[str] = ...
    method on (line 525) | async def on(
    method on (line 529) | async def on(
    method on (line 532) | async def on(self, event_name, callback, temporary: bool = False) -> int:
    method remove_callback (line 565) | async def remove_callback(self, callback_id: int):
    method enable_fetch_events (line 570) | async def enable_fetch_events(
    method disable_fetch_events (line 599) | async def disable_fetch_events(self):
    method enable_runtime_events (line 604) | async def enable_runtime_events(self):
    method disable_runtime_events (line 609) | async def disable_runtime_events(self):
    method continue_request (line 614) | async def continue_request(
    method fail_request (line 638) | async def fail_request(self, request_id: str, error_reason: ErrorReason):
    method fulfill_request (line 643) | async def fulfill_request(
    method _validate_connection_port (line 667) | def _validate_connection_port(connection_port: Optional[int]):
    method _continue_request_callback (line 673) | async def _continue_request_callback(self, event: RequestPausedEvent):
    method _continue_request_with_auth_callback (line 679) | async def _continue_request_with_auth_callback(
    method _tab_continue_request_callback (line 703) | async def _tab_continue_request_callback(event: RequestPausedEvent, ta...
    method _tab_continue_request_with_auth_callback (line 710) | async def _tab_continue_request_with_auth_callback(
    method _setup_context_proxy_auth_for_tab (line 731) | async def _setup_context_proxy_auth_for_tab(
    method _apply_user_agent_override (line 765) | async def _apply_user_agent_override(self, tab: Tab) -> None:
    method _get_user_agent_from_options (line 795) | def _get_user_agent_from_options(self) -> Optional[str]:
    method _verify_browser_running (line 802) | async def _verify_browser_running(self):
    method _configure_proxy (line 814) | async def _configure_proxy(
    method _is_valid_tab (line 842) | def _is_valid_tab(target: TargetInfo) -> bool:
    method _get_valid_tab_id (line 847) | async def _get_valid_tab_id(targets: list[TargetInfo]) -> str:
    method _is_browser_running (line 874) | async def _is_browser_running(self, timeout: int = 10) -> bool:
    method _execute_command (line 883) | async def _execute_command(
    method _setup_user_dir (line 890) | def _setup_user_dir(self):
    method _set_browser_preferences_in_temp_dir (line 903) | def _set_browser_preferences_in_temp_dir(self, temp_dir: TemporaryDire...
    method _set_browser_preferences_in_user_data_dir (line 912) | def _set_browser_preferences_in_user_data_dir(self, user_data_dir: str):
    method _get_user_data_dir (line 944) | def _get_user_data_dir(self) -> Optional[str]:
    method _validate_ws_address (line 951) | def _validate_ws_address(ws_address: str):
    method _setup_ws_address (line 963) | async def _setup_ws_address(self, ws_address: str):
    method _get_tab_kwargs (line 971) | def _get_tab_kwargs(self, target_id: str, browser_context_id: Optional...
    method _get_tab_ws_address (line 995) | def _get_tab_ws_address(self, tab_id: str) -> str:
    method _sanitize_proxy_and_extract_auth (line 1016) | def _sanitize_proxy_and_extract_auth(
    method _get_default_binary_location (line 1059) | def _get_default_binary_location(self) -> str:

FILE: pydoll/browser/chromium/chrome.py
  class Chrome (line 18) | class Chrome(Browser):
    method __init__ (line 21) | def __init__(
    method _get_default_binary_location (line 37) | def _get_default_binary_location():

FILE: pydoll/browser/chromium/edge.py
  class Edge (line 18) | class Edge(Browser):
    method __init__ (line 21) | def __init__(
    method _get_default_binary_location (line 37) | def _get_default_binary_location():

FILE: pydoll/browser/interfaces.py
  class Options (line 6) | class Options(ABC):
    method arguments (line 9) | def arguments(self) -> list[str]:
    method binary_location (line 14) | def binary_location(self) -> str:
    method start_timeout (line 19) | def start_timeout(self) -> int:
    method add_argument (line 23) | def add_argument(self, argument: str):
    method browser_preferences (line 28) | def browser_preferences(self) -> dict:
    method headless (line 33) | def headless(self) -> bool:
    method headless (line 38) | def headless(self, headless: bool):
    method page_load_state (line 43) | def page_load_state(self) -> PageLoadState:
    method page_load_state (line 48) | def page_load_state(self, state: PageLoadState):
  class BrowserOptionsManager (line 52) | class BrowserOptionsManager(ABC):
    method initialize_options (line 54) | def initialize_options(self) -> Options:
    method add_default_arguments (line 58) | def add_default_arguments(self):

FILE: pydoll/browser/managers/browser_options_manager.py
  class ChromiumOptionsManager (line 16) | class ChromiumOptionsManager(BrowserOptionsManager):
    method __init__ (line 24) | def __init__(self, options: Optional[Options] = None):
    method initialize_options (line 31) | def initialize_options(
    method add_default_arguments (line 58) | def add_default_arguments(self):

FILE: pydoll/browser/managers/browser_process_manager.py
  class BrowserProcessManager (line 8) | class BrowserProcessManager:
    method __init__ (line 16) | def __init__(
    method start_browser_process (line 34) | def start_browser_process(
    method _default_process_creator (line 68) | def _default_process_creator(command: list[str]) -> subprocess.Popen:
    method stop_process (line 73) | def stop_process(self):

FILE: pydoll/browser/managers/proxy_manager.py
  class ProxyManager (line 12) | class ProxyManager:
    method __init__ (line 20) | def __init__(self, options: Options):
    method get_proxy_credentials (line 31) | def get_proxy_credentials(self) -> tuple[bool, tuple[Optional[str], Op...
    method _find_proxy_argument (line 62) | def _find_proxy_argument(self) -> Optional[tuple[int, str]]:
    method _parse_proxy (line 77) | def _parse_proxy(proxy_value: str) -> tuple[bool, Optional[str], Optio...
    method _update_proxy_argument (line 105) | def _update_proxy_argument(self, index: int, clean_proxy: str) -> None:

FILE: pydoll/browser/managers/temp_dir_manager.py
  class TempDirectoryManager (line 12) | class TempDirectoryManager:
    method __init__ (line 20) | def __init__(self, temp_dir_factory: Callable[[], TemporaryDirectory] ...
    method create_temp_dir (line 32) | def create_temp_dir(self) -> TemporaryDirectory:
    method retry_process_file (line 45) | def retry_process_file(func: Callable[[str], None], path: str, retry_t...
    method handle_cleanup_error (line 71) | def handle_cleanup_error(self, func: Callable[[str], None], path: str,...
    method cleanup (line 125) | def cleanup(self):

FILE: pydoll/browser/options.py
  class ChromiumOptions (line 12) | class ChromiumOptions(Options):
    method __init__ (line 20) | def __init__(self):
    method arguments (line 36) | def arguments(self) -> list[str]:
    method arguments (line 46) | def arguments(self, args_list: list[str]):
    method binary_location (line 56) | def binary_location(self) -> str:
    method binary_location (line 66) | def binary_location(self, location: str):
    method start_timeout (line 76) | def start_timeout(self) -> int:
    method start_timeout (line 86) | def start_timeout(self, timeout: int):
    method add_argument (line 95) | def add_argument(self, argument: str):
    method remove_argument (line 110) | def remove_argument(self, argument: str):
    method browser_preferences (line 125) | def browser_preferences(self) -> dict:
    method browser_preferences (line 129) | def browser_preferences(self, preferences: dict):
    method _set_pref_path (line 137) | def _set_pref_path(self, path: list, value):
    method _get_pref_path (line 152) | def _get_pref_path(self, path: list):
    method set_default_download_directory (line 170) | def set_default_download_directory(self, path: str):
    method set_accept_languages (line 181) | def set_accept_languages(self, languages: str):
    method prompt_for_download (line 193) | def prompt_for_download(self) -> bool:
    method prompt_for_download (line 197) | def prompt_for_download(self, enabled: bool):
    method block_popups (line 209) | def block_popups(self) -> bool:
    method block_popups (line 213) | def block_popups(self, block: bool):
    method password_manager_enabled (line 227) | def password_manager_enabled(self) -> bool:
    method password_manager_enabled (line 231) | def password_manager_enabled(self, enabled: bool):
    method block_notifications (line 244) | def block_notifications(self) -> bool:
    method block_notifications (line 252) | def block_notifications(self, block: bool):
    method allow_automatic_downloads (line 268) | def allow_automatic_downloads(self) -> bool:
    method allow_automatic_downloads (line 279) | def allow_automatic_downloads(self, allow: bool):
    method open_pdf_externally (line 295) | def open_pdf_externally(self) -> bool:
    method open_pdf_externally (line 299) | def open_pdf_externally(self, enabled: bool):
    method headless (line 311) | def headless(self) -> bool:
    method headless (line 315) | def headless(self, headless: bool):
    method webrtc_leak_protection (line 324) | def webrtc_leak_protection(self) -> bool:
    method webrtc_leak_protection (line 328) | def webrtc_leak_protection(self, enabled: bool):
    method page_load_state (line 338) | def page_load_state(self) -> PageLoadState:
    method page_load_state (line 342) | def page_load_state(self, state: PageLoadState):

FILE: pydoll/browser/requests/har_recorder.py
  function _get_pydoll_version (line 59) | def _get_pydoll_version() -> str:
  class HarRecorder (line 67) | class HarRecorder:
    method __init__ (line 75) | def __init__(self, tab: Tab, resource_types: list[ResourceType] | None...
    method start (line 86) | async def start(self) -> None:
    method stop (line 116) | async def stop(self) -> None:
    method _on_request_will_be_sent (line 138) | def _on_request_will_be_sent(self, event: RequestWillBeSentEvent) -> N...
    method _on_request_extra_info (line 163) | def _on_request_extra_info(self, event: RequestWillBeSentExtraInfoEven...
    method _on_response_received (line 176) | def _on_response_received(self, event: ResponseReceivedEvent) -> None:
    method _on_response_extra_info (line 197) | def _on_response_extra_info(self, event: ResponseReceivedExtraInfoEven...
    method _on_data_received (line 213) | def _on_data_received(self, event: DataReceivedEvent) -> None:
    method _on_loading_finished (line 225) | def _on_loading_finished(self, event: LoadingFinishedEvent) -> None:
    method _on_loading_failed (line 244) | def _on_loading_failed(self, event: LoadingFailedEvent) -> None:
    method _finalize_entry (line 262) | async def _finalize_entry(self, request_id: str) -> None:
    method _finalize_redirect_entry (line 275) | def _finalize_redirect_entry(self, request_id: str, redirect_response:...
    method _flush_pending (line 295) | def _flush_pending(self) -> None:
    method _fetch_response_body (line 305) | async def _fetch_response_body(self, request_id: str) -> tuple[str, bo...
    method _build_entry (line 320) | def _build_entry(self, pending: dict[str, Any]) -> HarEntry:
    method _build_har_request (line 368) | def _build_har_request(
    method _build_har_response (line 393) | def _build_har_response(
    method _build_har_timings (line 449) | def _build_har_timings(
    method _normalize_http_version (line 498) | def _normalize_http_version(protocol: str) -> str:
    method _headers_dict_to_list (line 515) | def _headers_dict_to_list(headers: dict[str, str]) -> list[HarHeader]:
    method _parse_query_string (line 520) | def _parse_query_string(url: str) -> list[HarQueryParam]:
    method _wall_time_to_iso (line 534) | def _wall_time_to_iso(wall_time: float) -> str:
    method _parse_request_cookies (line 541) | def _parse_request_cookies(headers: dict[str, str]) -> list[HarCookie]:
    method _parse_response_cookies (line 559) | def _parse_response_cookies(headers: dict[str, str]) -> list[HarCookie]:
  class HarCapture (line 591) | class HarCapture:
    method __init__ (line 598) | def __init__(self, recorder: HarRecorder):
    method entries (line 602) | def entries(self) -> list[HarEntry]:
    method to_dict (line 606) | def to_dict(self) -> Har:
    method save (line 627) | def save(self, path: str | Path) -> None:

FILE: pydoll/browser/requests/request.py
  class Request (line 61) | class Request:
    method __init__ (line 83) | def __init__(self, tab: Tab):
    method request (line 98) | async def request(
    method get (line 163) | async def get(
    method post (line 181) | async def post(
    method put (line 201) | async def put(
    method patch (line 221) | async def patch(
    method delete (line 241) | async def delete(self, url: str, **kwargs) -> Response:
    method head (line 253) | async def head(self, url: str, **kwargs) -> Response:
    method options (line 268) | async def options(self, url: str, **kwargs) -> Response:
    method record (line 283) | async def record(
    method _build_url_with_params (line 323) | def _build_url_with_params(url: str, params: Optional[dict[str, str]])...
    method _build_request_options (line 336) | def _build_request_options(
    method _add_request_body (line 355) | def _add_request_body(
    method _handle_json_options (line 368) | def _handle_json_options(options: dict[str, Any], json: Optional[dict[...
    method _handle_data_options (line 375) | def _handle_data_options(
    method _execute_fetch_request (line 387) | async def _execute_fetch_request(self, url: str, options: dict[str, An...
    method _build_response (line 402) | def _build_response(
    method _register_callbacks (line 422) | async def _register_callbacks(self) -> None:
    method _clear_callbacks (line 464) | async def _clear_callbacks(self) -> None:
    method _extract_received_headers (line 479) | def _extract_received_headers(self) -> list[HeaderEntry]:
    method _extract_sent_headers (line 492) | def _extract_sent_headers(self) -> list[HeaderEntry]:
    method _extract_headers_from_events (line 506) | def _extract_headers_from_events(
    method _extract_request_sent_headers (line 544) | def _extract_request_sent_headers(
    method _extract_request_sent_extra_info_headers (line 559) | def _extract_request_sent_extra_info_headers(
    method _extract_response_received_headers (line 576) | def _extract_response_received_headers(
    method _extract_response_received_extra_info_headers (line 591) | def _extract_response_received_extra_info_headers(
    method _convert_dict_to_header_entries (line 610) | def _convert_dict_to_header_entries(headers_dict: dict) -> list[Header...
    method _extract_set_cookies (line 622) | def _extract_set_cookies(self) -> list[CookieParam]:
    method _filter_response_extra_info_events (line 655) | def _filter_response_extra_info_events(self) -> list[RequestReceivedEv...
    method _parse_set_cookie_header (line 670) | def _parse_set_cookie_header(self, set_cookie_header: str) -> list[Coo...
    method _parse_cookie_line (line 694) | def _parse_cookie_line(line: str) -> Optional[CookieParam]:
    method _add_unique_cookies (line 719) | def _add_unique_cookies(cookies: list[CookieParam], new_cookies: list[...
    method _convert_header_entries_to_dict (line 734) | def _convert_header_entries_to_dict(headers: list[HeaderEntry]) -> dic...

FILE: pydoll/browser/requests/response.py
  class Response (line 18) | class Response:
    method __init__ (line 38) | def __init__(
    method ok (line 82) | def ok(self) -> bool:
    method cookies (line 95) | def cookies(self) -> list[CookieParam]:
    method request_headers (line 110) | def request_headers(self) -> list[HeaderEntry]:
    method headers (line 125) | def headers(self) -> list[HeaderEntry]:
    method status_code (line 139) | def status_code(self) -> int:
    method text (line 148) | def text(self) -> str:
    method content (line 164) | def content(self) -> bytes:
    method url (line 174) | def url(self) -> str:
    method json (line 183) | def json(self) -> Union[dict[str, Any], list]:
    method raise_for_status (line 210) | def raise_for_status(self) -> None:

FILE: pydoll/browser/tab.py
  class Tab (line 130) | class Tab(FindElementsMixin):
    method __init__ (line 139) | def __init__(
    method page_events_enabled (line 186) | def page_events_enabled(self) -> bool:
    method network_events_enabled (line 191) | def network_events_enabled(self) -> bool:
    method fetch_events_enabled (line 196) | def fetch_events_enabled(self) -> bool:
    method dom_events_enabled (line 201) | def dom_events_enabled(self) -> bool:
    method runtime_events_enabled (line 206) | def runtime_events_enabled(self) -> bool:
    method request (line 211) | def request(self) -> Request:
    method scroll (line 223) | def scroll(self) -> ScrollAPI:
    method keyboard (line 235) | def keyboard(self) -> KeyboardAPI:
    method mouse (line 247) | def mouse(self) -> MouseAPI:
    method intercept_file_chooser_dialog_enabled (line 257) | def intercept_file_chooser_dialog_enabled(self) -> bool:
    method current_url (line 262) | async def current_url(self) -> str:
    method page_source (line 270) | async def page_source(self) -> str:
    method title (line 278) | async def title(self) -> str:
    method enable_page_events (line 285) | async def enable_page_events(self):
    method enable_network_events (line 293) | async def enable_network_events(self):
    method enable_fetch_events (line 301) | async def enable_fetch_events(
    method enable_dom_events (line 333) | async def enable_dom_events(self):
    method enable_runtime_events (line 341) | async def enable_runtime_events(self):
    method enable_intercept_file_chooser_dialog (line 349) | async def enable_intercept_file_chooser_dialog(self):
    method enable_auto_solve_cloudflare_captcha (line 362) | async def enable_auto_solve_cloudflare_captcha(
    method disable_fetch_events (line 408) | async def disable_fetch_events(self):
    method disable_page_events (line 416) | async def disable_page_events(self):
    method disable_network_events (line 424) | async def disable_network_events(self):
    method disable_dom_events (line 432) | async def disable_dom_events(self):
    method disable_runtime_events (line 440) | async def disable_runtime_events(self):
    method disable_intercept_file_chooser_dialog (line 448) | async def disable_intercept_file_chooser_dialog(self):
    method disable_auto_solve_cloudflare_captcha (line 458) | async def disable_auto_solve_cloudflare_captcha(self):
    method close (line 464) | async def close(self):
    method get_frame (line 477) | async def get_frame(self, frame: 'WebElement') -> IFrame:
    method find_shadow_roots (line 530) | async def find_shadow_roots(self, deep: bool = False, timeout: float =...
    method _collect_all_shadow_roots (line 575) | async def _collect_all_shadow_roots(self, deep: bool) -> list[ShadowRo...
    method _resolve_shadow_host (line 622) | async def _resolve_shadow_host(self, host_backend_id: int | None) -> W...
    method _collect_oopif_shadow_roots (line 636) | async def _collect_oopif_shadow_roots(self) -> list[ShadowRoot]:
    method _collect_shadow_roots_from_oopif_target (line 658) | async def _collect_shadow_roots_from_oopif_target(
    method _resolve_oopif_shadow_entry (line 705) | async def _resolve_oopif_shadow_entry(
    method _resolve_oopif_shadow_host (line 749) | async def _resolve_oopif_shadow_host(
    method _collect_shadow_roots_from_tree (line 788) | def _collect_shadow_roots_from_tree(node: Node, results: list[tuple[No...
    method bring_to_front (line 802) | async def bring_to_front(self):
    method get_cookies (line 807) | async def get_cookies(self) -> list[Cookie]:
    method get_network_response_body (line 825) | async def get_network_response_body(self, request_id: str) -> str:
    method get_network_logs (line 847) | async def get_network_logs(self, filter: Optional[str] = None) -> list...
    method set_cookies (line 871) | async def set_cookies(self, cookies: list[CookieParam]):
    method delete_all_cookies (line 886) | async def delete_all_cookies(self):
    method go_to (line 891) | async def go_to(self, url: str, timeout: int = 300):
    method refresh (line 913) | async def refresh(
    method take_screenshot (line 941) | async def take_screenshot(
    method print_to_pdf (line 1019) | async def print_to_pdf(
    method save_bundle (line 1073) | async def save_bundle(self, path: str | Path, inline_assets: bool = Fa...
    method _fetch_document_html (line 1127) | async def _fetch_document_html(self, frame_tree: FrameResourceTree) ->...
    method _fetch_bundle_assets (line 1145) | async def _fetch_bundle_assets(
    method has_dialog (line 1177) | async def has_dialog(self) -> bool:
    method get_dialog_message (line 1190) | async def get_dialog_message(self) -> str:
    method handle_dialog (line 1203) | async def handle_dialog(self, accept: bool, prompt_text: Optional[str]...
    method execute_script (line 1225) | async def execute_script(
    method execute_script (line 1247) | async def execute_script(
    method execute_script (line 1265) | async def execute_script(
    method continue_request (line 1395) | async def continue_request(
    method fail_request (line 1419) | async def fail_request(self, request_id: str, error_reason: ErrorReason):
    method fulfill_request (line 1424) | async def fulfill_request(
    method continue_with_auth (line 1447) | async def continue_with_auth(
    method expect_file_chooser (line 1473) | async def expect_file_chooser(
    method expect_and_bypass_cloudflare_captcha (line 1519) | async def expect_and_bypass_cloudflare_captcha(
    method expect_download (line 1579) | async def expect_download(
    method _cleanup_download_context (line 1693) | async def _cleanup_download_context(
    method on (line 1718) | async def on(
    method on (line 1722) | async def on(
    method on (line 1725) | async def on(
    method remove_callback (line 1764) | async def remove_callback(self, callback_id: int):
    method clear_callbacks (line 1769) | async def clear_callbacks(self):
    method _get_connection_handler (line 1774) | def _get_connection_handler(self) -> ConnectionHandler:
    method _get_evaluate_command (line 1785) | def _get_evaluate_command(
    method _refresh_if_url_not_changed (line 1824) | async def _refresh_if_url_not_changed(self, url: str) -> bool:
    method _validate_argument_error (line 1833) | def _validate_argument_error(response: EvaluateResponse) -> None:
    method _wait_page_load (line 1865) | async def _wait_page_load(self, timeout: int = 300):
    method _find_cloudflare_shadow_root (line 1914) | async def _find_cloudflare_shadow_root(self, timeout: float) -> Shadow...
    method _bypass_cloudflare (line 1945) | async def _bypass_cloudflare(
  class _DownloadHandle (line 1969) | class _DownloadHandle:
    method __init__ (line 1972) | def __init__(
    method file_path (line 1985) | def file_path(self) -> Optional[str]:
    method wait_started (line 1988) | async def wait_started(self, timeout: Optional[float] = None) -> None:
    method wait_finished (line 1991) | async def wait_finished(self, timeout: Optional[float] = None) -> None:
    method read_bytes (line 1994) | async def read_bytes(self) -> bytes:
    method read_base64 (line 2001) | async def read_base64(self) -> str:

FILE: pydoll/commands/browser_commands.py
  class BrowserCommands (line 64) | class BrowserCommands:
    method get_version (line 79) | def get_version() -> GetVersionCommand:
    method get_browser_command_line (line 90) | def get_browser_command_line() -> GetBrowserCommandLineCommand:
    method get_histograms (line 102) | def get_histograms(
    method get_histogram (line 126) | def get_histogram(
    method get_window_bounds (line 146) | def get_window_bounds(window_id: WindowID) -> GetWindowBoundsCommand:
    method get_window_for_target (line 160) | def get_window_for_target(
    method set_window_bounds (line 180) | def set_window_bounds(window_id: WindowID, bounds: Bounds) -> SetWindo...
    method set_contents_size (line 197) | def set_contents_size(
    method set_dock_tile (line 223) | def set_dock_tile(
    method execute_browser_command (line 245) | def execute_browser_command(command_id: BrowserCommandId) -> ExecuteBr...
    method add_privacy_sandbox_enrollment_override (line 259) | def add_privacy_sandbox_enrollment_override(
    method add_privacy_sandbox_coordinator_key_config (line 277) | def add_privacy_sandbox_coordinator_key_config(
    method set_permission (line 311) | def set_permission(
    method grant_permissions (line 337) | def grant_permissions(
    method reset_permissions (line 362) | def reset_permissions(
    method set_download_behavior (line 381) | def set_download_behavior(
    method cancel_download (line 413) | def cancel_download(
    method close (line 434) | def close() -> CloseCommand:
    method crash (line 444) | def crash() -> CrashCommand:
    method crash_gpu_process (line 454) | def crash_gpu_process() -> CrashGpuProcessCommand:
    method set_window_maximized (line 465) | def set_window_maximized(window_id: WindowID) -> SetWindowBoundsCommand:
    method set_window_minimized (line 479) | def set_window_minimized(window_id: WindowID) -> SetWindowBoundsCommand:
    method set_window_fullscreen (line 493) | def set_window_fullscreen(window_id: WindowID) -> SetWindowBoundsCommand:
    method set_window_normal (line 507) | def set_window_normal(window_id: WindowID) -> SetWindowBoundsCommand:

FILE: pydoll/commands/dom_commands.py
  class DomCommands (line 116) | class DomCommands:
    method describe_node (line 131) | def describe_node(
    method disable (line 171) | def disable() -> DisableCommand:
    method enable (line 186) | def enable(include_whitespace: Optional['IncludeWhitespace'] = None) -...
    method focus (line 208) | def focus(
    method get_attributes (line 238) | def get_attributes(node_id: int) -> GetAttributesCommand:
    method get_box_model (line 258) | def get_box_model(
    method get_document (line 290) | def get_document(
    method get_node_for_location (line 318) | def get_node_for_location(
    method get_outer_html (line 351) | def get_outer_html(
    method hide_highlight (line 382) | def hide_highlight() -> HideHighlightCommand:
    method highlight_node (line 396) | def highlight_node() -> HighlightNodeCommand:
    method highlight_rect (line 409) | def highlight_rect() -> HighlightRectCommand:
    method move_to (line 423) | def move_to(
    method query_selector (line 450) | def query_selector(
    method query_selector_all (line 473) | def query_selector_all(
    method remove_attribute (line 496) | def remove_attribute(
    method remove_node (line 518) | def remove_node(node_id: int) -> RemoveNodeCommand:
    method request_child_nodes (line 536) | def request_child_nodes(
    method request_node (line 565) | def request_node(
    method resolve_node (line 585) | def resolve_node(
    method scroll_into_view_if_needed (line 619) | def scroll_into_view_if_needed(
    method set_attributes_as_text (line 654) | def set_attributes_as_text(
    method set_attribute_value (line 681) | def set_attribute_value(
    method set_file_input_files (line 705) | def set_file_input_files(
    method set_node_name (line 737) | def set_node_name(
    method set_node_value (line 759) | def set_node_value(
    method set_outer_html (line 781) | def set_outer_html(
    method collect_class_names_from_subtree (line 804) | def collect_class_names_from_subtree(
    method copy_to (line 824) | def copy_to(
    method discard_search_results (line 851) | def discard_search_results(
    method get_anchor_element (line 870) | def get_anchor_element(
    method get_container_for_node (line 894) | def get_container_for_node(
    method get_content_quads (line 930) | def get_content_quads(
    method get_detached_dom_nodes (line 960) | def get_detached_dom_nodes() -> GetDetachedDomNodesCommand:
    method get_element_by_relation (line 974) | def get_element_by_relation(
    method get_file_info (line 996) | def get_file_info(
    method get_frame_owner (line 1016) | def get_frame_owner(
    method get_nodes_for_subtree_by_style (line 1036) | def get_nodes_for_subtree_by_style(
    method get_node_stack_traces (line 1062) | def get_node_stack_traces(
    method get_querying_descendants_for_container (line 1082) | def get_querying_descendants_for_container(
    method get_relayout_boundary (line 1102) | def get_relayout_boundary(
    method get_search_results (line 1122) | def get_search_results(
    method get_top_layer_elements (line 1146) | def get_top_layer_elements() -> GetTopLayerElementsCommand:
    method mark_undoable_state (line 1160) | def mark_undoable_state() -> MarkUndoableStateCommand:
    method perform_search (line 1174) | def perform_search(
    method push_node_by_path_to_frontend (line 1198) | def push_node_by_path_to_frontend(
    method push_nodes_by_backend_ids_to_frontend (line 1218) | def push_nodes_by_backend_ids_to_frontend(
    method redo (line 1237) | def redo() -> RedoCommand:
    method set_inspected_node (line 1251) | def set_inspected_node(
    method set_node_stack_traces_enabled (line 1271) | def set_node_stack_traces_enabled(
    method undo (line 1291) | def undo() -> UndoCommand:

FILE: pydoll/commands/emulation_commands.py
  class EmulationCommands (line 16) | class EmulationCommands:
    method set_user_agent_override (line 28) | def set_user_agent_override(

FILE: pydoll/commands/fetch_commands.py
  class FetchCommands (line 41) | class FetchCommands:
    method continue_request (line 59) | def continue_request(
    method continue_request_with_auth (line 103) | def continue_request_with_auth(
    method disable (line 142) | def disable() -> DisableCommand:
    method enable (line 154) | def enable(
    method fail_request (line 189) | def fail_request(request_id: str, error_reason: ErrorReason) -> FailRe...
    method fulfill_request (line 207) | def fulfill_request(
    method get_response_body (line 245) | def get_response_body(request_id: str) -> GetResponseBodyCommand:
    method continue_response (line 263) | def continue_response(
    method take_response_body_as_stream (line 300) | def take_response_body_as_stream(

FILE: pydoll/commands/input_commands.py
  class InputCommands (line 53) | class InputCommands:
    method cancel_dragging (line 69) | def cancel_dragging() -> CancelDraggingCommand:
    method dispatch_key_event (line 82) | def dispatch_key_event(  # noqa: PLR0912
    method dispatch_mouse_event (line 171) | def dispatch_mouse_event(
    method dispatch_touch_event (line 259) | def dispatch_touch_event(
    method set_ignore_input_events (line 298) | def set_ignore_input_events(ignore: bool) -> SetIgnoreInputEventsCommand:
    method dispatch_drag_event (line 316) | def dispatch_drag_event(
    method emulate_touch_from_mouse_event (line 351) | def emulate_touch_from_mouse_event(  # noqa: PLR0913, PLR0917
    method ime_set_composition (line 403) | def ime_set_composition(
    method insert_text (line 444) | def insert_text(
    method set_intercept_drags (line 464) | def set_intercept_drags(enabled: bool) -> SetInterceptDragsCommand:
    method synthesize_pinch_gesture (line 486) | def synthesize_pinch_gesture(
    method synthesize_scroll_gesture (line 524) | def synthesize_scroll_gesture(
    method synthesize_tap_gesture (line 595) | def synthesize_tap_gesture(

FILE: pydoll/commands/network_commands.py
  class NetworkCommands (line 80) | class NetworkCommands:
    method clear_browser_cache (line 98) | def clear_browser_cache() -> ClearBrowserCacheCommand:
    method clear_browser_cookies (line 119) | def clear_browser_cookies() -> ClearBrowserCookiesCommand:
    method delete_cookies (line 133) | def delete_cookies(
    method disable (line 170) | def disable() -> DisableCommand:
    method enable (line 190) | def enable(
    method get_cookies (line 221) | def get_cookies(
    method get_request_post_data (line 247) | def get_request_post_data(
    method get_response_body (line 274) | def get_response_body(
    method set_cache_disabled (line 300) | def set_cache_disabled(cache_disabled: bool) -> SetCacheDisabledCommand:
    method set_cookie (line 322) | def set_cookie(
    method set_cookies (line 402) | def set_cookies(cookies: list[SetCookieParams]) -> SetCookiesCommand:
    method set_extra_http_headers (line 427) | def set_extra_http_headers(
    method set_useragent_override (line 454) | def set_useragent_override(
    method clear_accepted_encodings_override (line 493) | def clear_accepted_encodings_override() -> ClearAcceptedEncodingsOverr...
    method enable_reporting_api (line 513) | def enable_reporting_api(
    method search_in_response_body (line 537) | def search_in_response_body(
    method set_blocked_urls (line 573) | def set_blocked_urls(urls: list[str]) -> SetBlockedURLsCommand:
    method set_bypass_service_worker (line 600) | def set_bypass_service_worker(
    method get_certificate (line 627) | def get_certificate(origin: str) -> GetCertificateCommand:
    method get_response_body_for_interception (line 653) | def get_response_body_for_interception(
    method set_accepted_encodings (line 680) | def set_accepted_encodings(
    method set_attach_debug_stack (line 707) | def set_attach_debug_stack(enabled: bool) -> SetAttachDebugStackCommand:
    method set_cookie_controls (line 732) | def set_cookie_controls(
    method stream_resource_content (line 769) | def stream_resource_content(
    method take_response_body_for_interception_as_stream (line 796) | def take_response_body_for_interception_as_stream(
    method emulate_network_conditions (line 826) | def emulate_network_conditions(
    method get_security_isolation_status (line 880) | def get_security_isolation_status(
    method load_network_resource (line 910) | def load_network_resource(
    method replay_xhr (line 944) | def replay_xhr(

FILE: pydoll/commands/page_commands.py
  class PageCommands (line 113) | class PageCommands:
    method add_script_to_evaluate_on_new_document (line 131) | def add_script_to_evaluate_on_new_document(
    method bring_to_front (line 162) | def bring_to_front() -> BringToFrontCommand:
    method capture_screenshot (line 169) | def capture_screenshot(
    method close (line 208) | def close() -> CloseCommand:
    method create_isolated_world (line 218) | def create_isolated_world(
    method disable (line 243) | def disable() -> DisableCommand:
    method enable (line 253) | def enable(
    method get_app_manifest (line 273) | def get_app_manifest(
    method get_frame_tree (line 288) | def get_frame_tree() -> GetFrameTreeCommand:
    method get_layout_metrics (line 298) | def get_layout_metrics() -> GetLayoutMetricsCommand:
    method get_navigation_history (line 308) | def get_navigation_history() -> GetNavigationHistoryCommand:
    method handle_javascript_dialog (line 318) | def handle_javascript_dialog(
    method navigate (line 338) | def navigate(
    method navigate_to_history_entry (line 371) | def navigate_to_history_entry(entry_id: int) -> NavigateToHistoryEntry...
    method print_to_pdf (line 385) | def print_to_pdf(  # noqa: PLR0912
    method reload (line 466) | def reload(
    method reset_navigation_history (line 492) | def reset_navigation_history() -> ResetNavigationHistoryCommand:
    method remove_script_to_evaluate_on_new_document (line 499) | def remove_script_to_evaluate_on_new_document(
    method set_bypass_csp (line 515) | def set_bypass_csp(enabled: bool) -> SetBypassCSPCommand:
    method set_document_content (line 529) | def set_document_content(frame_id: str, html: str) -> SetDocumentConte...
    method set_intercept_file_chooser_dialog (line 544) | def set_intercept_file_chooser_dialog(enabled: bool) -> SetInterceptFi...
    method set_lifecycle_events_enabled (line 559) | def set_lifecycle_events_enabled(enabled: bool) -> SetLifecycleEventsE...
    method stop_loading (line 573) | def stop_loading() -> StopLoadingCommand:
    method add_compilation_cache (line 583) | def add_compilation_cache(url: str, data: str) -> AddCompilationCacheC...
    method capture_snapshot (line 600) | def capture_snapshot(
    method clear_compilation_cache (line 618) | def clear_compilation_cache() -> ClearCompilationCacheCommand:
    method crash (line 625) | def crash() -> CrashCommand:
    method generate_test_report (line 632) | def generate_test_report(
    method get_ad_script_ancestry_ids (line 653) | def get_ad_script_ancestry_ids(
    method get_app_id (line 671) | def get_app_id(
    method get_installability_errors (line 694) | def get_installability_errors() -> GetInstallabilityErrorsCommand:
    method get_origin_trials (line 701) | def get_origin_trials(frame_id: str) -> GetOriginTrialsCommand:
    method get_permissions_policy_state (line 717) | def get_permissions_policy_state(
    method get_resource_content (line 727) | def get_resource_content(
    method get_resource_tree (line 738) | def get_resource_tree() -> GetResourceTreeCommand:
    method produce_compilation_cache (line 745) | def produce_compilation_cache(
    method screencast_frame_ack (line 755) | def screencast_frame_ack(
    method search_in_resource (line 765) | def search_in_resource(
    method set_ad_blocking_enabled (line 783) | def set_ad_blocking_enabled(
    method set_font_families (line 793) | def set_font_families(
    method set_font_sizes (line 804) | def set_font_sizes(
    method set_prerendering_allowed (line 814) | def set_prerendering_allowed(
    method set_rph_registration_mode (line 824) | def set_rph_registration_mode(
    method set_spc_transaction_mode (line 834) | def set_spc_transaction_mode(
    method set_web_lifecycle_state (line 844) | def set_web_lifecycle_state(
    method start_screencast (line 854) | def start_screencast(
    method stop_screencast (line 876) | def stop_screencast() -> StopScreencastCommand:
    method wait_for_debugger (line 883) | def wait_for_debugger() -> WaitForDebuggerCommand:

FILE: pydoll/commands/runtime_commands.py
  class RuntimeCommands (line 49) | class RuntimeCommands:
    method add_binding (line 66) | def add_binding(name: str, execution_context_name: Optional[str] = Non...
    method await_promise (line 84) | def await_promise(
    method call_function_on (line 110) | def call_function_on(
    method compile_script (line 179) | def compile_script(
    method disable (line 207) | def disable() -> DisableCommand:
    method enable (line 217) | def enable() -> EnableCommand:
    method evaluate (line 227) | def evaluate(  # noqa: PLR0912
    method get_properties (line 307) | def get_properties(
    method global_lexical_scope_names (line 341) | def global_lexical_scope_names(
    method query_objects (line 362) | def query_objects(
    method release_object (line 383) | def release_object(
    method release_object_group (line 400) | def release_object_group(
    method remove_binding (line 416) | def remove_binding(
    method run_script (line 432) | def run_script(
    method set_async_call_stack_depth (line 478) | def set_async_call_stack_depth(
    method set_custom_object_formatter_enabled (line 494) | def set_custom_object_formatter_enabled(
    method set_max_call_stack_size_to_capture (line 511) | def set_max_call_stack_size_to_capture(

FILE: pydoll/commands/storage_commands.py
  class StorageCommands (line 87) | class StorageCommands:  # noqa: PLR0904
    method clear_cookies (line 107) | def clear_cookies(browser_context_id: Optional[str] = None) -> ClearCo...
    method clear_data_for_origin (line 124) | def clear_data_for_origin(origin: str, storage_types: str) -> ClearDat...
    method clear_data_for_storage_key (line 141) | def clear_data_for_storage_key(
    method get_cookies (line 163) | def get_cookies(browser_context_id: Optional[str] = None) -> GetCookie...
    method get_storage_key_for_frame (line 181) | def get_storage_key_for_frame(frame_id: str) -> GetStorageKeyForFrameC...
    method get_usage_and_quota (line 199) | def get_usage_and_quota(origin: str) -> GetUsageAndQuotaCommand:
    method set_cookies (line 219) | def set_cookies(
    method set_protected_audience_k_anonymity (line 239) | def set_protected_audience_k_anonymity(
    method track_cache_storage_for_origin (line 261) | def track_cache_storage_for_origin(origin: str) -> TrackCacheStorageFo...
    method track_cache_storage_for_storage_key (line 279) | def track_cache_storage_for_storage_key(
    method track_indexed_db_for_origin (line 300) | def track_indexed_db_for_origin(origin: str) -> TrackIndexedDBForOrigi...
    method track_indexed_db_for_storage_key (line 319) | def track_indexed_db_for_storage_key(storage_key: str) -> TrackIndexed...
    method untrack_cache_storage_for_origin (line 338) | def untrack_cache_storage_for_origin(origin: str) -> UntrackCacheStora...
    method untrack_cache_storage_for_storage_key (line 356) | def untrack_cache_storage_for_storage_key(
    method untrack_indexed_db_for_origin (line 377) | def untrack_indexed_db_for_origin(origin: str) -> UntrackIndexedDBForO...
    method untrack_indexed_db_for_storage_key (line 395) | def untrack_indexed_db_for_storage_key(
    method clear_shared_storage_entries (line 415) | def clear_shared_storage_entries(owner_origin: str) -> ClearSharedStor...
    method clear_trust_tokens (line 432) | def clear_trust_tokens(issuer_origin: str) -> ClearTrustTokensCommand:
    method delete_shared_storage_entry (line 451) | def delete_shared_storage_entry(owner_origin: str, key: str) -> Delete...
    method delete_storage_bucket (line 466) | def delete_storage_bucket(bucket: StorageBucket) -> DeleteStorageBucke...
    method get_affected_urls_for_third_party_cookie_metadata (line 484) | def get_affected_urls_for_third_party_cookie_metadata(
    method get_interest_group_details (line 510) | def get_interest_group_details(owner_origin: str, name: str) -> GetInt...
    method get_related_website_sets (line 528) | def get_related_website_sets() -> GetRelatedWebsiteSetsCommand:
    method get_shared_storage_entries (line 541) | def get_shared_storage_entries(owner_origin: str) -> GetSharedStorageE...
    method get_shared_storage_metadata (line 555) | def get_shared_storage_metadata(owner_origin: str) -> GetSharedStorage...
    method get_trust_tokens (line 571) | def get_trust_tokens() -> GetTrustTokensCommand:
    method override_quota_for_origin (line 582) | def override_quota_for_origin(
    method reset_shared_storage_budget (line 605) | def reset_shared_storage_budget(owner_origin: str) -> ResetSharedStora...
    method run_bounce_tracking_mitigations (line 622) | def run_bounce_tracking_mitigations() -> RunBounceTrackingMitigationsC...
    method send_pending_attribution_reports (line 636) | def send_pending_attribution_reports() -> SendPendingAttributionReport...
    method set_attribution_reporting_local_testing_mode (line 651) | def set_attribution_reporting_local_testing_mode(
    method set_attribution_reporting_tracking (line 673) | def set_attribution_reporting_tracking(enable: bool) -> SetAttribution...
    method set_interest_group_auction_tracking (line 688) | def set_interest_group_auction_tracking(enable: bool) -> SetInterestGr...
    method set_interest_group_tracking (line 706) | def set_interest_group_tracking(enable: bool) -> SetInterestGroupTrack...
    method set_shared_storage_entry (line 720) | def set_shared_storage_entry(
    method set_shared_storage_tracking (line 741) | def set_shared_storage_tracking(enable: bool) -> SetSharedStorageTrack...
    method set_storage_bucket_tracking (line 757) | def set_storage_bucket_tracking(

FILE: pydoll/commands/target_commands.py
  class TargetCommands (line 44) | class TargetCommands:
    method activate_target (line 57) | def activate_target(target_id: str) -> ActivateTargetCommand:
    method attach_to_target (line 71) | def attach_to_target(target_id: str, flatten: Optional[bool] = None) -...
    method close_target (line 93) | def close_target(target_id: str) -> CloseTargetCommand:
    method create_browser_context (line 110) | def create_browser_context(
    method create_target (line 152) | def create_target(
    method detach_from_target (line 226) | def detach_from_target(session_id: Optional[str] = None) -> DetachFrom...
    method dispose_browser_context (line 245) | def dispose_browser_context(browser_context_id: str) -> DisposeBrowser...
    method get_browser_contexts (line 262) | def get_browser_contexts() -> GetBrowserContextsCommand:
    method get_targets (line 276) | def get_targets(filter: Optional[list] = None) -> GetTargetsCommand:
    method set_auto_attach (line 299) | def set_auto_attach(
    method set_discover_targets (line 335) | def set_discover_targets(
    method attach_to_browser_target (line 359) | def attach_to_browser_target(session_id: str) -> AttachToBrowserTarget...
    method get_target_info (line 378) | def get_target_info(target_id: str) -> GetTargetInfoCommand:
    method set_remote_locations (line 396) | def set_remote_locations(locations: list[RemoteLocation]) -> SetRemote...

FILE: pydoll/connection/connection_handler.py
  class ConnectionHandler (line 31) | class ConnectionHandler:
    method __init__ (line 39) | def __init__(
    method network_logs (line 73) | def network_logs(self):
    method dialog (line 78) | def dialog(self):
    method ping (line 82) | async def ping(self) -> bool:
    method execute_command (line 92) | async def execute_command(
    method register_callback (line 137) | async def register_callback(
    method remove_callback (line 163) | async def remove_callback(self, callback_id: int) -> bool:
    method clear_callbacks (line 169) | async def clear_callbacks(self):
    method close (line 174) | async def close(self):
    method _ensure_active_connection (line 185) | async def _ensure_active_connection(self):
    method _establish_new_connection (line 191) | async def _establish_new_connection(self):
    method _resolve_ws_address (line 202) | async def _resolve_ws_address(self):
    method _handle_connection_loss (line 215) | async def _handle_connection_loss(self):
    method _receive_events (line 226) | async def _receive_events(self):
    method _incoming_messages (line 237) | async def _incoming_messages(self) -> AsyncGenerator[Union[str, bytes]...
    method _process_single_message (line 244) | async def _process_single_message(self, raw_message: str):
    method _parse_message (line 258) | def _parse_message(raw_message: str) -> Union[CDPEvent, Response, None]:
    method _is_command_response (line 267) | def _is_command_response(message: Union[CDPEvent, Response]) -> bool:
    method _handle_command_message (line 271) | async def _handle_command_message(self, message: Response):
    method _handle_event_message (line 276) | async def _handle_event_message(self, message: CDPEvent):
    method __repr__ (line 282) | def __repr__(self):
    method __str__ (line 286) | def __str__(self):
    method __aenter__ (line 290) | async def __aenter__(self):
    method __aexit__ (line 294) | async def __aexit__(self, exc_type, exc_val, exc_tb):

FILE: pydoll/connection/managers/commands_manager.py
  class CommandsManager (line 13) | class CommandsManager:
    method __init__ (line 21) | def __init__(self) -> None:
    method create_command_future (line 27) | def create_command_future(self, command: Command) -> asyncio.Future:
    method resolve_command (line 46) | def resolve_command(self, response_id: int, result: str):
    method remove_pending_command (line 53) | def remove_pending_command(self, command_id: int):

FILE: pydoll/connection/managers/events_manager.py
  class EventsManager (line 21) | class EventsManager:
    method __init__ (line 29) | def __init__(self) -> None:
    method register_callback (line 38) | def register_callback(
    method remove_callback (line 64) | def remove_callback(self, callback_id: int) -> bool:
    method clear_callbacks (line 75) | def clear_callbacks(self):
    method process_event (line 81) | async def process_event(self, event_data: CDPEvent):
    method _update_network_logs (line 105) | def _update_network_logs(self, event_data: RequestWillBeSentEvent):
    method _trigger_callbacks (line 110) | async def _trigger_callbacks(self, event_name: str, event_data: CDPEve...

FILE: pydoll/constants.py
  class By (line 4) | class By(str, Enum):
  class PageLoadState (line 13) | class PageLoadState(str, Enum):
  class ScrollPosition (line 19) | class ScrollPosition(str, Enum):
  class Scripts (line 26) | class Scripts:
  class Key (line 493) | class Key(tuple[str, int], Enum):
  class BrowserType (line 603) | class BrowserType(Enum):
  class TypoType (line 608) | class TypoType(str, Enum):

FILE: pydoll/decorators.py
  class RetryConfig (line 12) | class RetryConfig:
    method __init__ (line 13) | def __init__(
    method calculate_delay (line 27) | def calculate_delay(self, attempt: int) -> float:
    method call_callback (line 32) | async def call_callback(self, caller_instance: Any) -> None:
    method handle_delay (line 53) | async def handle_delay(self, attempt: int) -> None:
    method is_matching_exception (line 64) | def is_matching_exception(self, exc: Exception) -> bool:
  function retry (line 70) | def retry(

FILE: pydoll/elements/mixins/find_elements_mixin.py
  function create_web_element (line 36) | def create_web_element(*args, **kwargs):
  class FindElementsMixin (line 48) | class FindElementsMixin:
    method _build_text_expression (line 64) | def _build_text_expression(selector: str, method: str) -> Optional[str]:
    method find (line 71) | async def find(
    method find (line 85) | async def find(
    method find (line 99) | async def find(
    method find (line 113) | async def find(
    method find (line 127) | async def find(
    method find (line 140) | async def find(
    method query (line 210) | async def query(
    method query (line 219) | async def query(
    method query (line 228) | async def query(
    method query (line 237) | async def query(
    method query (line 246) | async def query(
    method query (line 254) | async def query(
    method find_or_wait_element (line 292) | async def find_or_wait_element(
    method _find_across_iframes (line 363) | async def _find_across_iframes(
    method _attempt_find_across_iframes (line 413) | async def _attempt_find_across_iframes(
    method _find_element (line 447) | async def _find_element(
    method _find_elements (line 512) | async def _find_elements(self, by: By, value: str, raise_exc: bool = T...
    method _get_object_attributes (line 594) | async def _get_object_attributes(self, object_id: str) -> list[str]:
    method _get_by_and_value (line 608) | def _get_by_and_value(
    method _build_xpath (line 652) | def _build_xpath(
    method _get_expression_type (line 674) | def _get_expression_type(expression: str) -> By:
    method _describe_node (line 684) | async def _describe_node(self, object_id: str = '') -> Node:
    method _apply_iframe_context_to_element (line 699) | def _apply_iframe_context_to_element(
    method _resolve_routing (line 717) | def _resolve_routing(self) -> tuple[ConnectionHandler, Optional[str]]:
    method _execute_command (line 729) | async def _execute_command(
    method _get_find_element_command (line 738) | def _get_find_element_command(
    method _get_find_elements_command (line 790) | def _get_find_elements_command(
    method _get_find_element_by_xpath_command (line 833) | def _get_find_element_by_xpath_command(
    method _get_find_elements_by_xpath_command (line 863) | def _get_find_elements_by_xpath_command(
    method _ensure_relative_xpath (line 894) | def _ensure_relative_xpath(xpath: str) -> str:
    method _has_object_id_key (line 903) | def _has_object_id_key(response: Union[EvaluateResponse, CallFunctionO...

FILE: pydoll/elements/shadow_root.py
  class ShadowRoot (line 18) | class ShadowRoot(FindElementsMixin):
    method __init__ (line 35) | def __init__(
    method mode (line 68) | def mode(self) -> ShadowRootType:
    method host_element (line 73) | def host_element(self) -> WebElement | None:
    method inner_html (line 78) | async def inner_html(self) -> str:
    method __repr__ (line 85) | def __repr__(self) -> str:
    method __str__ (line 88) | def __str__(self) -> str:

FILE: pydoll/elements/utils/selector_parser.py
  class SelectorParser (line 40) | class SelectorParser:
    method get_expression_type (line 54) | def get_expression_type(expression: str) -> By:
    method build_xpath (line 71) | def build_xpath(
    method ensure_relative_xpath (line 118) | def ensure_relative_xpath(xpath: str) -> str:
    method build_text_expression (line 131) | def build_text_expression(selector: str, method: str) -> Optional[str]:
    method parse_iframe_segments_xpath (line 165) | def parse_iframe_segments_xpath(expression: str) -> list[tuple[By, str]]:
    method parse_iframe_segments_css (line 203) | def parse_iframe_segments_css(expression: str) -> list[tuple[By, str]]:
    method _is_at_nesting_depth_zero (line 240) | def _is_at_nesting_depth_zero(
    method _detect_xpath_leading_separator (line 271) | def _detect_xpath_leading_separator(expression: str) -> tuple[str, int]:
    method _tokenize_xpath_steps (line 281) | def _tokenize_xpath_steps(expression: str) -> list[tuple[str, str]]:
    method _is_iframe_xpath_step (line 313) | def _is_iframe_xpath_step(step_text: str) -> bool:
    method _build_xpath_segments (line 320) | def _build_xpath_segments(
    method _tokenize_css_compounds (line 354) | def _tokenize_css_compounds(expression: str) -> list[tuple[str, str | ...
    method _consume_css_combinator (line 386) | def _consume_css_combinator(expression: str, start: int) -> tuple[str,...
    method _is_iframe_css_compound (line 401) | def _is_iframe_css_compound(compound_text: str) -> bool:
    method _format_css_combinator (line 412) | def _format_css_combinator(combinator: str) -> str:
    method _build_css_segments (line 419) | def _build_css_segments(

FILE: pydoll/elements/web_element.py
  class WebElement (line 74) | class WebElement(FindElementsMixin):  # noqa: PLR0904
    method __init__ (line 87) | def __init__(
    method _get_keyboard (line 132) | def _get_keyboard(self) -> Keyboard:
    method _get_iframe_resolver (line 138) | def _get_iframe_resolver(self) -> IFrameContextResolver:
    method attributes (line 145) | def attributes(self) -> dict[str, str]:
    method value (line 150) | def value(self) -> Optional[str]:
    method class_name (line 155) | def class_name(self) -> Optional[str]:
    method id (line 160) | def id(self) -> Optional[str]:
    method tag_name (line 165) | def tag_name(self) -> Optional[str]:
    method is_iframe (line 170) | def is_iframe(self) -> bool:
    method is_enabled (line 175) | def is_enabled(self) -> bool:
    method text (line 180) | async def text(self) -> str:
    method bounds (line 196) | async def bounds(self) -> Quad:
    method inner_html (line 209) | async def inner_html(self) -> str:
    method iframe_context (line 224) | async def iframe_context(self) -> Optional[IFrameContext]:
    method get_attribute (line 245) | def get_attribute(self, name: str) -> Optional[str]:
    method get_bounds_using_js (line 257) | async def get_bounds_using_js(self) -> dict[str, int]:
    method get_parent_element (line 268) | async def get_parent_element(self) -> WebElement:
    method get_shadow_root (line 282) | async def get_shadow_root(self, timeout: float = 0) -> ShadowRoot:
    method _get_shadow_root (line 316) | async def _get_shadow_root(self) -> ShadowRoot:
    method get_children_elements (line 346) | async def get_children_elements(
    method get_siblings_elements (line 377) | async def get_siblings_elements(
    method take_screenshot (line 404) | async def take_screenshot(
    method scroll_into_view (line 477) | async def scroll_into_view(self):
    method wait_until (line 483) | async def wait_until(
    method click_using_js (line 529) | async def click_using_js(self):
    method click (line 555) | async def click(
    method focus (line 633) | async def focus(self):
    method clear (line 637) | async def clear(self):
    method insert_text (line 656) | async def insert_text(self, text: str):
    method set_input_files (line 690) | async def set_input_files(self, files: str | Path | list[str | Path]):
    method type_text (line 711) | async def type_text(
    method key_down (line 730) | async def key_down(self, key: Key, modifiers: Optional[KeyModifier] = ...
    method key_up (line 758) | async def key_up(self, key: Key):
    method press_keyboard_key (line 782) | async def press_keyboard_key(
    method is_editable (line 806) | async def is_editable(self) -> bool:
    method is_visible (line 818) | async def is_visible(self):
    method is_on_top (line 825) | async def is_on_top(self):
    method is_interactable (line 832) | async def is_interactable(self):
    method execute_script (line 839) | async def execute_script(
    method __repr__ (line 922) | def __repr__(self):
    method _is_inside_iframe (line 927) | def _is_inside_iframe(self) -> bool:
    method _get_iframe_inner_html (line 931) | async def _get_iframe_inner_html(self) -> str:
    method _apply_routing_from_context (line 945) | def _apply_routing_from_context(self) -> None:
    method _click_option_tag (line 959) | async def _click_option_tag(self):
    method _get_family_elements (line 969) | async def _get_family_elements(
    method _def_attributes (line 1015) | def _def_attributes(self, attributes_list: list[str]):
    method _is_option_tag (line 1024) | def _is_option_tag(self):
    method _is_option_element (line 1028) | async def _is_option_element(self) -> bool:
    method _calculate_center (line 1052) | def _calculate_center(bounds: list) -> tuple:

FILE: pydoll/exceptions.py
  class PydollException (line 10) | class PydollException(Exception):
    method __init__ (line 15) | def __init__(self, message: str = ''):
    method __str__ (line 18) | def __str__(self):
  class ConnectionException (line 22) | class ConnectionException(PydollException):
  class ConnectionFailed (line 28) | class ConnectionFailed(ConnectionException):
  class ReconnectionFailed (line 34) | class ReconnectionFailed(ConnectionException):
  class WebSocketConnectionClosed (line 40) | class WebSocketConnectionClosed(ConnectionException):
  class NetworkError (line 46) | class NetworkError(ConnectionException):
  class BrowserException (line 52) | class BrowserException(PydollException):
  class BrowserNotRunning (line 58) | class BrowserNotRunning(BrowserException):
  class FailedToStartBrowser (line 64) | class FailedToStartBrowser(BrowserException):
  class UnsupportedOS (line 70) | class UnsupportedOS(BrowserException):
  class NoValidTabFound (line 76) | class NoValidTabFound(BrowserException):
  class InvalidConnectionPort (line 82) | class InvalidConnectionPort(BrowserException):
  class InvalidWebSocketAddress (line 88) | class InvalidWebSocketAddress(BrowserException):
  class MissingTargetOrWebSocket (line 94) | class MissingTargetOrWebSocket(BrowserException):
  class ProtocolException (line 100) | class ProtocolException(PydollException):
  class TopLevelTargetRequired (line 106) | class TopLevelTargetRequired(ProtocolException):
  class InvalidCommand (line 112) | class InvalidCommand(ProtocolException):
  class InvalidResponse (line 118) | class InvalidResponse(ProtocolException):
  class ResendCommandFailed (line 124) | class ResendCommandFailed(ProtocolException):
  class CommandExecutionTimeout (line 130) | class CommandExecutionTimeout(ProtocolException):
  class InvalidCallback (line 136) | class InvalidCallback(ProtocolException):
  class EventNotSupported (line 142) | class EventNotSupported(ProtocolException):
  class ElementException (line 148) | class ElementException(PydollException):
  class ElementNotFound (line 154) | class ElementNotFound(ElementException):
  class ElementNotVisible (line 160) | class ElementNotVisible(ElementException):
  class ElementNotInteractable (line 166) | class ElementNotInteractable(ElementException):
  class ClickIntercepted (line 172) | class ClickIntercepted(ElementException):
  class ElementNotAFileInput (line 178) | class ElementNotAFileInput(ElementException):
  class ShadowRootNotFound (line 184) | class ShadowRootNotFound(ElementException):
  class TimeoutException (line 190) | class TimeoutException(PydollException):
  class PageLoadTimeout (line 196) | class PageLoadTimeout(TimeoutException):
  class WaitElementTimeout (line 202) | class WaitElementTimeout(TimeoutException):
  class DownloadTimeout (line 208) | class DownloadTimeout(TimeoutException):
  class ConfigurationException (line 214) | class ConfigurationException(PydollException):
  class InvalidOptionsObject (line 220) | class InvalidOptionsObject(ConfigurationException):
  class InvalidBrowserPath (line 226) | class InvalidBrowserPath(ConfigurationException):
  class ArgumentAlreadyExistsInOptions (line 232) | class ArgumentAlreadyExistsInOptions(ConfigurationException):
  class ArgumentNotFoundInOptions (line 238) | class ArgumentNotFoundInOptions(ConfigurationException):
  class InvalidFileExtension (line 244) | class InvalidFileExtension(ConfigurationException):
  class InvalidTabInitialization (line 250) | class InvalidTabInitialization(ConfigurationException):
  class MissingScreenshotPath (line 256) | class MissingScreenshotPath(ConfigurationException):
  class DialogException (line 262) | class DialogException(PydollException):
  class NoDialogPresent (line 268) | class NoDialogPresent(DialogException):
  class NotAnIFrame (line 274) | class NotAnIFrame(PydollException):
  class InvalidIFrame (line 280) | class InvalidIFrame(PydollException):
  class IFrameNotFound (line 286) | class IFrameNotFound(PydollException):
  class NetworkEventsNotEnabled (line 292) | class NetworkEventsNotEnabled(PydollException):
  class RequestException (line 298) | class RequestException(PydollException):
  class HTTPError (line 304) | class HTTPError(RequestException):
  class HarRecordingError (line 310) | class HarRecordingError(RequestException):
  class ScriptException (line 316) | class ScriptException(PydollException):
  class InvalidScriptWithElement (line 322) | class InvalidScriptWithElement(ScriptException):
  class WrongPrefsDict (line 328) | class WrongPrefsDict(PydollException):
  class ElementPreconditionError (line 334) | class ElementPreconditionError(ElementException):

FILE: pydoll/interactions/iframe.py
  class IFrameContext (line 24) | class IFrameContext:
  class IFrameContextResolver (line 35) | class IFrameContextResolver:
    method __init__ (line 38) | def __init__(self, element: WebElement):
    method resolve (line 41) | async def resolve(self) -> IFrameContext:
    method _get_base_session (line 94) | def _get_base_session(self) -> tuple[ConnectionHandler, Optional[str]]:
    method _describe_element_node (line 103) | async def _describe_element_node(
    method _extract_frame_metadata (line 123) | def _extract_frame_metadata(
    method _resolve_frame_by_owner (line 148) | async def _resolve_frame_by_owner(
    method _find_frame_by_owner (line 163) | async def _find_frame_by_owner(
    method _get_frame_tree_for (line 183) | async def _get_frame_tree_for(
    method _walk_frames (line 195) | def _walk_frames(tree: FrameTree) -> Iterable[Frame]:
    method _owner_backend_for (line 205) | async def _owner_backend_for(
    method _resolve_oopif_if_needed (line 217) | async def _resolve_oopif_if_needed(
    method _resolve_oopif_by_parent (line 254) | async def _resolve_oopif_by_parent(
    method _find_child_by_parent (line 376) | def _find_child_by_parent(tree: FrameTree, parent_id: str) -> Optional...
    method _create_isolated_world_for_frame (line 390) | async def _create_isolated_world_for_frame(
    method _get_document_object_id (line 409) | async def _get_document_object_id(

FILE: pydoll/interactions/keyboard.py
  class CommandExecutor (line 23) | class CommandExecutor(Protocol):
    method _execute_command (line 26) | async def _execute_command(self, command: Any) -> Any: ...
  class TypoResult (line 30) | class TypoResult:
  class TimingConfig (line 38) | class TimingConfig:
  class TypoConfig (line 62) | class TypoConfig:
  class Keyboard (line 72) | class Keyboard:
    method __init__ (line 83) | def __init__(
    method _ensure_focus (line 102) | async def _ensure_focus(self):
    method press (line 107) | async def press(
    method down (line 130) | async def down(self, key: Key, modifiers: Optional[KeyModifier] = None):
    method up (line 149) | async def up(self, key: Key):
    method hotkey (line 166) | async def hotkey(self, key1: Key, key2: Key, key3: Optional[Key] = None):
    method type_text (line 196) | async def type_text(
    method _type_text_humanized (line 231) | async def _type_text_humanized(self, text: str):
    method _type_char (line 246) | async def _type_char(self, char: str):
    method _type_backspace (line 270) | async def _type_backspace(self):
    method _process_char_with_typo (line 276) | async def _process_char_with_typo(
    method _handle_typo (line 289) | async def _handle_typo(
    method _do_adjacent_typo (line 319) | async def _do_adjacent_typo(self, correct_char: str, wrong_char: str):
    method _do_transpose_typo (line 330) | async def _do_transpose_typo(self, current_char: str, next_char: str):
    method _do_double_typo (line 348) | async def _do_double_typo(self, current_char: str):
    method _do_skip_typo (line 357) | async def _do_skip_typo(self, current_char: str):
    method _do_missed_space_typo (line 363) | async def _do_missed_space_typo(self, space_char: str, next_char: str):
    method _apply_realistic_delay (line 378) | async def _apply_realistic_delay(self, typed_char: str):
    method _should_make_typo (line 395) | def _should_make_typo() -> bool:
    method _generate_typo (line 399) | def _generate_typo(self, current_char: str, next_char: Optional[str]) ...
    method _select_typo_type (line 404) | def _select_typo_type(self) -> TypoType:
    method _create_typo (line 423) | def _create_typo(
    method _create_transpose_typo (line 440) | def _create_transpose_typo(self, current_char: str, next_char: Optiona...
    method _create_missed_space_typo (line 446) | def _create_missed_space_typo(self, current_char: str) -> TypoResult:
    method _create_adjacent_typo (line 453) | def _create_adjacent_typo(original_char: str) -> TypoResult:
    method _split_modifiers_and_keys (line 468) | def _split_modifiers_and_keys(keys: list[Key]) -> tuple[list[Key], lis...
    method _calculate_modifier_value (line 476) | def _calculate_modifier_value(modifiers: list[Key]) -> Optional[KeyMod...

FILE: pydoll/interactions/mouse.py
  class MouseTimingConfig (line 26) | class MouseTimingConfig:
  class Mouse (line 67) | class Mouse:
    method __init__ (line 102) | def __init__(
    method timing (line 123) | def timing(self) -> MouseTimingConfig:
    method timing (line 128) | def timing(self, config: MouseTimingConfig) -> None:
    method debug (line 137) | def debug(self) -> bool:
    method debug (line 142) | def debug(self, value: bool) -> None:
    method move (line 147) | async def move(
    method click (line 168) | async def click(
    method double_click (line 195) | async def double_click(
    method down (line 214) | async def down(self, button: MouseButton = MouseButton.LEFT) -> None:
    method up (line 223) | async def up(self, button: MouseButton = MouseButton.LEFT) -> None:
    method drag (line 232) | async def drag(
    method _move_humanized (line 260) | async def _move_humanized(self, target_x: float, target_y: float) -> N...
    method _move_with_overshoot (line 287) | async def _move_with_overshoot(
    method _perform_movement_loop (line 308) | async def _perform_movement_loop(
    method _compute_tremor_sigma (line 350) | def _compute_tremor_sigma(
    method _click_humanized (line 366) | async def _click_humanized(
    method _drag_humanized (line 397) | async def _drag_humanized(
    method _get_control_points (line 427) | def _get_control_points(
    method _dispatch_move (line 443) | async def _dispatch_move(self, x: float, y: float) -> None:
    method _dispatch_button (line 456) | async def _dispatch_button(
    method _debug_draw_dot (line 477) | async def _debug_draw_dot(self, x: float, y: float, radius: int, color...

FILE: pydoll/interactions/scroll.py
  class ScrollTimingConfig (line 20) | class ScrollTimingConfig:
  class Scroll (line 41) | class Scroll:
    method __init__ (line 50) | def __init__(
    method by (line 65) | async def by(
    method to_top (line 96) | async def to_top(self, smooth: bool = True, humanize: bool = False):
    method to_bottom (line 112) | async def to_bottom(self, smooth: bool = True, humanize: bool = False):
    method _scroll_to_end_humanized (line 128) | async def _scroll_to_end_humanized(self, position: ScrollPosition):
    method _scroll_humanized (line 178) | async def _scroll_humanized(self, position: ScrollPosition, target_dis...
    method _perform_scroll_loop (line 211) | async def _perform_scroll_loop(
    method _calculate_effective_distance (line 261) | def _calculate_effective_distance(self, target_distance: float) -> float:
    method _calculate_duration (line 272) | def _calculate_duration(self, distance: float) -> float:
    method _scroll_correction (line 279) | async def _scroll_correction(self, is_vertical: bool, direction: int, ...
    method _dispatch_scroll_event (line 303) | async def _dispatch_scroll_event(self, delta_x: int, delta_y: int):
    method _get_viewport_center (line 315) | async def _get_viewport_center(self) -> tuple[int, int]:
    method _get_current_scroll_y (line 330) | async def _get_current_scroll_y(self) -> float:
    method _get_remaining_scroll_to_bottom (line 336) | async def _get_remaining_scroll_to_bottom(self) -> float:
    method _get_axis_and_distance (line 343) | def _get_axis_and_distance(
    method _get_behavior (line 367) | def _get_behavior(smooth: bool) -> str:
    method _execute_script_await_promise (line 379) | async def _execute_script_await_promise(self, script: str):

FILE: pydoll/interactions/utils.py
  class CubicBezier (line 7) | class CubicBezier:
    method __init__ (line 14) | def __init__(self, point1_x: float, point1_y: float, point2_x: float, ...
    method sample_curve_x (line 23) | def sample_curve_x(self, time_progress: float) -> float:
    method sample_curve_y (line 29) | def sample_curve_y(self, time_progress: float) -> float:
    method sample_curve_derivative_x (line 35) | def sample_curve_derivative_x(self, time_progress: float) -> float:
    method solve_curve_x (line 40) | def solve_curve_x(self, target_x: float, epsilon: float = 1e-6) -> float:
    method solve (line 74) | def solve(self, input_x: float) -> float:
  function minimum_jerk (line 79) | def minimum_jerk(t: float) -> float:
  function bezier_2d (line 90) | def bezier_2d(
  function fitts_duration (line 111) | def fitts_duration(
  function random_control_points (line 123) | def random_control_points(

FILE: pydoll/protocol/base.py
  class EmptyParams (line 11) | class EmptyParams(TypedDict):
  class EmptyResponse (line 17) | class EmptyResponse(TypedDict):
  class Command (line 23) | class Command(TypedDict, Generic[T_CommandParams, T_CommandResponse]):
  class Response (line 38) | class Response(TypedDict, Generic[T_CommandResponse]):
  class CDPEvent (line 52) | class CDPEvent(TypedDict, Generic[T_EventParams]):

FILE: pydoll/protocol/browser/events.py
  class BrowserEvent (line 9) | class BrowserEvent(str, Enum):
  class DownloadProgressEventParams (line 43) | class DownloadProgressEventParams(TypedDict):
  class DownloadWillBeginEventParams (line 51) | class DownloadWillBeginEventParams(TypedDict):

FILE: pydoll/protocol/browser/methods.py
  class BrowserMethod (line 20) | class BrowserMethod(str, Enum):
  class SetPermissionParams (line 45) | class SetPermissionParams(TypedDict):
  class GrantPermissionsParams (line 54) | class GrantPermissionsParams(TypedDict):
  class ResetPermissionsParams (line 62) | class ResetPermissionsParams(TypedDict):
  class SetDownloadBehaviorParams (line 68) | class SetDownloadBehaviorParams(TypedDict):
  class CancelDownloadParams (line 77) | class CancelDownloadParams(TypedDict):
  class GetHistogramsParams (line 84) | class GetHistogramsParams(TypedDict):
  class GetHistogramParams (line 91) | class GetHistogramParams(TypedDict):
  class GetWindowBoundsParams (line 98) | class GetWindowBoundsParams(TypedDict):
  class GetWindowForTargetParams (line 104) | class GetWindowForTargetParams(TypedDict):
  class SetWindowBoundsParams (line 110) | class SetWindowBoundsParams(TypedDict):
  class SetContentsSizeParams (line 117) | class SetContentsSizeParams(TypedDict):
  class SetDockTileParams (line 125) | class SetDockTileParams(TypedDict):
  class ExecuteBrowserCommandParams (line 132) | class ExecuteBrowserCommandParams(TypedDict):
  class AddPrivacySandboxEnrollmentOverrideParams (line 138) | class AddPrivacySandboxEnrollmentOverrideParams(TypedDict):
  class AddPrivacySandboxCoordinatorKeyConfigParams (line 144) | class AddPrivacySandboxCoordinatorKeyConfigParams(TypedDict):
  class GetVersionResult (line 154) | class GetVersionResult(TypedDict):
  class GetBrowserCommandLineResult (line 164) | class GetBrowserCommandLineResult(TypedDict):
  class GetHistogramsResult (line 170) | class GetHistogramsResult(TypedDict):
  class GetHistogramResult (line 176) | class GetHistogramResult(TypedDict):
  class GetWindowBoundsResult (line 182) | class GetWindowBoundsResult(TypedDict):
  class GetWindowForTargetResult (line 188) | class GetWindowForTargetResult(TypedDict):

FILE: pydoll/protocol/browser/types.py
  class WindowState (line 9) | class WindowState(str, Enum):
  class DownloadBehavior (line 18) | class DownloadBehavior(str, Enum):
  class DownloadProgressState (line 27) | class DownloadProgressState(str, Enum):
  class Bounds (line 35) | class Bounds(TypedDict, total=False):
  class PermissionType (line 45) | class PermissionType(str, Enum):
  class PermissionSetting (line 87) | class PermissionSetting(str, Enum):
  class PermissionDescriptor (line 95) | class PermissionDescriptor(TypedDict, total=False):
  class BrowserCommandId (line 111) | class BrowserCommandId(str, Enum):
  class Bucket (line 119) | class Bucket(TypedDict):
  class Histogram (line 127) | class Histogram(TypedDict):
  class PrivacySandboxAPI (line 136) | class PrivacySandboxAPI(str, Enum):

FILE: pydoll/protocol/debugger/types.py
  class SearchMatch (line 4) | class SearchMatch(TypedDict):

FILE: pydoll/protocol/dom/events.py
  class DomEvent (line 9) | class DomEvent(str, Enum):
  class AttributeModifiedEventParams (line 158) | class AttributeModifiedEventParams(TypedDict):
  class AttributeRemovedEventParams (line 166) | class AttributeRemovedEventParams(TypedDict):
  class CharacterDataModifiedEventParams (line 173) | class CharacterDataModifiedEventParams(TypedDict):
  class ChildNodeCountUpdatedEventParams (line 180) | class ChildNodeCountUpdatedEventParams(TypedDict):
  class ChildNodeInsertedEventParams (line 187) | class ChildNodeInsertedEventParams(TypedDict):
  class ChildNodeRemovedEventParams (line 195) | class ChildNodeRemovedEventParams(TypedDict):
  class DistributedNodesUpdatedEventParams (line 202) | class DistributedNodesUpdatedEventParams(TypedDict):
  class DocumentUpdatedEventParams (line 209) | class DocumentUpdatedEventParams(TypedDict):
  class InlineStyleInvalidatedEventParams (line 215) | class InlineStyleInvalidatedEventParams(TypedDict):
  class PseudoElementAddedEventParams (line 221) | class PseudoElementAddedEventParams(TypedDict):
  class PseudoElementRemovedEventParams (line 228) | class PseudoElementRemovedEventParams(TypedDict):
  class ScrollableFlagUpdatedEventParams (line 235) | class ScrollableFlagUpdatedEventParams(TypedDict):
  class ShadowRootPoppedEventParams (line 242) | class ShadowRootPoppedEventParams(TypedDict):
  class ShadowRootPushedEventParams (line 249) | class ShadowRootPushedEventParams(TypedDict):
  class SetChildNodesEventParams (line 256) | class SetChildNodesEventParams(TypedDict):
  class TopLayerElementsUpdatedEventParams (line 263) | class TopLayerElementsUpdatedEventParams(TypedDict):

FILE: pydoll/protocol/dom/methods.py
  class DomMethod (line 29) | class DomMethod(str, Enum):
  class CollectClassNamesFromSubtreeParams (line 87) | class CollectClassNamesFromSubtreeParams(TypedDict):
  class CopyToParams (line 93) | class CopyToParams(TypedDict, total=False):
  class DescribeNodeParams (line 101) | class DescribeNodeParams(TypedDict, total=False):
  class ScrollIntoViewIfNeededParams (line 111) | class ScrollIntoViewIfNeededParams(TypedDict, total=False):
  class DiscardSearchResultsParams (line 120) | class DiscardSearchResultsParams(TypedDict):
  class EnableParams (line 126) | class EnableParams(TypedDict, total=False):
  class FocusParams (line 132) | class FocusParams(TypedDict, total=False):
  class GetAttributesParams (line 140) | class GetAttributesParams(TypedDict):
  class GetBoxModelParams (line 146) | class GetBoxModelParams(TypedDict, total=False):
  class GetContentQuadsParams (line 154) | class GetContentQuadsParams(TypedDict, total=False):
  class GetDocumentParams (line 162) | class GetDocumentParams(TypedDict, total=False):
  class GetFlattenedDocumentParams (line 169) | class GetFlattenedDocumentParams(TypedDict, total=False):
  class GetNodesForSubtreeByStyleParams (line 176) | class GetNodesForSubtreeByStyleParams(TypedDict, total=False):
  class GetNodeForLocationParams (line 184) | class GetNodeForLocationParams(TypedDict, total=False):
  class GetOuterHTMLParams (line 193) | class GetOuterHTMLParams(TypedDict, total=False):
  class GetRelayoutBoundaryParams (line 202) | class GetRelayoutBoundaryParams(TypedDict):
  class GetSearchResultsParams (line 208) | class GetSearchResultsParams(TypedDict):
  class MoveToParams (line 216) | class MoveToParams(TypedDict, total=False):
  class PerformSearchParams (line 224) | class PerformSearchParams(TypedDict, total=False):
  class PushNodeByPathToFrontendParams (line 231) | class PushNodeByPathToFrontendParams(TypedDict):
  class PushNodesByBackendIdsToFrontendParams (line 237) | class PushNodesByBackendIdsToFrontendParams(TypedDict):
  class QuerySelectorParams (line 243) | class QuerySelectorParams(TypedDict):
  class QuerySelectorAllParams (line 250) | class QuerySelectorAllParams(TypedDict):
  class GetElementByRelationParams (line 257) | class GetElementByRelationParams(TypedDict):
  class RemoveAttributeParams (line 264) | class RemoveAttributeParams(TypedDict):
  class RemoveNodeParams (line 271) | class RemoveNodeParams(TypedDict):
  class RequestChildNodesParams (line 277) | class RequestChildNodesParams(TypedDict, total=False):
  class RequestNodeParams (line 285) | class RequestNodeParams(TypedDict):
  class ResolveNodeParams (line 291) | class ResolveNodeParams(TypedDict, total=False):
  class SetAttributeValueParams (line 300) | class SetAttributeValueParams(TypedDict):
  class SetAttributesAsTextParams (line 308) | class SetAttributesAsTextParams(TypedDict, total=False):
  class SetFileInputFilesParams (line 316) | class SetFileInputFilesParams(TypedDict, total=False):
  class SetNodeStackTracesEnabledParams (line 325) | class SetNodeStackTracesEnabledParams(TypedDict):
  class GetNodeStackTracesParams (line 331) | class GetNodeStackTracesParams(TypedDict):
  class GetFileInfoParams (line 337) | class GetFileInfoParams(TypedDict):
  class SetInspectedNodeParams (line 343) | class SetInspectedNodeParams(TypedDict):
  class SetNodeNameParams (line 349) | class SetNodeNameParams(TypedDict):
  class SetNodeValueParams (line 356) | class SetNodeValueParams(TypedDict):
  class SetOuterHTMLParams (line 363) | class SetOuterHTMLParams(TypedDict):
  class GetFrameOwnerParams (line 370) | class GetFrameOwnerParams(TypedDict):
  class GetContainerForNodeParams (line 376) | class GetContainerForNodeParams(TypedDict, total=False):
  class GetQueryingDescendantsForContainerParams (line 387) | class GetQueryingDescendantsForContainerParams(TypedDict):
  class GetAnchorElementParams (line 393) | class GetAnchorElementParams(TypedDict, total=False):
  class ForceShowPopoverParams (line 400) | class ForceShowPopoverParams(TypedDict):
  class CollectClassNamesFromSubtreeResult (line 408) | class CollectClassNamesFromSubtreeResult(TypedDict):
  class CopyToResult (line 414) | class CopyToResult(TypedDict):
  class DescribeNodeResult (line 420) | class DescribeNodeResult(TypedDict):
  class GetAttributesResult (line 426) | class GetAttributesResult(TypedDict):
  class GetBoxModelResult (line 432) | class GetBoxModelResult(TypedDict):
  class GetContentQuadsResult (line 438) | class GetContentQuadsResult(TypedDict):
  class GetDocumentResult (line 444) | class GetDocumentResult(TypedDict):
  class GetFlattenedDocumentResult (line 450) | class GetFlattenedDocumentResult(TypedDict):
  class GetNodesForSubtreeByStyleResult (line 456) | class GetNodesForSubtreeByStyleResult(TypedDict):
  class GetNodeForLocationResult (line 462) | class GetNodeForLocationResult(TypedDict, total=False):
  class GetOuterHTMLResult (line 470) | class GetOuterHTMLResult(TypedDict):
  class GetRelayoutBoundaryResult (line 476) | class GetRelayoutBoundaryResult(TypedDict):
  class GetSearchResultsResult (line 482) | class GetSearchResultsResult(TypedDict):
  class GetTopLayerElementsResult (line 488) | class GetTopLayerElementsResult(TypedDict):
  class GetElementByRelationResult (line 494) | class GetElementByRelationResult(TypedDict):
  class MoveToResult (line 500) | class MoveToResult(TypedDict):
  class PerformSearchResult (line 506) | class PerformSearchResult(TypedDict):
  class PushNodeByPathToFrontendResult (line 513) | class PushNodeByPathToFrontendResult(TypedDict):
  class PushNodesByBackendIdsToFrontendResult (line 519) | class PushNodesByBackendIdsToFrontendResult(TypedDict):
  class QuerySelectorResult (line 525) | class QuerySelectorResult(TypedDict):
  class QuerySelectorAllResult (line 531) | class QuerySelectorAllResult(TypedDict):
  class RequestNodeResult (line 537) | class RequestNodeResult(TypedDict):
  class ResolveNodeResult (line 543) | class ResolveNodeResult(TypedDict):
  class SetNodeNameResult (line 549) | class SetNodeNameResult(TypedDict):
  class GetNodeStackTracesResult (line 555) | class GetNodeStackTracesResult(TypedDict, total=False):
  class GetFileInfoResult (line 561) | class GetFileInfoResult(TypedDict):
  class GetDetachedDomNodesResult (line 567) | class GetDetachedDomNodesResult(TypedDict):
  class GetFrameOwnerResult (line 573) | class GetFrameOwnerResult(TypedDict, total=False):
  class GetContainerForNodeResult (line 580) | class GetContainerForNodeResult(TypedDict, total=False):
  class GetQueryingDescendantsForContainerResult (line 586) | class GetQueryingDescendantsForContainerResult(TypedDict):
  class GetAnchorElementResult (line 592) | class GetAnchorElementResult(TypedDict):
  class ForceShowPopoverResult (line 598) | class ForceShowPopoverResult(TypedDict):

FILE: pydoll/protocol/dom/types.py
  class PseudoType (line 11) | class PseudoType(str, Enum):
  class ShadowRootType (line 54) | class ShadowRootType(str, Enum):
  class CompatibilityMode (line 62) | class CompatibilityMode(str, Enum):
  class PhysicalAxes (line 70) | class PhysicalAxes(str, Enum):
  class LogicalAxes (line 78) | class LogicalAxes(str, Enum):
  class ScrollOrientation (line 86) | class ScrollOrientation(str, Enum):
  class IncludeWhitespace (line 93) | class IncludeWhitespace(str, Enum):
  class RelationType (line 100) | class RelationType(str, Enum):
  class BackendNode (line 108) | class BackendNode(TypedDict):
  class Node (line 116) | class Node(TypedDict, total=False):
  class DetachedElementInfo (line 154) | class DetachedElementInfo(TypedDict):
  class RGBA (line 162) | class RGBA(TypedDict, total=False):
  class BoxModel (line 171) | class BoxModel(TypedDict, total=False):
  class ShapeOutsideInfo (line 183) | class ShapeOutsideInfo(TypedDict):
  class Rect (line 191) | class Rect(TypedDict):
  class CSSComputedStyleProperty (line 200) | class CSSComputedStyleProperty(TypedDict):

FILE: pydoll/protocol/emulation/methods.py
  class EmulationMethod (line 9) | class EmulationMethod(str, Enum):
  class SetUserAgentOverrideParams (line 13) | class SetUserAgentOverrideParams(TypedDict):

FILE: pydoll/protocol/emulation/types.py
  class ScreenOrientationType (line 6) | class ScreenOrientationType(str, Enum):
  class DisplayFeatureOrientation (line 15) | class DisplayFeatureOrientation(str, Enum):
  class DevicePostureType (line 22) | class DevicePostureType(str, Enum):
  class VirtualTimePolicy (line 29) | class VirtualTimePolicy(str, Enum):
  class SensorType (line 40) | class SensorType(str, Enum):
  class PressureSource (line 54) | class PressureSource(str, Enum):
  class PressureState (line 60) | class PressureState(str, Enum):
  class DisabledImageType (line 69) | class DisabledImageType(str, Enum):
  class SafeAreaInsets (line 76) | class SafeAreaInsets(TypedDict, total=False):
  class ScreenOrientation (line 89) | class ScreenOrientation(TypedDict):
  class DisplayFeature (line 96) | class DisplayFeature(TypedDict):
  class DevicePosture (line 109) | class DevicePosture(TypedDict):
  class MediaFeature (line 115) | class MediaFeature(TypedDict):
  class UserAgentBrandVersion (line 122) | class UserAgentBrandVersion(TypedDict):
  class UserAgentMetadata (line 130) | class UserAgentMetadata(TypedDict):
  class SensorMetadata (line 151) | class SensorMetadata(TypedDict, total=False):
  class SensorReadingSingle (line 159) | class SensorReadingSingle(TypedDict):
  class SensorReadingXYZ (line 165) | class SensorReadingXYZ(TypedDict):
  class SensorReadingQuaternion (line 173) | class SensorReadingQuaternion(TypedDict):
  class SensorReading (line 182) | class SensorReading(TypedDict, total=False):
  class PressureMetadata (line 190) | class PressureMetadata(TypedDict, total=False):

FILE: pydoll/protocol/fetch/events.py
  class FetchEvent (line 10) | class FetchEvent(str, Enum):
  class AuthRequiredEventParams (line 66) | class AuthRequiredEventParams(TypedDict):
  class RequestPausedEventParams (line 76) | class RequestPausedEventParams(TypedDict):

FILE: pydoll/protocol/fetch/methods.py
  class FetchMethod (line 15) | class FetchMethod(str, Enum):
  class EnableParams (line 33) | class EnableParams(TypedDict, total=False):
  class FailRequestParams (line 40) | class FailRequestParams(TypedDict):
  class FulfillRequestParams (line 47) | class FulfillRequestParams(TypedDict, total=False):
  class ContinueRequestParams (line 58) | class ContinueRequestParams(TypedDict, total=False):
  class ContinueWithAuthParams (line 69) | class ContinueWithAuthParams(TypedDict):
  class ContinueResponseParams (line 76) | class ContinueResponseParams(TypedDict, total=False):
  class GetResponseBodyParams (line 86) | class GetResponseBodyParams(TypedDict):
  class TakeResponseBodyAsStreamParams (line 92) | class TakeResponseBodyAsStreamParams(TypedDict):
  class GetResponseBodyResult (line 99) | class GetResponseBodyResult(TypedDict):
  class TakeResponseBodyAsStreamResult (line 106) | class TakeResponseBodyAsStreamResult(TypedDict):

FILE: pydoll/protocol/fetch/types.py
  class RequestStage (line 8) | class RequestStage(str, Enum):
  class AuthChallengeSource (line 15) | class AuthChallengeSource(str, Enum):
  class AuthChallengeResponseType (line 22) | class AuthChallengeResponseType(str, Enum):
  class RequestPattern (line 30) | class RequestPattern(TypedDict, total=False):
  class HeaderEntry (line 38) | class HeaderEntry(TypedDict):
  class AuthChallenge (line 45) | class AuthChallenge(TypedDict):
  class AuthChallengeResponse (line 54) | class AuthChallengeResponse(TypedDict):

FILE: pydoll/protocol/input/events.py
  class InputEvent (line 9) | class InputEvent(str, Enum):
  class DragInterceptedEventParams (line 28) | class DragInterceptedEventParams(TypedDict):

FILE: pydoll/protocol/input/methods.py
  class InputMethod (line 20) | class InputMethod(str, Enum):
  class CancelDraggingParams (line 36) | class CancelDraggingParams(TypedDict):
  class DispatchDragEventParams (line 42) | class DispatchDragEventParams(TypedDict):
  class DispatchKeyEventParams (line 52) | class DispatchKeyEventParams(TypedDict):
  class DispatchMouseEventParams (line 72) | class DispatchMouseEventParams(TypedDict):
  class DispatchTouchEventParams (line 93) | class DispatchTouchEventParams(TypedDict):
  class EmulateTouchFromMouseEventParams (line 102) | class EmulateTouchFromMouseEventParams(TypedDict):
  class ImeSetCompositionParams (line 116) | class ImeSetCompositionParams(TypedDict):
  class InsertTextParams (line 126) | class InsertTextParams(TypedDict):
  class SetIgnoreInputEventsParams (line 132) | class SetIgnoreInputEventsParams(TypedDict):
  class SetInterceptDragsParams (line 138) | class SetInterceptDragsParams(TypedDict):
  class SynthesizePinchGestureParams (line 144) | class SynthesizePinchGestureParams(TypedDict):
  class SynthesizeScrollGestureParams (line 154) | class SynthesizeScrollGestureParams(TypedDict):
  class SynthesizeTapGestureParams (line 171) | class SynthesizeTapGestureParams(TypedDict):

FILE: pydoll/protocol/input/types.py
  class GestureSourceType (line 8) | class GestureSourceType(str, Enum):
  class MouseButton (line 16) | class MouseButton(str, Enum):
  class DragEventType (line 27) | class DragEventType(str, Enum):
  class KeyEventType (line 36) | class KeyEventType(str, Enum):
  class MouseEventType (line 45) | class MouseEventType(str, Enum):
  class TouchEventType (line 54) | class TouchEventType(str, Enum):
  class KeyModifier (line 63) | class KeyModifier(int, Enum):
  class KeyLocation (line 70) | class KeyLocation(int, Enum):
  class PointerType (line 75) | class PointerType(str, Enum):
  class TouchPoint (line 82) | class TouchPoint(TypedDict):
  class DragDataItem (line 98) | class DragDataItem(TypedDict):
  class DragData (line 107) | class DragData(TypedDict):

FILE: pydoll/protocol/network/events.py
  class NetworkEvent (line 42) | class NetworkEvent(str, Enum):
  class DataReceivedEventParams (line 559) | class DataReceivedEventParams(TypedDict):
  class EventSourceMessageReceivedEventParams (line 567) | class EventSourceMessageReceivedEventParams(TypedDict):
  class LoadingFailedEventParams (line 575) | class LoadingFailedEventParams(TypedDict):
  class LoadingFinishedEventParams (line 585) | class LoadingFinishedEventParams(TypedDict):
  class RequestInterceptedEventParams (line 591) | class RequestInterceptedEventParams(TypedDict):
  class RequestServedFromCacheEventParams (line 606) | class RequestServedFromCacheEventParams(TypedDict):
  class RequestWillBeSentEventParams (line 610) | class RequestWillBeSentEventParams(TypedDict):
  class ResourceChangedPriorityEventParams (line 625) | class ResourceChangedPriorityEventParams(TypedDict):
  class SignedExchangeReceivedEventParams (line 631) | class SignedExchangeReceivedEventParams(TypedDict):
  class ResponseReceivedEventParams (line 636) | class ResponseReceivedEventParams(TypedDict):
  class WebSocketClosedEventParams (line 646) | class WebSocketClosedEventParams(TypedDict):
  class WebSocketCreatedEventParams (line 651) | class WebSocketCreatedEventParams(TypedDict):
  class WebSocketFrameErrorEventParams (line 657) | class WebSocketFrameErrorEventParams(TypedDict):
  class WebSocketFrameReceivedEventParams (line 663) | class WebSocketFrameReceivedEventParams(TypedDict):
  class WebSocketFrameSentEventParams (line 669) | class WebSocketFrameSentEventParams(TypedDict):
  class WebSocketHandshakeResponseReceivedEventParams (line 675) | class WebSocketHandshakeResponseReceivedEventParams(TypedDict):
  class WebSocketWillSendHandshakeRequestEventParams (line 681) | class WebSocketWillSendHandshakeRequestEventParams(TypedDict):
  class WebTransportCreatedEventParams (line 688) | class WebTransportCreatedEventParams(TypedDict):
  class WebTransportConnectionEstablishedEventParams (line 695) | class WebTransportConnectionEstablishedEventParams(TypedDict):
  class WebTransportClosedEventParams (line 700) | class WebTransportClosedEventParams(TypedDict):
  class DirectTCPSocketCreatedEventParams (line 705) | class DirectTCPSocketCreatedEventParams(TypedDict):
  class DirectTCPSocketOpenedEventParams (line 714) | class DirectTCPSocketOpenedEventParams(TypedDict):
  class DirectTCPSocketAbortedEventParams (line 723) | class DirectTCPSocketAbortedEventParams(TypedDict):
  class DirectTCPSocketClosedEventParams (line 729) | class DirectTCPSocketClosedEventParams(TypedDict):
  class DirectTCPSocketChunkSentEventParams (line 734) | class DirectTCPSocketChunkSentEventParams(TypedDict):
  class DirectTCPSocketChunkReceivedEventParams (line 740) | class DirectTCPSocketChunkReceivedEventParams(TypedDict):
  class DirectUDPSocketCreatedEventParams (line 746) | class DirectUDPSocketCreatedEventParams(TypedDict):
  class DirectUDPSocketOpenedEventParams (line 753) | class DirectUDPSocketOpenedEventParams(TypedDict):
  class DirectUDPSocketAbortedEventParams (line 762) | class DirectUDPSocketAbortedEventParams(TypedDict):
  class DirectUDPSocketClosedEventParams (line 768) | class DirectUDPSocketClosedEventParams(TypedDict):
  class DirectUDPSocketChunkSentEventParams (line 773) | class DirectUDPSocketChunkSentEventParams(TypedDict):
  class DirectUDPSocketChunkReceivedEventParams (line 779) | class DirectUDPSocketChunkReceivedEventParams(TypedDict):
  class RequestWillBeSentExtraInfoEventParams (line 785) | class RequestWillBeSentExtraInfoEventParams(TypedDict):
  class ResponseReceivedExtraInfoEventParams (line 794) | class ResponseReceivedExtraInfoEventParams(TypedDict):
  class ResponseReceivedEarlyHintsEventParams (line 806) | class ResponseReceivedEarlyHintsEventParams(TypedDict):
  class TrustTokenOperationDoneEventParams (line 811) | class TrustTokenOperationDoneEventParams(TypedDict):
  class PolicyUpdatedEventParams (line 820) | class PolicyUpdatedEventParams(TypedDict):
  class SubresourceWebBundleMetadataReceivedEventParams (line 824) | class SubresourceWebBundleMetadataReceivedEventParams(TypedDict):
  class SubresourceWebBundleMetadataErrorEventParams (line 829) | class SubresourceWebBundleMetadataErrorEventParams(TypedDict):
  class SubresourceWebBundleInnerResponseParsedEventParams (line 834) | class SubresourceWebBundleInnerResponseParsedEventParams(TypedDict):
  class SubresourceWebBundleInnerResponseErrorEventParams (line 840) | class SubresourceWebBundleInnerResponseErrorEventParams(TypedDict):
  class ReportingApiReportAddedEventParams (line 847) | class ReportingApiReportAddedEventParams(TypedDict):
  class ReportingApiReportUpdatedEventParams (line 851) | class ReportingApiReportUpdatedEventParams(TypedDict):
  class ReportingApiEndpointsChangedForOriginEventParams (line 855) | class ReportingApiEndpointsChangedForOriginEventParams(TypedDict):

FILE: pydoll/protocol/network/har_types.py
  class HarTimings (line 13) | class HarTimings(TypedDict):
  class HarCookie (line 25) | class HarCookie(TypedDict):
  class HarHeader (line 37) | class HarHeader(TypedDict):
  class HarQueryParam (line 44) | class HarQueryParam(TypedDict):
  class HarPostData (line 51) | class HarPostData(TypedDict):
  class HarRequest (line 59) | class HarRequest(TypedDict):
  class HarContent (line 73) | class HarContent(TypedDict):
  class HarResponse (line 82) | class HarResponse(TypedDict):
  class HarCache (line 96) | class HarCache(TypedDict, total=False):
  class HarEntry (line 103) | class HarEntry(TypedDict):
  class HarPage (line 117) | class HarPage(TypedDict):
  class HarCreator (line 125) | class HarCreator(TypedDict):
  class HarLog (line 132) | class HarLog(TypedDict):
  class Har (line 141) | class Har(TypedDict):

FILE: pydoll/protocol/network/methods.py
  class NetworkMethod (line 22) | class NetworkMethod(str, Enum):
  class DeleteCookiesParams (line 56) | class DeleteCookiesParams(TypedDict):
  class EmulateNetworkConditionsParams (line 66) | class EmulateNetworkConditionsParams(TypedDict):
  class NetworkEnableParams (line 79) | class NetworkEnableParams(TypedDict):
  class GetCookiesParams (line 87) | class GetCookiesParams(TypedDict):
  class GetRequestPostDataParams (line 93) | class GetRequestPostDataParams(TypedDict):
  class GetResponseBodyParams (line 99) | class GetResponseBodyParams(TypedDict):
  class GetCertificateParams (line 105) | class GetCertificateParams(TypedDict):
  class GetResponseBodyForInterceptionParams (line 111) | class GetResponseBodyForInterceptionParams(TypedDict):
  class SearchInResponseBodyParams (line 117) | class SearchInResponseBodyParams(TypedDict):
  class SetBypassServiceWorkerParams (line 126) | class SetBypassServiceWorkerParams(TypedDict):
  class SetCacheDisabledParams (line 132) | class SetCacheDisabledParams(TypedDict):
  class SetCookieParams (line 138) | class SetCookieParams(TypedDict):
  class SetCookiesParams (line 157) | class SetCookiesParams(TypedDict):
  class SetExtraHTTPHeadersParams (line 163) | class SetExtraHTTPHeadersParams(TypedDict):
  class SetUserAgentOverrideParams (line 169) | class SetUserAgentOverrideParams(TypedDict):
  class SetBlockedURLsParams (line 178) | class SetBlockedURLsParams(TypedDict):
  class SetAcceptedEncodingsParams (line 184) | class SetAcceptedEncodingsParams(TypedDict):
  class SetAttachDebugStackParams (line 190) | class SetAttachDebugStackParams(TypedDict):
  class SetCookieControlsParams (line 196) | class SetCookieControlsParams(TypedDict):
  class StreamResourceContentParams (line 204) | class StreamResourceContentParams(TypedDict):
  class TakeResponseBodyForInterceptionAsStreamParams (line 210) | class TakeResponseBodyForInterceptionAsStreamParams(TypedDict):
  class SetRequestInterceptionParams (line 216) | class SetRequestInterceptionParams(TypedDict):
  class AuthChallengeResponseParams (line 222) | class AuthChallengeResponseParams(TypedDict):
  class EnableReportingApiParams (line 230) | class EnableReportingApiParams(TypedDict):
  class GetSecurityIsolationStatusParams (line 236) | class GetSecurityIsolationStatusParams(TypedDict):
  class LoadNetworkResourceParams (line 240) | class LoadNetworkResourceParams(TypedDict):
  class ReplayXHRParams (line 248) | class ReplayXHRParams(TypedDict):
  class GetCookiesResult (line 254) | class GetCookiesResult(TypedDict):
  class GetRequestPostDataResult (line 260) | class GetRequestPostDataResult(TypedDict):
  class GetResponseBodyResult (line 266) | class GetResponseBodyResult(TypedDict):
  class GetResponseBodyForInterceptionResult (line 273) | class GetResponseBodyForInterceptionResult(TypedDict):
  class GetCertificateResult (line 280) | class GetCertificateResult(TypedDict):
  class SearchInResponseBodyResult (line 286) | class SearchInResponseBodyResult(TypedDict):
  class SetCookieResult (line 292) | class SetCookieResult(TypedDict):
  class StreamResourceContentResult (line 298) | class StreamResourceContentResult(TypedDict):
  class TakeResponseBodyForInterceptionAsStreamResult (line 304) | class TakeResponseBodyForInterceptionAsStreamResult(TypedDict):
  class CanClearBrowserCacheResult (line 310) | class CanClearBrowserCacheResult(TypedDict):
  class CanClearBrowserCookiesResult (line 316) | class CanClearBrowserCookiesResult(TypedDict):
  class CanEmulateNetworkConditionsResult (line 322) | class CanEmulateNetworkConditionsResult(TypedDict):
  class GetSecurityIsolationStatusResult (line 328) | class GetSecurityIsolationStatusResult(TypedDict):
  class LoadNetworkResourceResult (line 334) | class LoadNetworkResourceResult(TypedDict):

FILE: pydoll/protocol/network/types.py
  class ResourceType (line 9) | class ResourceType(str, Enum):
  class ErrorReason (line 38) | class ErrorReason(str, Enum):
  class RequestMethod (line 62) | class RequestMethod(str, Enum):
  class ConnectionType (line 72) | class ConnectionType(str, Enum):
  class CookieSameSite (line 86) | class CookieSameSite(str, Enum):
  class CookiePriority (line 94) | class CookiePriority(str, Enum):
  class CookieSourceScheme (line 102) | class CookieSourceScheme(str, Enum):
  class ResourceTiming (line 113) | class ResourceTiming(TypedDict):
  class ResourcePriority (line 139) | class ResourcePriority(str, Enum):
  class PostDataEntry (line 149) | class PostDataEntry(TypedDict):
  class Request (line 155) | class Request(TypedDict):
  class SignedCertificateTimestamp (line 173) | class SignedCertificateTimestamp(TypedDict):
  class SecurityDetails (line 186) | class SecurityDetails(TypedDict):
  class CertificateTransparencyCompliance (line 206) | class CertificateTransparencyCompliance(str, Enum):
  class BlockedReason (line 214) | class BlockedReason(str, Enum):
  class CorsError (line 243) | class CorsError(str, Enum):
  class CorsErrorStatus (line 283) | class CorsErrorStatus(TypedDict):
  class ServiceWorkerResponseSource (line 288) | class ServiceWorkerResponseSource(str, Enum):
  class TrustTokenParams (line 297) | class TrustTokenParams(TypedDict):
  class TrustTokenOperationType (line 309) | class TrustTokenOperationType(str, Enum):
  class AlternateProtocolUsage (line 315) | class AlternateProtocolUsage(str, Enum):
  class ServiceWorkerRouterSource (line 328) | class ServiceWorkerRouterSource(str, Enum):
  class ServiceWorkerRouterInfo (line 337) | class ServiceWorkerRouterInfo(TypedDict):
  class Response (line 343) | class Response(TypedDict):
  class WebSocketRequest (line 376) | class WebSocketRequest(TypedDict):
  class WebSocketResponse (line 382) | class WebSocketResponse(TypedDict):
  class WebSocketFrame (line 393) | class WebSocketFrame(TypedDict):
  class CachedResource (line 404) | class CachedResource(TypedDict):
  class Initiator (line 413) | class Initiator(TypedDict):
  class CookiePartitionKey (line 424) | class CookiePartitionKey(TypedDict):
  class Cookie (line 434) | class Cookie(TypedDict):
  class SetCookieBlockedReason (line 454) | class SetCookieBlockedReason(str, Enum):
  class CookieBlockedReason (line 481) | class CookieBlockedReason(str, Enum):
  class CookieExemptionReason (line 505) | class CookieExemptionReason(str, Enum):
  class BlockedSetCookieWithReason (line 523) | class BlockedSetCookieWithReason(TypedDict):
  class ExemptedSetCookieWithReason (line 531) | class ExemptedSetCookieWithReason(TypedDict):
  class AssociatedCookie (line 542) | class AssociatedCookie(TypedDict):
  class CookieParam (line 553) | class CookieParam(TypedDict):
  class AuthChallenge (line 572) | class AuthChallenge(TypedDict):
  class AuthChallengeResponse (line 581) | class AuthChallengeResponse(TypedDict):
  class InterceptionStage (line 589) | class InterceptionStage(str, Enum):
  class RequestPattern (line 599) | class RequestPattern(TypedDict):
  class SignedExchangeSignature (line 607) | class SignedExchangeSignature(TypedDict):
  class SignedExchangeHeader (line 621) | class SignedExchangeHeader(TypedDict):
  class SignedExchangeErrorField (line 631) | class SignedExchangeErrorField(str, Enum):
  class SignedExchangeError (line 642) | class SignedExchangeError(TypedDict):
  class SignedExchangeInfo (line 650) | class SignedExchangeInfo(TypedDict):
  class ContentEncoding (line 660) | class ContentEncoding(str, Enum):
  class DirectSocketDnsQueryType (line 669) | class DirectSocketDnsQueryType(str, Enum):
  class DirectTCPSocketOptions (line 674) | class DirectTCPSocketOptions(TypedDict):
  class DirectUDPSocketOptions (line 682) | class DirectUDPSocketOptions(TypedDict):
  class DirectUDPMessage (line 692) | class DirectUDPMessage(TypedDict):
  class PrivateNetworkRequestPolicy (line 698) | class PrivateNetworkRequestPolicy(str, Enum):
  class IPAddressSpace (line 706) | class IPAddressSpace(str, Enum):
  class ConnectTiming (line 713) | class ConnectTiming(TypedDict):
  class ClientSecurityState (line 717) | class ClientSecurityState(TypedDict):
  class CrossOriginOpenerPolicyValue (line 723) | class CrossOriginOpenerPolicyValue(str, Enum):
  class CrossOriginOpenerPolicyStatus (line 733) | class CrossOriginOpenerPolicyStatus(TypedDict):
  class CrossOriginEmbedderPolicyValue (line 740) | class CrossOriginEmbedderPolicyValue(str, Enum):
  class CrossOriginEmbedderPolicyStatus (line 746) | class CrossOriginEmbedderPolicyStatus(TypedDict):
  class ContentSecurityPolicySource (line 753) | class ContentSecurityPolicySource(str, Enum):
  class ContentSecurityPolicyStatus (line 758) | class ContentSecurityPolicyStatus(TypedDict):
  class SecurityIsolationStatus (line 764) | class SecurityIsolationStatus(TypedDict):
  class ReportStatus (line 770) | class ReportStatus(str, Enum):
  class ReportId (line 779) | class ReportId(str):
  class ReportingApiReport (line 783) | class ReportingApiReport(TypedDict):
  class ReportingApiEndpoint (line 797) | class ReportingApiEndpoint(TypedDict):
  class LoadNetworkResourcePageResult (line 802) | class LoadNetworkResourcePageResult(TypedDict):
  class LoadNetworkResourceOptions (line 813) | class LoadNetworkResourceOptions(TypedDict):

FILE: pydoll/protocol/page/events.py
  class PageEvent (line 22) | class PageEvent(str, Enum):
  class DomContentEventFiredEventParams (line 280) | class DomContentEventFiredEventParams(TypedDict):
  class FileChooserOpenedEventParams (line 284) | class FileChooserOpenedEventParams(TypedDict):
  class FrameAttachedEventParams (line 290) | class FrameAttachedEventParams(TypedDict):
  class FrameClearedScheduledNavigationEventParams (line 296) | class FrameClearedScheduledNavigationEventParams(TypedDict):
  class FrameDetachedEventParams (line 300) | class FrameDetachedEventParams(TypedDict):
  class FrameSubtreeWillBeDetachedEventParams (line 305) | class FrameSubtreeWillBeDetachedEventParams(TypedDict):
  class FrameNavigatedEventParams (line 309) | class FrameNavigatedEventParams(TypedDict):
  class DocumentOpenedEventParams (line 314) | class DocumentOpenedEventParams(TypedDict):
  class FrameResizedEventParams (line 318) | class FrameResizedEventParams(TypedDict):
  class FrameStartedNavigatingEventParams (line 322) | class FrameStartedNavigatingEventParams(TypedDict):
  class FrameRequestedNavigationEventParams (line 329) | class FrameRequestedNavigationEventParams(TypedDict):
  class FrameScheduledNavigationEventParams (line 336) | class FrameScheduledNavigationEventParams(TypedDict):
  class FrameStartedLoadingEventParams (line 343) | class FrameStartedLoadingEventParams(TypedDict):
  class FrameStoppedLoadingEventParams (line 347) | class FrameStoppedLoadingEventParams(TypedDict):
  class DownloadWillBeginEventParams (line 351) | class DownloadWillBeginEventParams(TypedDict):
  class DownloadProgressEventParams (line 358) | class DownloadProgressEventParams(TypedDict):
  class InterstitialHiddenEventParams (line 365) | class InterstitialHiddenEventParams(TypedDict):
  class InterstitialShownEventParams (line 369) | class InterstitialShownEventParams(TypedDict):
  class JavascriptDialogClosedEventParams (line 373) | class JavascriptDialogClosedEventParams(TypedDict):
  class JavascriptDialogOpeningEventParams (line 379) | class JavascriptDialogOpeningEventParams(TypedDict):
  class LifecycleEventEventParams (line 388) | class LifecycleEventEventParams(TypedDict):
  class BackForwardCacheNotUsedEventParams (line 395) | class BackForwardCacheNotUsedEventParams(TypedDict):
  class LoadEventFiredEventParams (line 402) | class LoadEventFiredEventParams(TypedDict):
  class NavigatedWithinDocumentEventParams (line 406) | class NavigatedWithinDocumentEventParams(TypedDict):
  class ScreencastFrameEventParams (line 412) | class ScreencastFrameEventParams(TypedDict):
  class ScreencastVisibilityChangedEventParams (line 418) | class ScreencastVisibilityChangedEventParams(TypedDict):
  class WindowOpenEventParams (line 422) | class WindowOpenEventParams(TypedDict):
  class CompilationCacheProducedEventParams (line 429) | class CompilationCacheProducedEventParams(TypedDict):

FILE: pydoll/protocol/page/methods.py
  class PageMethod (line 41) | class PageMethod(str, Enum):
  class AddScriptToEvaluateOnNewDocumentParams (line 95) | class AddScriptToEvaluateOnNewDocumentParams(TypedDict):
  class CaptureScreenshotParams (line 104) | class CaptureScreenshotParams(TypedDict, total=False):
  class CaptureSnapshotParams (line 115) | class CaptureSnapshotParams(TypedDict, total=False):
  class CreateIsolatedWorldParams (line 121) | class CreateIsolatedWorldParams(TypedDict):
  class GetAppManifestParams (line 129) | class GetAppManifestParams(TypedDict, total=False):
  class GetAdScriptAncestryParams (line 135) | class GetAdScriptAncestryParams(TypedDict):
  class GetPermissionsPolicyStateParams (line 141) | class GetPermissionsPolicyStateParams(TypedDict):
  class GetOriginTrialsParams (line 147) | class GetOriginTrialsParams(TypedDict):
  class GetResourceContentParams (line 153) | class GetResourceContentParams(TypedDict):
  class HandleJavaScriptDialogParams (line 160) | class HandleJavaScriptDialogParams(TypedDict):
  class NavigateParams (line 167) | class NavigateParams(TypedDict):
  class NavigateToHistoryEntryParams (line 177) | class NavigateToHistoryEntryParams(TypedDict):
  class EnableParams (line 183) | class EnableParams(TypedDict):
  class PrintToPDFParams (line 187) | class PrintToPDFParams(TypedDict, total=False):
  class ReloadParams (line 209) | class ReloadParams(TypedDict, total=False):
  class RemoveScriptToEvaluateOnNewDocumentParams (line 217) | class RemoveScriptToEvaluateOnNewDocumentParams(TypedDict):
  class ScreencastFrameAckParams (line 223) | class ScreencastFrameAckParams(TypedDict):
  class SearchInResourceParams (line 229) | class SearchInResourceParams(TypedDict):
  class SetAdBlockingEnabledParams (line 239) | class SetAdBlockingEnabledParams(TypedDict):
  class SetBypassCSPParams (line 245) | class SetBypassCSPParams(TypedDict):
  class AddScriptToEvaluateOnLoadParams (line 251) | class AddScriptToEvaluateOnLoadParams(TypedDict):
  class SetDocumentContentParams (line 257) | class SetDocumentContentParams(TypedDict):
  class SetInterceptFileChooserDialogParams (line 264) | class SetInterceptFileChooserDialogParams(TypedDict):
  class SetLifecycleEventsEnabledParams (line 271) | class SetLifecycleEventsEnabledParams(TypedDict):
  class AddCompilationCacheParams (line 277) | class AddCompilationCacheParams(TypedDict):
  class GenerateTestReportParams (line 284) | class GenerateTestReportParams(TypedDict):
  class GetAdScriptAncestryIdsParams (line 291) | class GetAdScriptAncestryIdsParams(TypedDict):
  class GetAppIdParams (line 297) | class GetAppIdParams(TypedDict, total=False):
  class GetManifestIconsParams (line 304) | class GetManifestIconsParams(TypedDict):
  class RemoveScriptToEvaluateOnLoadParams (line 310) | class RemoveScriptToEvaluateOnLoadParams(TypedDict):
  class SetFontFamiliesParams (line 316) | class SetFontFamiliesParams(TypedDict):
  class SetFontSizesParams (line 323) | class SetFontSizesParams(TypedDict):
  class SetPrerenderingAllowedParams (line 329) | class SetPrerenderingAllowedParams(TypedDict):
  class SetRPHRegistrationModeParams (line 335) | class SetRPHRegistrationModeParams(TypedDict):
  class SetSPCTransactionModeParams (line 341) | class SetSPCTransactionModeParams(TypedDict):
  class SetWebLifecycleStateParams (line 347) | class SetWebLifecycleStateParams(TypedDict):
  class StartScreencastParams (line 353) | class StartScreencastParams(TypedDict, total=False):
  class ProduceCompilationCacheParams (line 363) | class ProduceCompilationCacheParams(TypedDict):
  class AddScriptToEvaluateOnNewDocumentResult (line 369) | class AddScriptToEvaluateOnNewDocumentResult(TypedDict):
  class CaptureScreenshotResult (line 373) | class CaptureScreenshotResult(TypedDict):
  class CaptureSnapshotResult (line 377) | class CaptureSnapshotResult(TypedDict):
  class CreateIsolatedWorldResult (line 381) | class CreateIsolatedWorldResult(TypedDict):
  class GetAppManifestResult (line 385) | class GetAppManifestResult(TypedDict):
  class GetInstallabilityErrorsResult (line 393) | class GetInstallabilityErrorsResult(TypedDict):
  class GetAppIdResult (line 397) | class GetAppIdResult(TypedDict, total=False):
  class GetAdScriptAncestryResult (line 404) | class GetAdScriptAncestryResult(TypedDict, total=False):
  class GetFrameTreeResult (line 408) | class GetFrameTreeResult(TypedDict):
  class GetLayoutMetricsResult (line 412) | class GetLayoutMetricsResult(TypedDict):
  class GetNavigationHistoryResult (line 421) | class GetNavigationHistoryResult(TypedDict):
  class GetPermissionsPolicyStateResult (line 426) | class GetPermissionsPolicyStateResult(TypedDict):
  class GetOriginTrialsResult (line 430) | class GetOriginTrialsResult(TypedDict):
  class GetResourceContentResult (line 434) | class GetResourceContentResult(TypedDict):
  class GetResourceTreeResult (line 439) | class GetResourceTreeResult(TypedDict):
  class PrintToPDFResult (line 443) | class PrintToPDFResult(TypedDict):
  class SearchInResourceResult (line 448) | class SearchInResourceResult(TypedDict):
  class NavigateResult (line 452) | class NavigateResult(TypedDict):
  class AddScriptToEvaluateOnLoadResult (line 461) | class AddScriptToEvaluateOnLoadResult(TypedDict):
  class GetManifestIconsResult (line 467) | class GetManifestIconsResult(TypedDict):
  class GetAdScriptAncestryIdsResult (line 473) | class GetAdScriptAncestryIdsResult(TypedDict):

FILE: pydoll/protocol/page/types.py
  class AdFrameType (line 12) | class AdFrameType(str, Enum):
  class AdFrameExplanation (line 20) | class AdFrameExplanation(str, Enum):
  class SecureContextType (line 28) | class SecureContextType(str, Enum):
  class CrossOriginIsolatedContextType (line 37) | class CrossOriginIsolatedContextType(str, Enum):
  class GatedAPIFeatures (line 45) | class GatedAPIFeatures(str, Enum):
  class PermissionsPolicyFeature (line 54) | class PermissionsPolicyFeature(str, Enum):
  class PermissionsPolicyBlockReason (line 165) | class PermissionsPolicyBlockReason(str, Enum):
  class BackForwardCacheNotRestoredReasonType (line 174) | class BackForwardCacheNotRestoredReasonType(str, Enum):
  class BackForwardCacheNotRestoredReason (line 182) | class BackForwardCacheNotRestoredReason(str, Enum):
  class BackForwardCacheBlockingDetails (line 342) | class BackForwardCacheBlockingDetails(TypedDict):
  class BackForwardCacheNotRestoredExplanation (line 349) | class BackForwardCacheNotRestoredExplanation(TypedDict):
  class BackForwardCacheNotRestoredExplanationTree (line 358) | class BackForwardCacheNotRestoredExplanationTree(TypedDict):
  class OriginTrialTokenStatus (line 364) | class OriginTrialTokenStatus(str, Enum):
  class OriginTrialStatus (line 381) | class OriginTrialStatus(str, Enum):
  class OriginTrialUsageRestriction (line 390) | class OriginTrialUsageRestriction(str, Enum):
  class TransitionType (line 397) | class TransitionType(str, Enum):
  class DialogType (line 415) | class DialogType(str, Enum):
  class ClientNavigationReason (line 424) | class ClientNavigationReason(Enum):
  class ClientNavigationDisposition (line 439) | class ClientNavigationDisposition(str, Enum):
  class ReferrerPolicy (line 448) | class ReferrerPolicy(str, Enum):
  class NavigationType (line 461) | class NavigationType(str, Enum):
  class AdFrameStatus (line 468) | class AdFrameStatus(TypedDict):
  class AdScriptId (line 475) | class AdScriptId(TypedDict):
  class AdScriptAncestry (line 482) | class AdScriptAncestry(TypedDict):
  class PermissionsPolicyBlockLocator (line 489) | class PermissionsPolicyBlockLocator(TypedDict):
  class PermissionsPolicyFeatureState (line 496) | class PermissionsPolicyFeatureState(TypedDict):
  class OriginTrialToken (line 504) | class OriginTrialToken(TypedDict):
  class OriginTrialTokenWithStatus (line 515) | class OriginTrialTokenWithStatus(TypedDict):
  class OriginTrial (line 523) | class OriginTrial(TypedDict):
  class SecurityOriginDetails (line 531) | class SecurityOriginDetails(TypedDict):
  class Frame (line 537) | class Frame(TypedDict):
  class FrameResource (line 557) | class FrameResource(TypedDict):
  class FrameResourceTree (line 569) | class FrameResourceTree(TypedDict):
  class FrameTree (line 577) | class FrameTree(TypedDict):
  class NavigationEntry (line 584) | class NavigationEntry(TypedDict):
  class ScreencastFrameMetadata (line 594) | class ScreencastFrameMetadata(TypedDict):
  class AppManifestError (line 606) | class AppManifestError(TypedDict):
  class AppManifestParsedProperties (line 615) | class AppManifestParsedProperties(TypedDict):
  class LayoutViewport (line 621) | class LayoutViewport(TypedDict):
  class VisualViewport (line 630) | class VisualViewport(TypedDict):
  class Viewport (line 643) | class Viewport(TypedDict):
  class FontFamilies (line 653) | class FontFamilies(TypedDict, total=False):
  class ScriptFontFamilies (line 665) | class ScriptFontFamilies(TypedDict):
  class FontSizes (line 672) | class FontSizes(TypedDict, total=False):
  class CompilationCacheParams (line 679) | class CompilationCacheParams(TypedDict):
  class FileFilter (line 686) | class FileFilter(TypedDict, total=False):
  class ImageResource (line 693) | class ImageResource(TypedDict):
  class FileHandler (line 701) | class FileHandler(TypedDict):
  class LaunchHandler (line 711) | class LaunchHandler(TypedDict):
  class ProtocolHandler (line 717) | class ProtocolHandler(TypedDict):
  class RelatedApplication (line 724) | class RelatedApplication(TypedDict):
  class ScopeExtension (line 731) | class ScopeExtension(TypedDict):
  class Screenshot (line 738) | class Screenshot(TypedDict):
  class ShareTarget (line 746) | class ShareTarget(TypedDict):
  class Shortcut (line 758) | class Shortcut(TypedDict):
  class WebAppManifest (line 765) | class WebAppManifest(TypedDict, total=False):
  class InstallabilityErrorArgument (line 793) | class InstallabilityErrorArgument(TypedDict):
  class InstallabilityError (line 800) | class InstallabilityError(TypedDict):
  class AutoResponseMode (line 807) | class AutoResponseMode(str, Enum):
  class WebLifecycleState (line 817) | class WebLifecycleState(str, Enum):
  class ScreenshotFormat (line 824) | class ScreenshotFormat(str, Enum):
    method has_value (line 832) | def has_value(cls, value: str) -> bool:
    method get_value (line 837) | def get_value(cls, value: str) -> 'ScreenshotFormat':
  class ScreencastFormat (line 842) | class ScreencastFormat(str, Enum):
  class TransferMode (line 849) | class TransferMode(str, Enum):

FILE: pydoll/protocol/runtime/events.py
  class RuntimeEvent (line 17) | class RuntimeEvent(str, Enum):
  class ConsoleAPICallType (line 109) | class ConsoleAPICallType(str, Enum):
  class BindingCalledEventParams (line 132) | class BindingCalledEventParams(TypedDict):
  class ConsoleAPICalledEventParams (line 140) | class ConsoleAPICalledEventParams(TypedDict):
  class ExceptionRevokedEventParams (line 151) | class ExceptionRevokedEventParams(TypedDict):
  class ExceptionThrownEventParams (line 158) | class ExceptionThrownEventParams(TypedDict):
  class ExecutionContextCreatedEventParams (line 165) | class ExecutionContextCreatedEventParams(TypedDict):
  class ExecutionContextDestroyedEventParams (line 171) | class ExecutionContextDestroyedEventParams(TypedDict):
  class ExecutionContextsClearedEventParams (line 178) | class ExecutionContextsClearedEventParams(TypedDict):
  class InspectRequestedEventParams (line 184) | class InspectRequestedEventParams(TypedDict):

FILE: pydoll/protocol/runtime/methods.py
  class RuntimeMethod (line 21) | class RuntimeMethod(str, Enum):
  class AddBindingParams (line 50) | class AddBindingParams(TypedDict):
  class AwaitPromiseParams (line 58) | class AwaitPromiseParams(TypedDict):
  class CallFunctionOnParams (line 66) | class CallFunctionOnParams(TypedDict):
  class CompileScriptParams (line 84) | class CompileScriptParams(TypedDict):
  class EvaluateParams (line 93) | class EvaluateParams(TypedDict):
  class GetExceptionDetailsParams (line 114) | class GetExceptionDetailsParams(TypedDict):
  class GetPropertiesParams (line 120) | class GetPropertiesParams(TypedDict):
  class GlobalLexicalScopeNamesParams (line 130) | class GlobalLexicalScopeNamesParams(TypedDict, total=False):
  class QueryObjectsParams (line 136) | class QueryObjectsParams(TypedDict):
  class ReleaseObjectParams (line 143) | class ReleaseObjectParams(TypedDict):
  class ReleaseObjectGroupParams (line 149) | class ReleaseObjectGroupParams(TypedDict):
  class RemoveBindingParams (line 155) | class RemoveBindingParams(TypedDict):
  class RunScriptParams (line 161) | class RunScriptParams(TypedDict):
  class SetAsyncCallStackDepthParams (line 174) | class SetAsyncCallStackDepthParams(TypedDict):
  class SetCustomObjectFormatterEnabledParams (line 180) | class SetCustomObjectFormatterEnabledParams(TypedDict):
  class SetMaxCallStackSizeToCaptureParams (line 186) | class SetMaxCallStackSizeToCaptureParams(TypedDict):
  class AwaitPromiseResult (line 193) | class AwaitPromiseResult(TypedDict):
  class CallFunctionOnResult (line 200) | class CallFunctionOnResult(TypedDict):
  class CompileScriptResult (line 207) | class CompileScriptResult(TypedDict, total=False):
  class EvaluateResult (line 214) | class EvaluateResult(TypedDict):
  class GetExceptionDetailsResult (line 221) | class GetExceptionDetailsResult(TypedDict, total=False):
  class GetHeapUsageResult (line 227) | class GetHeapUsageResult(TypedDict):
  class GetIsolateIdResult (line 236) | class GetIsolateIdResult(TypedDict):
  class GetPropertiesResult (line 242) | class GetPropertiesResult(TypedDict):
  class GlobalLexicalScopeNamesResult (line 251) | class GlobalLexicalScopeNamesResult(TypedDict):
  class QueryObjectsResult (line 257) | class QueryObjectsResult(TypedDict):
  class RunScriptResult (line 263) | class RunScriptResult(TypedDict):

FILE: pydoll/protocol/runtime/types.py
  class SerializationType (line 15) | class SerializationType(str, Enum):
  class DeepSerializedValueType (line 23) | class DeepSerializedValueType(str, Enum):
  class RemoteObjectType (line 52) | class RemoteObjectType(str, Enum):
  class RemoteObjectSubtype (line 65) | class RemoteObjectSubtype(str, Enum):
  class ObjectPreviewType (line 89) | class ObjectPreviewType(str, Enum):
  class ObjectPreviewSubtype (line 102) | class ObjectPreviewSubtype(str, Enum):
  class PropertyPreviewType (line 126) | class PropertyPreviewType(str, Enum):
  class PropertyPreviewSubtype (line 140) | class PropertyPreviewSubtype(str, Enum):
  class SerializationOptions (line 164) | class SerializationOptions(TypedDict):
  class DeepSerializedValue (line 172) | class DeepSerializedValue(TypedDict):
  class CustomPreview (line 181) | class CustomPreview(TypedDict):
  class PropertyPreview (line 188) | class PropertyPreview(TypedDict):
  class EntryPreview (line 198) | class EntryPreview(TypedDict):
  class ObjectPreview (line 205) | class ObjectPreview(TypedDict):
  class RemoteObject (line 216) | class RemoteObject(TypedDict):
  class PropertyDescriptor (line 231) | class PropertyDescriptor(TypedDict):
  class InternalPropertyDescriptor (line 246) | class InternalPropertyDescriptor(TypedDict):
  class PrivatePropertyDescriptor (line 253) | class PrivatePropertyDescriptor(TypedDict):
  class CallArgument (line 262) | class CallArgument(TypedDict, total=False):
  class ExecutionContextDescription (line 270) | class ExecutionContextDescription(TypedDict):
  class ExceptionDetails (line 280) | class ExceptionDetails(TypedDict):
  class CallFrame (line 295) | class CallFrame(TypedDict):
  class StackTraceId (line 305) | class StackTraceId(TypedDict):
  class StackTrace (line 312) | class StackTrace(TypedDict):

FILE: pydoll/protocol/security/types.py
  class MixedContentType (line 4) | class MixedContentType(str, Enum):
  class SecurityState (line 14) | class SecurityState(str, Enum):

FILE: pydoll/protocol/storage/events.py
  class StorageEvent (line 28) | class StorageEvent(str, Enum):
  class CacheStorageContentUpdatedEventParams (line 227) | class CacheStorageContentUpdatedEventParams(TypedDict):
  class CacheStorageListUpdatedEventParams (line 234) | class CacheStorageListUpdatedEventParams(TypedDict):
  class IndexedDBContentUpdatedEventParams (line 240) | class IndexedDBContentUpdatedEventParams(TypedDict):
  class IndexedDBListUpdatedEventParams (line 248) | class IndexedDBListUpdatedEventParams(TypedDict):
  class InterestGroupAccessedEventParams (line 254) | class InterestGroupAccessedEventParams(TypedDict):
  class InterestGroupAuctionEventOccurredEventParams (line 265) | class InterestGroupAuctionEventOccurredEventParams(TypedDict):
  class InterestGroupAuctionNetworkRequestCreatedEventParams (line 273) | class InterestGroupAuctionNetworkRequestCreatedEventParams(TypedDict):
  class SharedStorageAccessedEventParams (line 279) | class SharedStorageAccessedEventParams(TypedDict):
  class SharedStorageWorkletOperationExecutionFinishedEventParams (line 289) | class SharedStorageWorkletOperationExecutionFinishedEventParams(TypedDict):
  class StorageBucketCreatedOrUpdatedEventParams (line 299) | class StorageBucketCreatedOrUpdatedEventParams(TypedDict):
  class StorageBucketDeletedEventParams (line 303) | class StorageBucketDeletedEventParams(TypedDict):
  class AttributionReportingSourceRegisteredEventParams (line 307) | class AttributionReportingSourceRegisteredEventParams(TypedDict):
  class AttributionReportingTriggerRegisteredEventParams (line 312) | class AttributionReportingTriggerRegisteredEventParams(TypedDict):
  class AttributionReportingReportSentEventParams (line 318) | class AttributionReportingReportSentEventParams(TypedDict):
  class AttributionReportingVerboseDebugReportSentEventParams (line 327) | class AttributionReportingVerboseDebugReportSentEventParams(TypedDict):

FILE: pydoll/protocol/storage/methods.py
  class StorageMethod (line 20) | class StorageMethod(str, Enum):
  class GetStorageKeyForFrameParams (line 62) | class GetStorageKeyForFrameParams(TypedDict):
  class GetStorageKeyForFrameResult (line 66) | class GetStorageKeyForFrameResult(TypedDict):
  class ClearDataForOriginParams (line 70) | class ClearDataForOriginParams(TypedDict):
  class ClearDataForStorageKeyParams (line 75) | class ClearDataForStorageKeyParams(TypedDict):
  class GetCookiesParams (line 80) | class GetCookiesParams(TypedDict):
  class GetCookiesResult (line 84) | class GetCookiesResult(TypedDict):
  class SetCookiesParams (line 88) | class SetCookiesParams(TypedDict):
  class ClearCookiesParams (line 93) | class ClearCookiesParams(TypedDict):
  class GetUsageAndQuotaParams (line 97) | class GetUsageAndQuotaParams(TypedDict):
  class GetUsageAndQuotaResult (line 101) | class GetUsageAndQuotaResult(TypedDict):
  class OverrideQuotaForOriginParams (line 108) | class OverrideQuotaForOriginParams(TypedDict):
  class TrackCacheStorageForOriginParams (line 113) | class TrackCacheStorageForOriginParams(TypedDict):
  class TrackCacheStorageForStorageKeyParams (line 117) | class TrackCacheStorageForStorageKeyParams(TypedDict):
  class TrackIndexedDBForOriginParams (line 121) | class TrackIndexedDBForOriginParams(TypedDict):
  class TrackIndexedDBForStorageKeyParams (line 125) | class TrackIndexedDBForStorageKeyParams(TypedDict):
  class UntrackCacheStorageForOriginParams (line 129) | class UntrackCacheStorageForOriginParams(TypedDict):
  class UntrackCacheStorageForStorageKeyParams (line 133) | class UntrackCacheStorageForStorageKeyParams(TypedDict):
  class UntrackIndexedDBForOriginParams (line 137) | class UntrackIndexedDBForOriginParams(TypedDict):
  class UntrackIndexedDBForStorageKeyParams (line 141) | class UntrackIndexedDBForStorageKeyParams(TypedDict):
  class GetTrustTokensResult (line 145) | class GetTrustTokensResult(TypedDict):
  class ClearTrustTokensParams (line 149) | class ClearTrustTokensParams(TypedDict):
  class ClearTrustTokensResult (line 153) | class ClearTrustTokensResult(TypedDict):
  class GetInterestGroupDetailsParams (line 157) | class GetInterestGroupDetailsParams(TypedDict):
  class GetInterestGroupDetailsResult (line 162) | class GetInterestGroupDetailsResult(TypedDict):
  class SetInterestGroupTrackingParams (line 166) | class SetInterestGroupTrackingParams(TypedDict):
  class SetInterestGroupAuctionTrackingParams (line 170) | class SetInterestGroupAuctionTrackingParams(TypedDict):
  class GetSharedStorageMetadataParams (line 174) | class GetSharedStorageMetadataParams(TypedDict):
  class GetSharedStorageMetadataResult (line 178) | class GetSharedStorageMetadataResult(TypedDict):
  class GetSharedStorageEntriesParams (line 182) | class GetSharedStorageEntriesParams(TypedDict):
  class GetSharedStorageEntriesResult (line 186) | class GetSharedStorageEntriesResult(TypedDict):
  class SetSharedStorageEntryParams (line 190) | class SetSharedStorageEntryParams(TypedDict):
  class DeleteSharedStorageEntryParams (line 197) | class DeleteSharedStorageEntryParams(TypedDict):
  class ClearSharedStorageEntriesParams (line 202) | class ClearSharedStorageEntriesParams(TypedDict):
  class ResetSharedStorageBudgetParams (line 206) | class ResetSharedStorageBudgetParams(TypedDict):
  class SetSharedStorageTrackingParams (line 210) | class SetSharedStorageTrackingParams(TypedDict):
  class SetStorageBucketTrackingParams (line 214) | class SetStorageBucketTrackingParams(TypedDict):
  class DeleteStorageBucketParams (line 219) | class DeleteStorageBucketParams(TypedDict):
  class RunBounceTrackingMitigationsResult (line 223) | class RunBounceTrackingMitigationsResult(TypedDict):
  class SetAttributionReportingLocalTestingModeParams (line 227) | class SetAttributionReportingLocalTestingModeParams(TypedDict):
  class SetAttributionReportingTrackingParams (line 231) | class SetAttributionReportingTrackingParams(TypedDict):
  class SendPendingAttributionReportsResult (line 235) | class SendPendingAttributionReportsResult(TypedDict):
  class GetRelatedWebsiteSetsResult (line 239) | class GetRelatedWebsiteSetsResult(TypedDict):
  class GetAffectedUrlsForThirdPartyCookieMetadataParams (line 243) | class GetAffectedUrlsForThirdPartyCookieMetadataParams(TypedDict):
  class GetAffectedUrlsForThirdPartyCookieMetadataResult (line 248) | class GetAffectedUrlsForThirdPartyCookieMetadataResult(TypedDict):
  class SetProtectedAudienceKAnonymityParams (line 252) | class SetProtectedAudienceKAnonymityParams(TypedDict):

FILE: pydoll/protocol/storage/types.py
  class StorageType (line 12) | class StorageType(str, Enum):
  class UsageForType (line 28) | class UsageForType(TypedDict):
  class TrustTokens (line 35) | class TrustTokens(TypedDict):
  class InterestGroupAccessType (line 43) | class InterestGroupAccessType(str, Enum):
  class InterestGroupAuctionEventType (line 59) | class InterestGroupAuctionEventType(str, Enum):
  class InterestGroupAuctionFetchType (line 66) | class InterestGroupAuctionFetchType(str, Enum):
  class SharedStorageAccessScope (line 76) | class SharedStorageAccessScope(str, Enum):
  class SharedStorageAccessMethod (line 85) | class SharedStorageAccessMethod(str, Enum):
  class SharedStorageEntry (line 105) | class SharedStorageEntry(TypedDict):
  class SharedStorageMetadata (line 112) | class SharedStorageMetadata(TypedDict):
  class SharedStoragePrivateAggregationConfig (line 121) | class SharedStoragePrivateAggregationConfig(TypedDict):
  class SharedStorageReportingMetadata (line 131) | class SharedStorageReportingMetadata(TypedDict):
  class SharedStorageUrlWithMetadata (line 138) | class SharedStorageUrlWithMetadata(TypedDict):
  class SharedStorageAccessParams (line 145) | class SharedStorageAccessParams(TypedDict, total=False):
  class StorageBucketsDurability (line 168) | class StorageBucketsDurability(str, Enum):
  class StorageBucket (line 173) | class StorageBucket(TypedDict):
  class StorageBucketInfo (line 178) | class StorageBucketInfo(TypedDict):
  class AttributionReportingSourceType (line 187) | class AttributionReportingSourceType(str, Enum):
  class AttributionReportingFilterDataEntry (line 197) | class AttributionReportingFilterDataEntry(TypedDict):
  class AttributionReportingFilterConfig (line 202) | class AttributionReportingFilterConfig(TypedDict):
  class AttributionReportingFilterPair (line 207) | class AttributionReportingFilterPair(TypedDict):
  class AttributionReportingAggregationKeysEntry (line 212) | class AttributionReportingAggregationKeysEntry(TypedDict):
  class AttributionReportingEventReportWindows (line 217) | class AttributionReportingEventReportWindows(TypedDict):
  class AttributionReportingTriggerDataMatching (line 222) | class AttributionReportingTriggerDataMatching(str, Enum):
  class AttributionReportingAggregatableDebugReportingData (line 227) | class AttributionReportingAggregatableDebugReportingData(TypedDict):
  class AttributionReportingAggregatableDebugReportingConfig (line 233) | class AttributionReportingAggregatableDebugReportingConfig(TypedDict):
  class AttributionScopesData (line 240) | class AttributionScopesData(TypedDict):
  class AttributionReportingNamedBudgetDef (line 246) | class AttributionReportingNamedBudgetDef(TypedDict):
  class AttributionReportingSourceRegistration (line 251) | class AttributionReportingSourceRegistration(TypedDict):
  class AttributionReportingSourceRegistrationResult (line 276) | class AttributionReportingSourceRegistrationResult(str, Enum):
  class AttributionReportingSourceRegistrationTimeConfig (line 295) | class AttributionReportingSourceRegistrationTimeConfig(str, Enum):
  class AttributionReportingAggregatableValueDictEntry (line 300) | class AttributionReportingAggregatableValueDictEntry(TypedDict):
  class AttributionReportingAggregatableValueEntry (line 306) | class AttributionReportingAggregatableValueEntry(TypedDict):
  class AttributionReportingEventTriggerData (line 311) | class AttributionReportingEventTriggerData(TypedDict):
  class AttributionReportingAggregatableTriggerData (line 318) | class AttributionReportingAggregatableTriggerData(TypedDict):
  class AttributionReportingAggregatableDedupKey (line 324) | class AttributionReportingAggregatableDedupKey(TypedDict):
  class AttributionReportingNamedBudgetCandidate (line 329) | class AttributionReportingNamedBudgetCandidate(TypedDict):
  class AttributionReportingTriggerRegistration (line 334) | class AttributionReportingTriggerRegistration(TypedDict):
  class AttributionReportingEventLevelResult (line 351) | class AttributionReportingEventLevelResult(str, Enum):
  class AttributionReportingAggregatableResult (line 373) | class AttributionReportingAggregatableResult(str, Enum):
  class AttributionReportingReportResult (line 391) | class AttributionReportingReportResult(str, Enum):
  class RelatedWebsiteSet (line 398) | class RelatedWebsiteSet(TypedDict):

FILE: pydoll/protocol/target/events.py
  class TargetEvent (line 9) | class TargetEvent(str, Enum):
  class AttachedToTargetParams (line 85) | class AttachedToTargetParams(TypedDict):
  class DetachedFromTargetParams (line 93) | class DetachedFromTargetParams(TypedDict):
  class ReceivedMessageFromTargetParams (line 100) | class ReceivedMessageFromTargetParams(TypedDict):
  class TargetCreatedParams (line 108) | class TargetCreatedParams(TypedDict):
  class TargetDestroyedParams (line 114) | class TargetDestroyedParams(TypedDict):
  class TargetCrashedParams (line 120) | class TargetCrashedParams(TypedDict):
  class TargetInfoChangedParams (line 128) | class TargetInfoChangedParams(TypedDict):

FILE: pydoll/protocol/target/methods.py
  class TargetMethod (line 16) | class TargetMethod(str, Enum):
  class ActivateTargetParams (line 40) | class ActivateTargetParams(TypedDict):
  class AttachToTargetParams (line 46) | class AttachToTargetParams(TypedDict):
  class AttachToBrowserTargetParams (line 53) | class AttachToBrowserTargetParams(TypedDict):
  class CloseTargetParams (line 59) | class CloseTargetParams(TypedDict):
  class ExposeDevToolsProtocolParams (line 65) | class ExposeDevToolsProtocolParams(TypedDict):
  class CreateBrowserContextParams (line 73) | class CreateBrowserContextParams(TypedDict):
  class CreateTargetParams (line 82) | class CreateTargetParams(TypedDict):
  class DetachFromTargetParams (line 99) | class DetachFromTargetParams(TypedDict):
  class DisposeBrowserContextParams (line 106) | class DisposeBrowserContextParams(TypedDict):
  class GetTargetInfoParams (line 112) | class GetTargetInfoParams(TypedDict):
  class GetTargetsParams (line 118) | class GetTargetsParams(TypedDict):
  class SendMessageToTargetParams (line 124) | class SendMessageToTargetParams(TypedDict):
  class SetAutoAttachParams (line 132) | class SetAutoAttachParams(TypedDict):
  class AutoAttachRelatedParams (line 141) | class AutoAttachRelatedParams(TypedDict):
  class SetDiscoverTargetsParams (line 149) | class SetDiscoverTargetsParams(TypedDict):
  class SetRemoteLocationsParams (line 156) | class SetRemoteLocationsParams(TypedDict):
  class OpenDevToolsParams (line 162) | class OpenDevToolsParams(TypedDict):
  class AttachToTargetResult (line 169) | class AttachToTargetResult(TypedDict):
  class AttachToBrowserTargetResult (line 175) | class AttachToBrowserTargetResult(TypedDict):
  class CloseTargetResult (line 181) | class CloseTargetResult(TypedDict):
  class CreateBrowserContextResult (line 187) | class CreateBrowserContextResult(TypedDict):
  class GetBrowserContextsResult (line 193) | class GetBrowserContextsResult(TypedDict):
  class CreateTargetResult (line 199) | class CreateTargetResult(TypedDict):
  class GetTargetInfoResult (line 205) | class GetTargetInfoResult(TypedDict):
  class GetTargetsResult (line 211) | class GetTargetsResult(TypedDict):
  class OpenDevToolsResult (line 217) | class OpenDevToolsResult(TypedDict):

FILE: pydoll/protocol/target/types.py
  class TargetInfo (line 10) | class TargetInfo(TypedDict):
  class FilterEntry (line 23) | class FilterEntry(TypedDict, total=False):
  class RemoteLocation (line 33) | class RemoteLocation(TypedDict):

FILE: pydoll/utils/bundle.py
  function filter_fetchable_resources (line 56) | def filter_fetchable_resources(
  function collect_frame_resources (line 74) | def collect_frame_resources(
  function build_asset_filename (line 87) | def build_asset_filename(url: str, mime_type: str, index: int) -> str:
  function rewrite_css_urls (line 99) | def rewrite_css_urls(
  function inline_css_urls (line 120) | def inline_css_urls(
  function replace_stylesheet_with_inline (line 142) | def replace_stylesheet_with_inline(html: str, url: str, css_text: str) -...
  function replace_script_with_inline (line 153) | def replace_script_with_inline(html: str, url: str, js_text: str) -> str:
  function rewrite_html_urls (line 165) | def rewrite_html_urls(
  function inline_all_assets (line 179) | def inline_all_assets(

FILE: pydoll/utils/general.py
  class TextExtractor (line 15) | class TextExtractor(HTMLParser):
    method __init__ (line 23) | def __init__(self):
    method handle_starttag (line 29) | def handle_starttag(self, tag, attrs):
    method handle_endtag (line 40) | def handle_endtag(self, tag):
    method handle_data (line 50) | def handle_data(self, data):
    method get_strings (line 60) | def get_strings(self, strip: bool):
    method get_text (line 73) | def get_text(self, separator: str, strip: bool) -> str:
  function extract_text_from_html (line 87) | def extract_text_from_html(html: str, separator: str = '', strip: bool =...
  function decode_base64_to_bytes (line 104) | def decode_base64_to_bytes(image: str) -> bytes:
  function get_browser_ws_address (line 117) | async def get_browser_ws_address(port: int) -> str:
  function validate_browser_paths (line 143) | def validate_browser_paths(paths: list[str]) -> str:
  function clean_script_for_analysis (line 167) | def clean_script_for_analysis(script: str) -> str:
  function is_script_already_function (line 193) | def is_script_already_function(script: str) -> bool:
  function has_return_outside_function (line 214) | def has_return_outside_function(script: str) -> bool:
  function normalize_synthetic_xpath (line 260) | def normalize_synthetic_xpath(selector: str) -> str:

FILE: pydoll/utils/socks5_proxy_forwarder.py
  class _suppress_closed (line 90) | class _suppress_closed:
    method __enter__ (line 93) | def __enter__(self) -> None:
    method __exit__ (line 96) | def __exit__(
  function _close_writer (line 105) | async def _close_writer(writer: asyncio.StreamWriter) -> None:
  function _pipe (line 112) | async def _pipe(
  class SOCKS5Forwarder (line 131) | class SOCKS5Forwarder:
    method __init__ (line 142) | def __init__(
    method __aenter__ (line 163) | async def __aenter__(self) -> SOCKS5Forwarder:
    method __aexit__ (line 167) | async def __aexit__(
    method start (line 175) | async def start(self) -> None:
    method stop (line 216) | async def stop(self) -> None:
    method serve_forever (line 224) | async def serve_forever(self) -> None:
    method _handle_client (line 231) | async def _handle_client(
    method _accept_local_handshake (line 286) | async def _accept_local_handshake(
    method _remote_handshake (line 334) | async def _remote_handshake(
    method _read_raw_address (line 411) | async def _read_raw_address(
    method _send_reply (line 435) | async def _send_reply(
  class _HandshakeError (line 457) | class _HandshakeError(Exception):
    method __init__ (line 460) | def __init__(
  function _read_exact (line 471) | async def _read_exact(reader: asyncio.StreamReader, n: int, *, peer: str...
  function _skip_bnd_address (line 486) | async def _skip_bnd_address(reader: asyncio.StreamReader, atyp: int, *, ...
  function _main (line 497) | async def _main(args: argparse.Namespace) -> None:
  function _test_negotiate_auth (line 532) | async def _test_negotiate_auth(
  function _test_connect_and_verify (line 574) | async def _test_connect_and_verify(
  function _test_proxy (line 622) | async def _test_proxy(args: argparse.Namespace) -> None:
  function cli (line 656) | def cli() -> None:

FILE: pydoll/utils/user_agent_parser.py
  class ParsedUserAgent (line 89) | class ParsedUserAgent:
  class UserAgentParser (line 99) | class UserAgentParser:
    method parse (line 112) | def parse(user_agent: str) -> ParsedUserAgent:
    method _build_metadata (line 140) | def _build_metadata(
    method _detect_os_key (line 161) | def _detect_os_key(user_agent: str) -> str:
    method _detect_browser (line 169) | def _detect_browser(user_agent: str) -> tuple[str, str, str]:
    method _detect_mobile (line 185) | def _detect_mobile(user_agent: str) -> bool:
    method _build_app_version (line 190) | def _build_app_version(user_agent: str) -> str:
    method _get_platform_version (line 196) | def _get_platform_version(user_agent: str, os_key: str) -> str:
    method _parse_windows_version (line 213) | def _parse_windows_version(user_agent: str, default: str) -> str:
    method _parse_dotted_version (line 220) | def _parse_dotted_version(user_agent: str, pattern: str, default: str)...
    method _build_grease (line 230) | def _build_grease(major_int: int) -> tuple[str, str, str]:
    method _build_brands (line 241) | def _build_brands(browser_name: str, major_version: str) -> list[UserA...
    method _build_full_version_list (line 256) | def _build_full_version_list(
    method _extract_model (line 274) | def _extract_model(user_agent: str) -> str:
    method _build_navigator_override_js (line 281) | def _build_navigator_override_js(vendor: str, app_version: str) -> str:

FILE: tests/conftest.py
  function ci_chrome_options (line 9) | def ci_chrome_options():

FILE: tests/test_browser/test_browser_base.py
  class ConcreteBrowser (line 36) | class ConcreteBrowser(Browser):
    method _get_default_binary_location (line 37) | def _get_default_binary_location(self) -> str:
  function mock_browser (line 42) | async def mock_browser():
  function test_browser_initialization (line 83) | async def test_browser_initialization(mock_browser):
  function test_start_browser_success (line 93) | async def test_start_browser_success(mock_browser):
  function test_start_browser_failure (line 112) | async def test_start_browser_failure(mock_browser):
  function test_start_browser_failure_with_start_timeout (line 121) | async def test_start_browser_failure_with_start_timeout(mock_browser):
  function test_start_browser_success_with_start_timeout (line 148) | async def test_start_browser_success_with_start_timeout(mock_browser):
  function test_proxy_configuration (line 174) | async def test_proxy_configuration(mock_browser):
  function test_new_tab (line 195) | async def test_new_tab(mock_browser):
  function test_connect_with_ws_address_returns_tab_and_sets_handler_ws (line 205) | async def test_connect_with_ws_address_returns_tab_and_sets_handler_ws(m...
  function test_connect_with_ws_address_preserves_token_in_tab_ws (line 223) | async def test_connect_with_ws_address_preserves_token_in_tab_ws(mock_br...
  function test_new_tab_uses_ws_base_when_ws_address_present (line 241) | async def test_new_tab_uses_ws_base_when_ws_address_present(mock_browser):
  function test_get_window_id_for_tab_uses_ws_target_when_no_target_id (line 257) | async def test_get_window_id_for_tab_uses_ws_target_when_no_target_id(mo...
  function test_cookie_management (line 272) | async def test_cookie_management(mock_browser):
  function test_event_registration (line 290) | async def test_event_registration(mock_browser):
  function test_remove_callback_success (line 301) | async def test_remove_callback_success(mock_browser):
  function test_remove_callback_false (line 312) | async def test_remove_callback_false(mock_browser):
  function test_window_management (line 323) | async def test_window_management(mock_browser):
  function test_get_window_id_for_target (line 347) | async def test_get_window_id_for_target(mock_browser):
  function test_get_window_id_for_tab_raises_when_no_target_id_and_no_ws (line 363) | async def test_get_window_id_for_tab_raises_when_no_target_id_and_no_ws(...
  function test__validate_ws_address_raises_on_invalid_scheme (line 370) | def test__validate_ws_address_raises_on_invalid_scheme():
  function test__validate_ws_address_accepts_ws_scheme (line 375) | def test__validate_ws_address_accepts_ws_scheme():
  function test__validate_ws_address_accepts_wss_scheme (line 379) | def test__validate_ws_address_accepts_wss_scheme():
  function test__validate_ws_address_raises_on_insufficient_slashes (line 383) | def test__validate_ws_address_raises_on_insufficient_slashes():
  function test__validate_ws_address_raises_on_insufficient_slashes_wss (line 388) | def test__validate_ws_address_raises_on_insufficient_slashes_wss():
  function test__get_tab_ws_address_raises_when_ws_not_set (line 393) | def test__get_tab_ws_address_raises_when_ws_not_set(mock_browser):
  function test__get_tab_ws_address_preserves_query_and_fragment (line 399) | def test__get_tab_ws_address_preserves_query_and_fragment(mock_browser):
  function test__get_tab_ws_address_preserves_wss_scheme (line 405) | def test__get_tab_ws_address_preserves_wss_scheme(mock_browser):
  function test_get_window_id (line 412) | async def test_get_window_id(mock_browser):
  function test_stop_browser (line 425) | async def test_stop_browser(mock_browser):
  function test_stop_browser_not_running (line 435) | async def test_stop_browser_not_running(mock_browser):
  function test_context_manager (line 444) | async def test_context_manager(mock_browser):
  function test_enable_events (line 453) | async def test_enable_events(mock_browser):
  function test_disable_events (line 461) | async def test_disable_events(mock_browser):
  function test__continue_request_callback (line 467) | async def test__continue_request_callback(mock_browser):
  function test__continue_request_auth_required_callback (line 475) | async def test__continue_request_auth_required_callback(mock_browser):
  function test__is_valid_tab (line 490) | def test__is_valid_tab(mock_browser):
  function test__is_valid_tab_not_a_tab (line 500) | def test__is_valid_tab_not_a_tab(mock_browser):
  function test__get_default_binary_location (line 531) | def test__get_default_binary_location(
  function test__get_default_binary_location_unsupported_os (line 546) | def test__get_default_binary_location_unsupported_os():
  function test__get_default_binary_location_throws_exception_if_os_not_supported (line 553) | def test__get_default_binary_location_throws_exception_if_os_not_supported(
  function test_create_browser_context (line 563) | async def test_create_browser_context(mock_browser):
  function test_create_browser_context_with_private_proxy_sanitizes_and_stores_auth (line 586) | async def test_create_browser_context_with_private_proxy_sanitizes_and_s...
  function test_create_browser_context_with_private_proxy_no_scheme_sanitizes_and_stores_auth (line 607) | async def test_create_browser_context_with_private_proxy_no_scheme_sanit...
  function test__sanitize_proxy_and_extract_auth_variants (line 636) | def test__sanitize_proxy_and_extract_auth_variants(input_proxy, expected...
  function test_new_tab_sets_up_context_proxy_auth_handlers (line 644) | async def test_new_tab_sets_up_context_proxy_auth_handlers(MockTab, mock...
  function test_new_tab_without_context_proxy_auth_does_not_setup_handlers (line 691) | async def test_new_tab_without_context_proxy_auth_does_not_setup_handler...
  function test_delete_browser_context (line 712) | async def test_delete_browser_context(mock_browser):
  function test_get_browser_contexts (line 721) | async def test_get_browser_contexts(mock_browser):
  function test_set_download_behavior (line 733) | async def test_set_download_behavior(mock_browser):
  function test_set_download_path (line 750) | async def test_set_download_path(mock_browser):
  function test_grant_permissions (line 763) | async def test_grant_permissions(mock_browser):
  function test_reset_permissions (line 777) | async def test_reset_permissions(mock_browser):
  function test_get_version (line 786) | async def test_get_version(mock_browser):
  function test_headless_mode (line 807) | async def test_headless_mode(mock_browser):
  function test_multiple_tab_handling (line 818) | async def test_multiple_tab_handling(mock_browser):
  function test_get_valid_tab_id_success (line 838) | async def test_get_valid_tab_id_success():
  function test_get_valid_tab_id_no_valid_tabs (line 851) | async def test_get_valid_tab_id_no_valid_tabs():
  function test_get_valid_tab_id_empty_targets (line 863) | async def test_get_valid_tab_id_empty_targets():
  function test_get_valid_tab_id_missing_target_id (line 872) | async def test_get_valid_tab_id_missing_target_id():
  function test_get_valid_tab_id_filters_extensions (line 884) | async def test_get_valid_tab_id_filters_extensions():
  function test_enable_runtime_events (line 897) | async def test_enable_runtime_events(mock_browser):
  function test_disable_runtime_events (line 905) | async def test_disable_runtime_events(mock_browser):
  function test_get_tab_by_target (line 913) | async def test_get_tab_by_target(mock_browser):
  function test_continue_request (line 929) | async def test_continue_request(mock_browser):
  function test_continue_request_with_all_params (line 949) | async def test_continue_request_with_all_params(mock_browser):
  function test_fail_request (line 981) | async def test_fail_request(mock_browser):
  function test_fulfill_request (line 993) | async def test_fulfill_request(mock_browser):
  function test_fulfill_request_with_all_params (line 1013) | async def test_fulfill_request_with_all_params(mock_browser):
  function test_event_registration_with_async_callback (line 1044) | async def test_event_registration_with_async_callback(mock_browser):
  function test_event_registration_sync_callback (line 1068) | async def test_event_registration_sync_callback(mock_browser):
  function test_get_opened_tabs_success (line 1086) | async def test_get_opened_tabs_success(mock_browser):
  function test_get_opened_tabs_no_valid_tabs (line 1128) | async def test_get_opened_tabs_no_valid_tabs(mock_browser):
  function test_get_opened_tabs_empty_targets (line 1164) | async def test_get_opened_tabs_empty_targets(mock_browser):
  function test_get_opened_tabs_filters_extensions (line 1177) | async def test_get_opened_tabs_filters_extensions(mock_browser):
  function test_get_opened_tabs_filters_non_page_types (line 1214) | async def test_get_opened_tabs_filters_non_page_types(mock_browser):
  function test_get_opened_tabs_order_is_reversed (line 1252) | async def test_get_opened_tabs_order_is_reversed(mock_browser):
  function test_get_opened_tabs_with_mixed_valid_invalid_targets (line 1287) | async def test_get_opened_tabs_with_mixed_valid_invalid_targets(mock_bro...
  function test_get_opened_tabs_integration_with_new_tab (line 1341) | async def test_get_opened_tabs_integration_with_new_tab(mock_browser):
  function test_headless_parameter_deprecation_warning (line 1381) | async def test_headless_parameter_deprecation_warning(mock_browser):
  function test_get_user_agent_from_options_found (line 1399) | async def test_get_user_agent_from_options_found(mock_browser):
  function test_get_user_agent_from_options_not_found (line 1408) | async def test_get_user_agent_from_options_not_found(mock_browser):
  function test_apply_user_agent_override_no_ua_set (line 1414) | async def test_apply_user_agent_override_no_ua_set(mock_browser):
  function test_apply_user_agent_override_with_ua_set (line 1424) | async def test_apply_user_agent_override_with_ua_set(mock_browser):
  function test_apply_user_agent_override_metadata_consistency (line 1454) | async def test_apply_user_agent_override_metadata_consistency(mock_brows...
  function test_start_applies_user_agent_override (line 1480) | async def test_start_applies_user_agent_override(mock_browser):
  function test_new_tab_applies_user_agent_override (line 1496) | async def test_new_tab_applies_user_agent_override(mock_browser):

FILE: tests/test_browser/test_browser_chrome.py
  class TestChromeInitialization (line 12) | class TestChromeInitialization:
    method test_chrome_initialization_default_options (line 15) | def test_chrome_initialization_default_options(self):
    method test_chrome_initialization_custom_options (line 38) | def test_chrome_initialization_custom_options(self):
    method test_chrome_initialization_custom_port (line 66) | def test_chrome_initialization_custom_port(self):
    method test_chrome_initialization_both_custom (line 90) | def test_chrome_initialization_both_custom(self):
  class TestChromeDefaultBinaryLocation (line 119) | class TestChromeDefaultBinaryLocation:
    method test_get_default_binary_location_success (line 144) | def test_get_default_binary_location_success(
    method test_get_default_binary_location_unsupported_os (line 159) | def test_get_default_binary_location_unsupported_os(self, mock_platfor...
    method test_get_default_binary_location_unknown_os (line 167) | def test_get_default_binary_location_unknown_os(self, mock_platform_sy...
    method test_get_default_binary_location_validation_error (line 176) | def test_get_default_binary_location_validation_error(
    method test_get_default_binary_location_windows_fallback (line 188) | def test_get_default_binary_location_windows_fallback(
  class TestChromeOptionsManager (line 206) | class TestChromeOptionsManager:
    method test_options_manager_creation (line 209) | def test_options_manager_creation(self):
    method test_options_manager_with_none_options (line 236) | def test_options_manager_with_none_options(self):
  class TestChromeInheritance (line 260) | class TestChromeInheritance:
    method test_chrome_inherits_from_browser (line 263) | def test_chrome_inherits_from_browser(self):
    method test_chrome_overrides_get_default_binary_location (line 290) | def test_chrome_overrides_get_default_binary_location(self):
  class TestChromeEdgeCases (line 301) | class TestChromeEdgeCases:
    method test_chrome_with_empty_options (line 304) | def test_chrome_with_empty_options(self):
    method test_chrome_with_zero_port (line 329) | def test_chrome_with_zero_port(self):
    method test_chrome_with_negative_port (line 352) | def test_chrome_with_negative_port(self):
  class TestChromeIntegration (line 374) | class TestChromeIntegration:
    method test_chrome_full_initialization_flow (line 377) | def test_chrome_full_initialization_flow(self):
    method test_chrome_options_initialization_flow (line 428) | def test_chrome_options_initialization_flow(self):
    method test_chrome_user_data_dir_and_preferences (line 458) | async def test_chrome_user_data_dir_and_preferences(self, tmp_path):
    method test_chrome_user_data_dir_with_invalid_json_preferences (line 521) | async def test_chrome_user_data_dir_with_invalid_json_preferences(self...

FILE: tests/test_browser/test_browser_edge.py
  class TestEdgeInitialization (line 12) | class TestEdgeInitialization:
    method test_edge_initialization_default_options (line 15) | def test_edge_initialization_default_options(self):
    method test_edge_initialization_custom_options (line 38) | def test_edge_initialization_custom_options(self):
    method test_edge_initialization_custom_port (line 66) | def test_edge_initialization_custom_port(self):
    method test_edge_initialization_both_custom (line 90) | def test_edge_initialization_both_custom(self):
  class TestEdgeDefaultBinaryLocation (line 119) | class TestEdgeDefaultBinaryLocation:
    method test_get_default_binary_location_success (line 144) | def test_get_default_binary_location_success(
    method test_get_default_binary_location_unsupported_os (line 159) | def test_get_default_binary_location_unsupported_os(self, mock_platfor...
    method test_get_default_binary_location_unknown_os (line 167) | def test_get_default_binary_location_unknown_os(self, mock_platform_sy...
    method test_get_default_binary_location_validation_error (line 176) | def test_get_default_binary_location_validation_error(
    method test_get_default_binary_location_windows_fallback (line 188) | def test_get_default_binary_location_windows_fallback(
    method test_get_default_binary_location_linux_path (line 207) | def test_get_default_binary_location_linux_path(
    method test_get_default_binary_location_macos_path (line 222) | def test_get_default_binary_location_macos_path(
  class TestEdgeOptionsManager (line 236) | class TestEdgeOptionsManager:
    method test_options_manager_creation (line 239) | def test_options_manager_creation(self):
    method test_options_manager_with_none_options (line 266) | def test_options_manager_with_none_options(self):
  class TestEdgeInheritance (line 290) | class TestEdgeInheritance:
    method test_edge_inherits_from_browser (line 293) | def test_edge_inherits_from_browser(self):
    method test_edge_overrides_get_default_binary_location (line 320) | def test_edge_overrides_get_default_binary_location(self):
    method test_edge_uses_chromium_options_manager (line 330) | def test_edge_uses_chromium_options_manager(self):
  class TestEdgeEdgeCases (line 354) | class TestEdgeEdgeCases:
    method test_edge_with_empty_options (line 357) | def test_edge_with_empty_options(self):
    method test_edge_with_zero_port (line 382) | def test_edge_with_zero_port(self):
    method test_edge_with_negative_port (line 405) | def test_edge_with_negative_port(self):
    method test_edge_with_edge_specific_arguments (line 426) | def test_edge_with_edge_specific_arguments(self):
  class TestEdgeIntegration (line 454) | class TestEdgeIntegration:
    method test_edge_full_initialization_flow (line 457) | def test_edge_full_initialization_flow(self):
    method test_edge_options_initialization_flow (line 497) | def test_edge_options_initialization_flow(self):
    method test_edge_vs_chrome_compatibility (line 526) | def test_edge_vs_chrome_compatibility(self):

FILE: tests/test_browser/test_browser_options.py
  function test_initial_arguments (line 13) | def test_initial_arguments():
  function test_initial_binary_location (line 18) | def test_initial_binary_location():
  function test_set_binary_location (line 23) | def test_set_binary_location():
  function test_set_start_timeout (line 29) | def test_set_start_timeout():
  function test_initial_page_load_state (line 35) | def test_initial_page_load_state():
  function test_set_page_load_state (line 40) | def test_set_page_load_state():
  function test_add_argument (line 46) | def test_add_argument():
  function test_add_duplicate_argument (line 52) | def test_add_duplicate_argument():
  function test_remove_argument (line 58) | def test_remove_argument():
  function test_remove_argument_not_exists (line 64) | def test_remove_argument_not_exists():
  function test_add_multiple_arguments (line 69) | def test_add_multiple_arguments():
  function test_set_default_download_directory (line 76) | def test_set_default_download_directory():
  function test_set_prompt_for_download (line 82) | def test_set_prompt_for_download():
  function test_set_block_popups (line 89) | def test_set_block_popups():
  function test_set_password_manager_enabled (line 96) | def test_set_password_manager_enabled():
  function test_set_block_notifications (line 103) | def test_set_block_notifications():
  function test_set_allow_automatic_downloads (line 113) | def test_set_allow_automatic_downloads():
  function test_set_open_pdf_externally (line 125) | def test_set_open_pdf_externally():
  function test_set_accept_languages (line 132) | def test_set_accept_languages():
  function test_set_multiple_prefs (line 138) | def test_set_multiple_prefs():
  function test_dict_prefs (line 167) | def test_dict_prefs():
  function test_not_dict_prefs_error (line 175) | def test_not_dict_prefs_error():
  function test_wrong_dict_prefs_error (line 181) | def test_wrong_dict_prefs_error():
  function test_set_arguments (line 190) | def test_set_arguments():
  function test_get_pref_path (line 195) | def test_get_pref_path():
  function test_get_pref_path_none (line 201) | def test_get_pref_path_none():
  function test_options_interface_enforcement (line 206) | def test_options_interface_enforcement():
  function test_set_headless (line 250) | def test_set_headless():
  function test_set_headless_false (line 256) | def test_set_headless_false():
  function test_set_headless_true_twice (line 265) | def test_set_headless_true_twice():
  function test_set_headless_false_twice (line 274) | def test_set_headless_false_twice():
  function test_set_webrtc_leak_protection (line 283) | def test_set_webrtc_leak_protection():
  function test_set_webrtc_leak_protection_false (line 289) | def test_set_webrtc_leak_protection_false():
  function test_set_webrtc_leak_protection_true_twice (line 298) | def test_set_webrtc_leak_protection_true_twice():
  function test_set_webrtc_leak_protection_false_twice (line 307) | def test_set_webrtc_leak_protection_false_twice():

FILE: tests/test_browser/test_browser_tab.py
  function mock_connection_handler (line 39) | async def mock_connection_handler():
  function mock_browser (line 53) | async def mock_browser():
  function tab (line 62) | async def tab(mock_browser, mock_connection_handler):
  function assert_mock_called_at_least_once (line 75) | def assert_mock_called_at_least_once(mock_obj, method_name='execute_comm...
  function cleanup_tab_registry (line 86) | def cleanup_tab_registry():
  class TestTabInitialization (line 91) | class TestTabInitialization:
    method test_tab_initialization (line 94) | def test_tab_initialization(self, tab, mock_browser):
    method test_tab_init_raises_when_no_identifiers (line 107) | def test_tab_init_raises_when_no_identifiers(self, mock_browser):
    method test_tab_properties (line 111) | def test_tab_properties(self, tab):
  class TestTabProperties (line 137) | class TestTabProperties:
    method test_current_url (line 141) | async def test_current_url(self, tab):
    method test_page_source (line 154) | async def test_page_source(self, tab):
    method test_title (line 167) | async def test_title(self, tab):
    method test_title_empty (line 179) | async def test_title_empty(self, tab):
  class TestTabEventManagement (line 189) | class TestTabEventManagement:
    method test_enable_page_events (line 193) | async def test_enable_page_events(self, tab):
    method test_enable_network_events (line 200) | async def test_enable_network_events(self, tab):
    method test_enable_fetch_events (line 207) | async def test_enable_fetch_events(self, tab):
    method test_enable_fetch_events_with_params (line 214) | async def test_enable_fetch_events_with_params(self, tab):
    method test_enable_dom_events (line 225) | async def test_enable_dom_events(self, tab):
    method test_enable_runtime_events (line 232) | async def test_enable_runtime_events(self, tab):
    method test_enable_intercept_file_chooser_dialog (line 239) | async def test_enable_intercept_file_chooser_dialog(self, tab):
    method test_disable_fetch_events (line 246) | async def test_disable_fetch_events(self, tab):
    method test_disable_page_events (line 254) | async def test_disable_page_events(self, tab):
    method test_disable_network_events (line 262) | async def test_disable_network_events(self, tab):
    method test_disable_dom_events (line 270) | async def test_disable_dom_events(self, tab):
    method test_disable_runtime_events (line 278) | async def test_disable_runtime_events(self, tab):
    method test_disable_intercept_file_chooser_dialog (line 286) | async def test_disable_intercept_file_chooser_dialog(self, tab):
  class TestTabCookieManagement (line 294) | class TestTabCookieManagement:
    method test_get_cookies (line 298) | async def test_get_cookies(self, tab):
    method test_get_cookies_uses_storage_commands_with_browser_context_id (line 310) | async def test_get_cookies_uses_storage_commands_with_browser_context_id(
    method test_get_cookies_uses_network_commands_without_browser_context_id (line 339) | async def test_get_cookies_uses_network_commands_without_browser_conte...
    method test_set_cookies (line 368) | async def test_set_cookies(self, tab):
    method test_delete_all_cookies (line 377) | async def test_delete_all_cookies(self, tab):
  class TestTabNavigation (line 385) | class TestTabNavigation:
    method test_go_to_new_url (line 389) | async def test_go_to_new_url(self, tab):
    method test_go_to_same_url (line 409) | async def test_go_to_same_url(self, tab):
    method test_go_to_timeout (line 429) | async def test_go_to_timeout(self, tab):
    method test_refresh (line 445) | async def test_refresh(self, tab):
    method test_refresh_with_params (line 464) | async def test_refresh_with_params(self, tab):
  class TestTabScreenshotAndPDF (line 483) | class TestTabScreenshotAndPDF:
    method test_take_screenshot_to_file (line 487) | async def test_take_screenshot_to_file(self, tab, tmp_path):
    method test_take_screenshot_as_base64 (line 508) | async def test_take_screenshot_as_base64(self, tab):
    method test_take_screenshot_beyond_viewport (line 521) | async def test_take_screenshot_beyond_viewport(self, tab):
    method test_take_screenshot_in_iframe_raises_top_level_required (line 541) | async def test_take_screenshot_in_iframe_raises_top_level_required(sel...
    method test_print_to_pdf_to_file (line 549) | async def test_print_to_pdf_to_file(self, tab, tmp_path):
    method test_print_to_pdf_as_base64 (line 570) | async def test_print_to_pdf_as_base64(self, tab):
    method test_print_to_pdf_with_options (line 583) | async def test_print_to_pdf_with_options(self, tab, tmp_path):
  class TestTabDialogHandling (line 610) | class TestTabDialogHandling:
    method test_has_dialog_true (line 614) | async def test_has_dialog_true(self, tab):
    method test_has_dialog_false (line 622) | async def test_has_dialog_false(self, tab):
    method test_get_dialog_message_success (line 630) | async def test_get_dialog_message_success(self, tab):
    method test_get_dialog_message_no_dialog (line 638) | async def test_get_dialog_message_no_dialog(self, tab):
    method test_handle_dialog_accept (line 646) | async def test_handle_dialog_accept(self, tab):
    method test_handle_dialog_dismiss (line 655) | async def test_handle_dialog_dismiss(self, tab):
    method test_handle_dialog_with_prompt_text (line 664) | async def test_handle_dialog_with_prompt_text(self, tab):
    method test_handle_dialog_no_dialog (line 673) | async def test_handle_dialog_no_dialog(self, tab):
  class TestTabScriptExecution (line 681) | class TestTabScriptExecution:
    method test_execute_script_simple (line 685) | async def test_execute_script_simple(self, tab):
    method test_execute_script_return_outside_function (line 696) | async def test_execute_script_return_outside_function(self, tab):
    method test_execute_script_return_inside_function (line 708) | async def test_execute_script_return_inside_function(self, tab):
    method test_execute_script_no_return_statement (line 726) | async def test_execute_script_no_return_statement(self, tab):
    method test_execute_script_with_comments_and_strings (line 738) | async def test_execute_script_with_comments_and_strings(self, tab):
    method test_execute_script_already_wrapped_function (line 756) | async def test_execute_script_already_wrapped_function(self, tab):
    method test_execute_script_with_webelement_deprecation_warning (line 769) | async def test_execute_script_with_webelement_deprecation_warning(self...
    method test_execute_script_with_webelement_all_parameters (line 795) | async def test_execute_script_with_webelement_all_parameters(self, tab):
    method test_validate_argument_error_early_returns (line 849) | def test_validate_argument_error_early_returns(self, tab, response):
    method test_validate_argument_error_raises_on_match (line 857) | def test_validate_argument_error_raises_on_match(self, tab, description):
    method test_execute_script_triggers_validation (line 873) | async def test_execute_script_triggers_validation(self, tab):
  class TestTabEventCallbacks (line 889) | class TestTabEventCallbacks:
    method test_on_callback_registration (line 893) | async def test_on_callback_registration(self, tab):
    method test_on_temporary_callback (line 907) | async def test_on_temporary_callback(self, tab):
    method test_remove_callback_success (line 924) | async def test_remove_callback_success(self, tab):
    method test_remove_callback_false (line 934) | async def test_remove_callback_false(self, tab):
  class TestTabFileChooser (line 944) | class TestTabFileChooser:
    method test_expect_file_chooser_single_file (line 948) | async def test_expect_file_chooser_single_file(self, tab):
    method test_expect_file_chooser_multiple_files (line 973) | async def test_expect_file_chooser_multiple_files(self, tab):
    method test_expect_file_chooser_with_path_objects (line 1000) | async def test_expect_file_chooser_with_path_objects(self, tab):
    method test_expect_file_chooser_event_handler_single_file (line 1027) | async def test_expect_file_chooser_event_handler_single_file(self, tab):
    method test_expect_file_chooser_event_handler_multiple_files (line 1072) | async def test_expect_file_chooser_event_handler_multiple_files(self, ...
    method _test_event_handler_with_files (line 1116) | async def _test_event_handler_with_files(self, tab, files, expected_fi...
    method test_expect_file_chooser_event_handler_path_objects (line 1161) | async def test_expect_file_chooser_event_handler_path_objects(self, tab):
    method test_expect_file_chooser_event_handler_single_path_object (line 1171) | async def test_expect_file_chooser_event_handler_single_path_object(se...
    method test_expect_file_chooser_event_handler_empty_list (line 1181) | async def test_expect_file_chooser_event_handler_empty_list(self, tab):
  class TestTabCloudflareBypass (line 1191) | class TestTabCloudflareBypass:
    method test_enable_auto_solve_cloudflare_captcha (line 1195) | async def test_enable_auto_solve_cloudflare_captcha(self, tab):
    method test_enable_auto_solve_cloudflare_captcha_with_params (line 1209) | async def test_enable_auto_solve_cloudflare_captcha_with_params(self, ...
    method test_disable_auto_solve_cloudflare_captcha (line 1225) | async def test_disable_auto_solve_cloudflare_captcha(self, tab):
    method test_expect_and_bypass_cloudflare_captcha (line 1235) | async def test_expect_and_bypass_cloudflare_captcha(self, tab):
    method test_bypass_cloudflare_with_shadow_root_traversal (line 1258) | async def test_bypass_cloudflare_with_shadow_root_traversal(self, tab):
    method test_bypass_cloudflare_no_shadow_root_found (line 1283) | async def test_bypass_cloudflare_no_shadow_root_found(self, tab):
    method test_bypass_cloudflare_custom_selector_emits_deprecation (line 1296) | async def test_bypass_cloudflare_custom_selector_emits_deprecation(sel...
    method test_time_before_click_emits_deprecation (line 1309) | async def test_time_before_click_emits_deprecation(self, tab):
    method test_expect_bypass_time_before_click_emits_deprecation (line 1322) | async def test_expect_bypass_time_before_click_emits_deprecation(self,...
    method test_expect_bypass_custom_selector_emits_deprecation (line 1342) | async def test_expect_bypass_custom_selector_emits_deprecation(self, t...
    method test_find_cloudflare_shadow_root_polls_until_found (line 1362) | async def test_find_cloudflare_shadow_root_polls_until_found(self, tab):
    method test_find_cloudflare_shadow_root_timeout (line 1395) | async def test_find_cloudflare_shadow_root_timeout(self, tab):
  class TestTabDownload (line 1419) | class TestTabDownload:
    method test_expect_download_keeps_file_when_path_provided (line 1423) | async def test_expect_download_keeps_file_when_path_provided(self, tab...
    method test_expect_download_timeout_raises (line 1470) | async def test_expect_download_timeout_raises(self, tab, tmp_path):
    method test_expect_download_cleans_temp_directory (line 1496) | async def test_expect_download_cleans_temp_directory(self, tab, tmp_pa...
    method test_expect_download_ignores_progress_with_different_guid (line 1538) | async def test_expect_download_ignores_progress_with_different_guid(se...
    method test_expect_download_page_events_auto_enable_disable (line 1588) | async def test_expect_download_page_events_auto_enable_disable(self, t...
    method test_expect_download_keeps_page_events_enabled_when_already_enabled (line 1630) | async def test_expect_download_keeps_page_events_enabled_when_already_...
  class TestTabFrameHandling (line 1672) | class TestTabFrameHandling:
    method test_get_frame_success (line 1676) | async def test_get_frame_success(self, tab, mock_browser):
    method test_get_frame_uses_cache_on_subsequent_calls (line 1694) | async def test_get_frame_uses_cache_on_subsequent_calls(self, tab, moc...
    method test_get_frame_not_iframe (line 1719) | async def test_get_frame_not_iframe(self, tab):
    method test_get_frame_no_frame_id (line 1729) | async def test_get_frame_no_frame_id(self, tab, mock_browser):
  class TestTabUtilityMethods (line 1743) | class TestTabUtilityMethods:
    method test_bring_to_front (line 1747) | async def test_bring_to_front(self, tab):
    method test_close (line 1757) | async def test_close(self, tab, mock_browser):
    method test_wait_page_load_complete (line 1766) | async def test_wait_page_load_complete(self, tab):
    method test_wait_page_load_interactive (line 1784) | async def test_wait_page_load_interactive(self, tab):
    method test_wait_page_load_timeout (line 1804) | async def test_wait_page_load_timeout(self, tab):
    method test_wait_page_load_cleans_up_page_events (line 1814) | async def test_wait_page_load_cleans_up_page_events(self, tab):
    method test_refresh_if_url_not_changed_same_url (line 1831) | async def test_refresh_if_url_not_changed_same_url(self, tab):
    method test_refresh_if_url_not_changed_different_url (line 1852) | async def test_refresh_if_url_not_changed_different_url(self, tab):
  class TestTabRequestManagement (line 1864) | class TestTabRequestManagement:
    method test_continue_request (line 1868) | async def test_continue_request(self, tab):
    method test_fail_request (line 1893) | async def test_fail_request(self, tab):
    method test_fulfill_request (line 1915) | async def test_fulfill_request(self, tab):
    method test_continue_request_with_all_params (line 1940) | async def test_continue_request_with_all_params(self, tab):
    method test_continue_request_with_different_id (line 1977) | async def test_continue_request_with_different_id(self, tab):
    method test_fail_request_with_different_error (line 1991) | async def test_fail_request_with_different_error(self, tab):
    method test_fulfill_request_with_all_params (line 2008) | async def test_fulfill_request_with_all_params(self, tab):
    method test_fulfill_request_with_different_status_code (line 2041) | async def test_fulfill_request_with_different_status_code(self, tab):
    method test_fulfill_request_empty_headers (line 2063) | async def test_fulfill_request_empty_headers(self, tab):
  class TestTabEdgeCases (line 2084) | class TestTabEdgeCases:
    method test_take_screenshot_invalid_extension (line 2088) | async def test_take_screenshot_invalid_extension(self, tab):
    method test_print_to_pdf_with_invalid_path (line 2094) | async def test_print_to_pdf_with_invalid_path(self, tab):
    method test_network_logs_property (line 2106) | async def test_network_logs_property(self, tab):
    method test_dialog_property (line 2115) | async def test_dialog_property(self, tab):
  class TestTabNetworkMethods (line 2124) | class TestTabNetworkMethods:
    method test_get_network_response_body_success (line 2128) | async def test_get_network_response_body_success(self, tab):
    method test_get_network_response_body_events_not_enabled (line 2145) | async def test_get_network_response_body_events_not_enabled(self, tab):
    method test_get_network_logs_success_no_filter (line 2157) | async def test_get_network_logs_success_no_filter(self, tab):
    method test_get_network_logs_success_with_filter (line 2187) | async def test_get_network_logs_success_with_filter(self, tab):
    method test_get_network_logs_empty_filter_result (line 2226) | async def test_get_network_logs_empty_filter_result(self, tab):
    method test_get_network_logs_events_not_enabled (line 2248) | async def test_get_network_logs_events_not_enabled(self, tab):
    method test_get_network_logs_missing_request_params (line 2259) | async def test_get_network_logs_missing_request_params(self, tab):
  class TestTabSaveBundle (line 2289) | class TestTabSaveBundle:
    method _enable_page_events (line 2293) | def _enable_page_events(self, tab):
    method _make_frame_tree (line 2297) | def _make_frame_tree(self, frame_id='F1', page_url='https://example.co...
    method _make_resource (line 2317) | def _make_resource(self, url, rtype='Stylesheet', mime='text/css',
    method test_save_bundle_invalid_extension (line 2327) | async def test_save_bundle_invalid_extension(self, tab):
    method test_save_bundle_separate_assets (line 2332) | async def test_save_bundle_separate_assets(self, tab, tmp_path):
    method test_save_bundle_inline_assets (line 2375) | async def test_save_bundle_inline_assets(self, tab, tmp_path):
    method test_save_bundle_skips_failed_resources (line 2422) | async def test_save_bundle_skips_failed_resources(self, tab, tmp_path):
    method test_save_bundle_handles_fetch_exceptions (line 2446) | async def test_save_bundle_handles_fetch_exceptions(self, tab, tmp_path):
    method test_save_bundle_handles_cdp_error_responses (line 2470) | async def test_save_bundle_handles_cdp_error_responses(self, tab, tmp_...
    method test_save_bundle_empty_resources (line 2494) | async def test_save_bundle_empty_resources(self, tab, tmp_path):
    method test_save_bundle_base64_encoded_resource (line 2513) | async def test_save_bundle_base64_encoded_resource(self, tab, tmp_path):
    method test_save_bundle_css_url_rewriting (line 2541) | async def test_save_bundle_css_url_rewriting(self, tab, tmp_path):
    method test_save_bundle_child_frames (line 2578) | async def test_save_bundle_child_frames(self, tab, tmp_path):
    method test_save_bundle_skips_data_urls (line 2613) | async def test_save_bundle_skips_data_urls(self, tab, tmp_path):
    method test_collect_frame_resources_recursive (line 2634) | def test_collect_frame_resources_recursive(self):
    method test_build_asset_filename (line 2661) | def test_build_asset_filename(self):
    method test_build_asset_filename_no_extension (line 2667) | def test_build_asset_filename_no_extension(self):
    method test_build_asset_filename_no_path (line 2673) | def test_build_asset_filename_no_path(self):
    method test_rewrite_css_urls (line 2679) | def test_rewrite_css_urls(self):
    method test_rewrite_css_urls_relative (line 2691) | def test_rewrite_css_urls_relative(self):
    method test_rewrite_css_urls_skips_data_uris (line 2703) | def test_rewrite_css_urls_skips_data_uris(self):
    method test_save_bundle_js_fallback_when_resource_content_fails (line 2709) | async def test_save_bundle_js_fallback_when_resource_content_fails(sel...

FILE: tests/test_browser/test_har_recorder.py
  function mock_tab (line 15) | async def mock_tab():
  function recorder (line 31) | async def recorder(mock_tab):
  function request_instance (line 37) | async def request_instance(mock_tab):
  function _make_request_will_be_sent_event (line 42) | def _make_request_will_be_sent_event(
  function _make_request_extra_info_event (line 74) | def _make_request_extra_info_event(request_id='req-1'):
  function _make_response_received_event (line 87) | def _make_response_received_event(
  function _make_response_extra_info_event (line 128) | def _make_response_extra_info_event(request_id='req-1'):
  function _make_data_received_event (line 142) | def _make_data_received_event(request_id='req-1', encoded_data_length=500):
  function _make_loading_finished_event (line 155) | def _make_loading_finished_event(request_id='req-1', encoded_data_length...
  function _make_loading_failed_event (line 167) | def _make_loading_failed_event(
  class TestHarRecorderStart (line 183) | class TestHarRecorderStart:
    method test_start_registers_seven_callbacks (line 187) | async def test_start_registers_seven_callbacks(self, recorder, mock_tab):
    method test_start_stores_callback_ids (line 192) | async def test_start_stores_callback_ids(self, recorder, mock_tab):
    method test_start_enables_network_events_if_not_enabled (line 197) | async def test_start_enables_network_events_if_not_enabled(self, recor...
    method test_start_skips_network_enable_if_already_enabled (line 204) | async def test_start_skips_network_enable_if_already_enabled(self, rec...
    method test_start_registers_correct_events (line 211) | async def test_start_registers_correct_events(self, recorder, mock_tab):
    method test_start_sets_start_time (line 223) | async def test_start_sets_start_time(self, recorder, mock_tab):
  class TestHarRecorderStop (line 229) | class TestHarRecorderStop:
    method test_stop_removes_all_callbacks (line 233) | async def test_stop_removes_all_callbacks(self, recorder, mock_tab):
    method test_stop_clears_callback_ids (line 239) | async def test_stop_clears_callback_ids(self, recorder, mock_tab):
    method test_stop_disables_network_events_if_we_enabled (line 245) | async def test_stop_disables_network_events_if_we_enabled(self, record...
    method test_stop_does_not_disable_network_events_if_not_ours (line 252) | async def test_stop_does_not_disable_network_events_if_not_ours(self, ...
    method test_stop_flushes_pending_entries (line 259) | async def test_stop_flushes_pending_entries(self, recorder, mock_tab):
  class TestHarRecorderEventHandlers (line 272) | class TestHarRecorderEventHandlers:
    method test_request_will_be_sent_creates_pending (line 276) | async def test_request_will_be_sent_creates_pending(self, recorder):
    method test_request_extra_info_merges_headers (line 284) | async def test_request_extra_info_merges_headers(self, recorder):
    method test_request_extra_info_skips_unknown_request (line 291) | async def test_request_extra_info_skips_unknown_request(self, recorder):
    method test_response_received_stores_data (line 296) | async def test_response_received_stores_data(self, recorder):
    method test_response_received_skips_unknown_request (line 307) | async def test_response_received_skips_unknown_request(self, recorder):
    method test_response_extra_info_merges_headers (line 312) | async def test_response_extra_info_merges_headers(self, recorder):
    method test_loading_finished_creates_entry (line 318) | async def test_loading_finished_creates_entry(self, recorder, mock_tab):
    method test_loading_finished_skips_unknown_request (line 335) | async def test_loading_finished_skips_unknown_request(self, recorder):
    method test_loading_failed_creates_entry (line 340) | async def test_loading_failed_creates_entry(self, recorder):
    method test_loading_failed_skips_unknown_request (line 350) | async def test_loading_failed_skips_unknown_request(self, recorder):
    method test_redirect_handling (line 355) | async def test_redirect_handling(self, recorder, mock_tab):
  class TestHarRecorderHelpers (line 387) | class TestHarRecorderHelpers:
    method test_headers_dict_to_list (line 390) | def test_headers_dict_to_list(self):
    method test_headers_dict_to_list_empty (line 397) | def test_headers_dict_to_list_empty(self):
    method test_parse_query_string (line 400) | def test_parse_query_string(self):
    method test_parse_query_string_no_query (line 408) | def test_parse_query_string_no_query(self):
    method test_parse_query_string_empty_values (line 411) | def test_parse_query_string_empty_values(self):
    method test_wall_time_to_iso (line 418) | def test_wall_time_to_iso(self):
    method test_wall_time_to_iso_zero (line 423) | def test_wall_time_to_iso_zero(self):
    method test_build_har_timings_none (line 428) | def test_build_har_timings_none(self):
    method test_build_har_timings_with_data (line 438) | def test_build_har_timings_with_data(self):
    method test_build_har_timings_with_receive_ms (line 469) | def test_build_har_timings_with_receive_ms(self):
    method test_build_har_timings_no_ssl (line 497) | def test_build_har_timings_no_ssl(self):
  class TestHarRecorderBuildEntry (line 528) | class TestHarRecorderBuildEntry:
    method test_build_entry_basic (line 532) | async def test_build_entry_basic(self, recorder):
    method test_build_entry_with_post_data (line 550) | async def test_build_entry_with_post_data(self, recorder):
    method test_build_entry_with_response_body (line 570) | async def test_build_entry_with_response_body(self, recorder):
    method test_build_entry_with_base64_body (line 589) | async def test_build_entry_with_base64_body(self, recorder):
    method test_build_entry_with_server_ip (line 607) | async def test_build_entry_with_server_ip(self, recorder):
    method test_build_entry_with_resource_type (line 623) | async def test_build_entry_with_resource_type(self, recorder):
    method test_build_entry_uses_extra_headers_when_available (line 639) | async def test_build_entry_uses_extra_headers_when_available(self, rec...
  class TestHarCapture (line 659) | class TestHarCapture:
    method test_entries_returns_copy (line 663) | async def test_entries_returns_copy(self, recorder):
    method test_to_dict_structure (line 681) | async def test_to_dict_structure(self, recorder):
    method test_to_dict_includes_entries (line 691) | async def test_to_dict_includes_entries(self, recorder):
    method test_save_writes_json_file (line 706) | async def test_save_writes_json_file(self, recorder, tmp_path):
    method test_save_with_string_path (line 727) | async def test_save_with_string_path(self, recorder, tmp_path):
    method test_save_creates_parent_directories (line 734) | async def test_save_creates_parent_directories(self, recorder, tmp_path):
  class TestRequestRecord (line 741) | class TestRequestRecord:
    method test_record_yields_har_recording (line 745) | async def test_record_yields_har_recording(self, request_instance):
    method test_record_enables_network_events (line 750) | async def test_record_enables_network_events(self, request_instance, m...
    method test_record_registers_and_removes_callbacks (line 757) | async def test_record_registers_and_removes_callbacks(self, request_in...
    method test_record_cleans_up_on_exception (line 763) | async def test_record_cleans_up_on_exception(self, request_instance, m...
    method test_record_disables_network_events_if_enabled_by_recorder (line 771) | async def test_record_disables_network_events_if_enabled_by_recorder(
    method test_record_does_not_disable_network_events_if_already_enabled (line 780) | async def test_record_does_not_disable_network_events_if_already_enabled(
  class TestResourceTypeFiltering (line 789) | class TestResourceTypeFiltering:
    method test_filter_skips_non_matching_types (line 793) | async def test_filter_skips_non_matching_types(self, mock_tab):
    method test_filter_accepts_matching_types (line 811) | async def test_filter_accepts_matching_types(self, mock_tab):
    method test_no_filter_accepts_all (line 829) | async def test_no_filter_accepts_all(self, mock_tab):
    method test_record_passes_resource_types (line 846) | async def test_record_passes_resource_types(self, request_instance, mo...
  class TestHarRecorderFetchResponseBody (line 854) | class TestHarRecorderFetchResponseBody:
    method test_fetch_response_body_success (line 858) | async def test_fetch_response_body_success(self, recorder, mock_tab):
    method test_fetch_response_body_base64 (line 867) | async def test_fetch_response_body_base64(self, recorder, mock_tab):
    method test_fetch_response_body_failure (line 876) | async def test_fetch_response_body_failure(self, recorder, mock_tab):
  class TestHarRecorderEndToEnd (line 883) | class TestHarRecorderEndToEnd:
    method test_full_request_lifecycle (line 887) | async def test_full_request_lifecycle(self, recorder, mock_tab):
    method test_multiple_concurrent_requests (line 917) | async def test_multiple_concurrent_requests(self, recorder, mock_tab):
  class TestHarRecorderCookieParsing (line 944) | class TestHarRecorderCookieParsing:
    method test_parse_request_cookies (line 947) | def test_parse_request_cookies(self):
    method test_parse_request_cookies_empty (line 956) | def test_parse_request_cookies_empty(self):
    method test_parse_request_cookies_lowercase_header (line 959) | def test_parse_request_cookies_lowercase_header(self):
    method test_parse_response_cookies (line 965) | def test_parse_response_cookies(self):
    method test_parse_response_cookies_multiple (line 975) | def test_parse_response_cookies_multiple(self):
    method test_parse_response_cookies_empty (line 983) | def test_parse_response_cookies_empty(self):
    method test_parse_response_cookies_with_domain (line 986) | def test_parse_response_cookies_with_domain(self):
  class TestHarRecorderBodySizes (line 994) | class TestHarRecorderBodySizes:
    method test_response_body_size_uses_data_received_bytes (line 998) | async def test_response_body_size_uses_data_received_bytes(self, recor...
    method test_response_body_size_unknown_returns_negative_one (line 1017) | async def test_response_body_size_unknown_returns_negative_one(self, r...
    method test_response_body_size_304_is_zero (line 1033) | async def test_response_body_size_304_is_zero(self, recorder):
    method test_content_size_base64_decoded (line 1050) | async def test_content_size_base64_decoded(self, recorder):
    method test_request_body_size_bytes (line 1071) | async def test_request_body_size_bytes(self, recorder):
  class TestHarRecorderCacheField (line 1089) | class TestHarRecorderCacheField:
    method test_entry_has_cache_field (line 1093) | async def test_entry_has_cache_field(self, recorder):
  class TestHarRecorderCookiesInEntries (line 1109) | class TestHarRecorderCookiesInEntries:
    method test_request_cookies_from_cookie_header (line 1113) | async def test_request_cookies_from_cookie_header(self, recorder):
    method test_response_cookies_from_set_cookie (line 1131) | async def test_response_cookies_from_set_cookie(self, recorder):
  class TestHarRecorderDataReceived (line 1148) | class TestHarRecorderDataReceived:
    method test_data_received_accumulates_bytes (line 1151) | def test_data_received_accumulates_bytes(self, recorder):
    method test_data_received_separate_requests (line 1156) | def test_data_received_separate_requests(self, recorder):
    method test_loading_finished_consumes_data_received (line 1163) | async def test_loading_finished_consumes_data_received(self, recorder,...
    method test_loading_failed_cleans_up_data_received (line 1178) | def test_loading_failed_cleans_up_data_received(self, recorder):
  class TestHarRecorderExtraStatusCode (line 1185) | class TestHarRecorderExtraStatusCode:
    method test_extra_status_code_overrides_response_status (line 1189) | async def test_extra_status_code_overrides_response_status(self, recor...
    method test_normal_status_when_no_extra (line 1217) | async def test_normal_status_when_no_extra(self, recorder, mock_tab):
  class TestHarRecorderReceiveTiming (li
Condensed preview — 464 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,418K chars).
[
  {
    "path": ".github/FUNDING.yml",
    "chars": 69,
    "preview": "# These are supported funding model platforms\ngithub: [thalissonvs]\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 4183,
    "preview": "name: Bug Report\ndescription: Report a bug in pydoll\ntitle: \"[Bug]: \"\nlabels: [\"bug\", \"needs-triage\"]\nbody:\n  - type: ma"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 185,
    "preview": "blank_issues_enabled: true\ncontact_links:\n  - name: Questions & Discussions\n    url: https://github.com/thalissonvs/pydo"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/documentation.yml",
    "chars": 3274,
    "preview": "name: Documentation Issue\ndescription: Report missing, incorrect, or unclear documentation\ntitle: \"[Docs]: \"\nlabels: [\"d"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 2949,
    "preview": "name: Feature Request\ndescription: Suggest a new feature or enhancement for pydoll\ntitle: \"[Feature Request]: \"\nlabels: "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/refactoring.yml",
    "chars": 3554,
    "preview": "name: Refactoring Request\ndescription: Suggest code refactoring to improve pydoll's quality, performance, or maintainabi"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/bug_fix.md",
    "chars": 1787,
    "preview": "# Bug Fix Pull Request\n\n## Related Issue(s)\n<!-- Link the bug report that's being fixed by this PR. Use the format: \"Fix"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/refactoring.md",
    "chars": 1929,
    "preview": "# Refactoring Pull Request\n\n## Refactoring Scope\n<!-- Describe which part of the codebase is being refactored -->\n\n## Re"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/release.md",
    "chars": 1218,
    "preview": "# Release Pull Request\n\n## Version\n<!-- Specify the new version number (e.g., 1.4.0) -->\n\n## Release Date\n<!-- Proposed "
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 2461,
    "preview": "<!-- \nPlease choose the appropriate PR template for your change:\n\nFor bug fixes: .github/PULL_REQUEST_TEMPLATE/bug_fix.m"
  },
  {
    "path": ".github/workflows/deploy-docs.yml",
    "chars": 1046,
    "preview": "name: Deploy site + docs\n\non:\n  push:\n    branches: [main]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      "
  },
  {
    "path": ".github/workflows/mypy.yml",
    "chars": 864,
    "preview": "name: MyPy CI\n\non:\n  push:\n    branches:\n      - '*'         # matches every branch that doesn't contain a '/'\n      - '"
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 689,
    "preview": "name: Publish to PyPI (Poetry)\n\non: workflow_dispatch\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n\n    steps:\n      - na"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 2327,
    "preview": "name: Release\non: workflow_dispatch\n\njobs:\n  version-cz:\n    runs-on: ubuntu-latest\n    name: \"Version CZ\"\n    outputs:\n"
  },
  {
    "path": ".github/workflows/ruff-ci.yml",
    "chars": 773,
    "preview": "name: Ruff CI\n\non:\n  push:\n    branches:\n      - '*'         # matches every branch that doesn't contain a '/'\n      - '"
  },
  {
    "path": ".github/workflows/tests.yml",
    "chars": 1067,
    "preview": "name: PyDoll Tests\n\non:\n  push:\n  pull_request:\n\njobs:\n  tests:\n    strategy:\n      fail-fast: false\n      matrix:\n     "
  },
  {
    "path": ".gitignore",
    "chars": 3146,
    "preview": "__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndo"
  },
  {
    "path": ".python-version",
    "chars": 7,
    "preview": "3.12.5\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 35834,
    "preview": "## 2.21.3 (2026-03-14)\n\n### Fix\n\n- **test**: improve OOPIF integration test reliability\n- **iframe**: resolve nested OOP"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4152,
    "preview": "# Contributing Guide\n\nThank you for your interest in contributing to the project! This document provides guidelines and "
  },
  {
    "path": "LICENSE",
    "chars": 1079,
    "preview": "The MIT License (MIT)\n\nCopyright © 2025 AutoscrapeLabs\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "README.md",
    "chars": 13018,
    "preview": "<p align=\"center\">\n    <img src=\"https://github.com/user-attachments/assets/2c380638-b04a-4b04-b1c8-2958e4237a94\" alt=\"P"
  },
  {
    "path": "README_zh.md",
    "chars": 18994,
    "preview": "<p align=\"center\">\n    <img src=\"https://github.com/user-attachments/assets/219f2dbc-37ed-4aea-a289-ba39cdbb335d\" alt=\"P"
  },
  {
    "path": "SPONSORS.md",
    "chars": 1994,
    "preview": "# Sponsors\n\nPydoll is supported by these amazing sponsors. Their contributions help keep the project maintained and grow"
  },
  {
    "path": "codecov.yml",
    "chars": 110,
    "preview": "coverage:\n  status:\n    project: \n      default:\n        target: 90%\n        threshold: 0%\n        base: auto "
  },
  {
    "path": "cz.yaml",
    "chars": 89,
    "preview": "---\ncommitizen:\n  name: cz_conventional_commits\n  tag_format: $version\n  version: 2.21.3\n"
  },
  {
    "path": "docs/en/api/browser/chrome.md",
    "chars": 145,
    "preview": "# Chrome Browser\n \n::: pydoll.browser.chromium.Chrome\n    options:\n      show_root_heading: true\n      show_source: fals"
  },
  {
    "path": "docs/en/api/browser/edge.md",
    "chars": 141,
    "preview": "# Edge Browser\n \n::: pydoll.browser.chromium.Edge\n    options:\n      show_root_heading: true\n      show_source: false\n  "
  },
  {
    "path": "docs/en/api/browser/managers.md",
    "chars": 2058,
    "preview": "# Browser Managers\n\nThe managers module provides specialized classes for managing different aspects of browser lifecycle"
  },
  {
    "path": "docs/en/api/browser/options.md",
    "chars": 505,
    "preview": "# Browser Options\n\n## ChromiumOptions\n\n::: pydoll.browser.options.ChromiumOptions\n    options:\n      show_root_heading: "
  },
  {
    "path": "docs/en/api/browser/requests.md",
    "chars": 4279,
    "preview": "# Browser Requests\n\nThe requests module provides HTTP request capabilities within the browser context, enabling seamless"
  },
  {
    "path": "docs/en/api/browser/tab.md",
    "chars": 124,
    "preview": "# Tab\n\n::: pydoll.browser.tab.Tab\n    options:\n      show_root_heading: true\n      show_source: false\n      heading_leve"
  },
  {
    "path": "docs/en/api/commands/browser.md",
    "chars": 1234,
    "preview": "# Browser Commands\n\nBrowser commands provide low-level control over browser instances and their configuration.\n\n## Overv"
  },
  {
    "path": "docs/en/api/commands/dom.md",
    "chars": 1997,
    "preview": "# DOM Commands\n\nDOM commands provide comprehensive functionality for interacting with the Document Object Model of web p"
  },
  {
    "path": "docs/en/api/commands/fetch.md",
    "chars": 4144,
    "preview": "# Fetch Commands\n\nFetch commands provide advanced network request handling and interception capabilities using the Fetch"
  },
  {
    "path": "docs/en/api/commands/index.md",
    "chars": 2464,
    "preview": "# Commands Overview\n\nThe Commands module provides high-level interfaces for interacting with Chrome DevTools Protocol (C"
  },
  {
    "path": "docs/en/api/commands/input.md",
    "chars": 2026,
    "preview": "# Input Commands\n\nInput commands handle mouse and keyboard interactions, providing human-like input simulation.\n\n## Over"
  },
  {
    "path": "docs/en/api/commands/network.md",
    "chars": 2976,
    "preview": "# Network Commands\n\nNetwork commands provide comprehensive control over network requests, responses, and browser network"
  },
  {
    "path": "docs/en/api/commands/page.md",
    "chars": 2928,
    "preview": "# Page Commands\n\nPage commands handle page navigation, lifecycle events, and page-level operations.\n\n## Overview\n\nThe pa"
  },
  {
    "path": "docs/en/api/commands/runtime.md",
    "chars": 2800,
    "preview": "# Runtime Commands\n\nRuntime commands provide JavaScript execution capabilities and runtime environment management.\n\n## O"
  },
  {
    "path": "docs/en/api/commands/storage.md",
    "chars": 3753,
    "preview": "# Storage Commands\n\nStorage commands provide comprehensive browser storage management including cookies, localStorage, s"
  },
  {
    "path": "docs/en/api/commands/target.md",
    "chars": 4334,
    "preview": "# Target Commands\n\nTarget commands manage browser targets including tabs, windows, and other browsing contexts.\n\n## Over"
  },
  {
    "path": "docs/en/api/connection/connection.md",
    "chars": 171,
    "preview": "# Connection Handler\n\n::: pydoll.connection.connection_handler.ConnectionHandler\n    options:\n      show_root_heading: t"
  },
  {
    "path": "docs/en/api/connection/managers.md",
    "chars": 368,
    "preview": "# Connection Managers\n\n## CommandsManager\n\n::: pydoll.connection.managers.commands_manager.CommandsManager\n    options:\n"
  },
  {
    "path": "docs/en/api/core/constants.md",
    "chars": 278,
    "preview": "# Constants\n\nThis section documents all constants, enums, and configuration values used throughout Pydoll.\n\n::: pydoll.c"
  },
  {
    "path": "docs/en/api/core/exceptions.md",
    "chars": 272,
    "preview": "# Exceptions\n\nThis section documents all custom exceptions that can be raised by Pydoll operations.\n\n::: pydoll.exceptio"
  },
  {
    "path": "docs/en/api/core/utils.md",
    "chars": 264,
    "preview": "# Utilities\n\nThis section documents utility functions and helper classes used throughout Pydoll.\n\n::: pydoll.utils\n    o"
  },
  {
    "path": "docs/en/api/elements/mixins.md",
    "chars": 1358,
    "preview": "# Element Mixins\n\nThe mixins module provides reusable functionality that can be mixed into element classes to extend the"
  },
  {
    "path": "docs/en/api/elements/shadow_root.md",
    "chars": 206,
    "preview": "# ShadowRoot\n\n::: pydoll.elements.shadow_root.ShadowRoot\n    options:\n      show_root_heading: true\n      show_source: f"
  },
  {
    "path": "docs/en/api/elements/web_element.md",
    "chars": 206,
    "preview": "# WebElement\n\n::: pydoll.elements.web_element.WebElement\n    options:\n      show_root_heading: true\n      show_source: f"
  },
  {
    "path": "docs/en/api/index.md",
    "chars": 5228,
    "preview": "# API Reference\n\nWelcome to the Pydoll API Reference! This section provides comprehensive documentation for all classes,"
  },
  {
    "path": "docs/en/api/protocol/base.md",
    "chars": 332,
    "preview": "# Protocol Base Types\n\nBase types and structures for Chrome DevTools Protocol commands, responses, and events.\n\n## Base "
  },
  {
    "path": "docs/en/api/protocol/browser.md",
    "chars": 507,
    "preview": "# Browser Protocol\n\nBrowser domain commands, events and types for Chrome DevTools Protocol.\n\n## Methods\n\n::: pydoll.prot"
  },
  {
    "path": "docs/en/api/protocol/dom.md",
    "chars": 478,
    "preview": "# DOM Protocol\n\nDOM domain commands and events for Chrome DevTools Protocol.\n\n## Methods\n\n::: pydoll.protocol.dom.method"
  },
  {
    "path": "docs/en/api/protocol/fetch.md",
    "chars": 495,
    "preview": "# Fetch Protocol\n\nFetch domain commands, events and types for Chrome DevTools Protocol.\n\n## Methods\n\n::: pydoll.protocol"
  },
  {
    "path": "docs/en/api/protocol/input.md",
    "chars": 495,
    "preview": "# Input Protocol\n\nInput domain commands, events and types for Chrome DevTools Protocol.\n\n## Methods\n\n::: pydoll.protocol"
  },
  {
    "path": "docs/en/api/protocol/network.md",
    "chars": 501,
    "preview": "# Network Protocol\n\nNetwork domain commands and events for Chrome DevTools Protocol.\n\n## Methods\n\n::: pydoll.protocol.ne"
  },
  {
    "path": "docs/en/api/protocol/page.md",
    "chars": 490,
    "preview": "# Page Protocol\n\nPage domain commands, events and types for Chrome DevTools Protocol.\n\n## Methods\n\n::: pydoll.protocol.p"
  },
  {
    "path": "docs/en/api/protocol/runtime.md",
    "chars": 505,
    "preview": "# Runtime Protocol\n\nRuntime domain commands, events and types for Chrome DevTools Protocol.\n\n## Methods\n\n::: pydoll.prot"
  },
  {
    "path": "docs/en/api/protocol/storage.md",
    "chars": 505,
    "preview": "# Storage Protocol\n\nStorage domain commands, events and types for Chrome DevTools Protocol.\n\n## Methods\n\n::: pydoll.prot"
  },
  {
    "path": "docs/en/api/protocol/target.md",
    "chars": 493,
    "preview": "# Target Protocol\n\nTarget domain commands and events for Chrome DevTools Protocol.\n\n## Methods\n\n::: pydoll.protocol.targ"
  },
  {
    "path": "docs/en/deep-dive/architecture/browser-domain.md",
    "chars": 27799,
    "preview": "# Browser Domain Architecture\n\nThe Browser domain represents the highest level of Pydoll's automation hierarchy, managin"
  },
  {
    "path": "docs/en/deep-dive/architecture/browser-requests-architecture.md",
    "chars": 17332,
    "preview": "# Browser-Context Requests Architecture\n\nThis document explores the architectural design of Pydoll's browser-context HTT"
  },
  {
    "path": "docs/en/deep-dive/architecture/event-architecture.md",
    "chars": 17026,
    "preview": "# Event System Architecture\n\nThis document explores the internal architecture of Pydoll's event system, covering WebSock"
  },
  {
    "path": "docs/en/deep-dive/architecture/find-elements-mixin.md",
    "chars": 16357,
    "preview": "# FindElements Mixin Architecture\n\nThe FindElementsMixin represents a critical architectural decision in Pydoll: using *"
  },
  {
    "path": "docs/en/deep-dive/architecture/index.md",
    "chars": 12644,
    "preview": "# Internal Architecture\n\n**Understand the design, then break the rules intentionally.**\n\nMost documentation shows you **"
  },
  {
    "path": "docs/en/deep-dive/architecture/shadow-dom.md",
    "chars": 24601,
    "preview": "# Shadow DOM Architecture\n\nThe Shadow DOM is one of the most challenging aspects of modern web automation. Elements insi"
  },
  {
    "path": "docs/en/deep-dive/architecture/tab-domain.md",
    "chars": 18237,
    "preview": "# Tab Domain Architecture\n\nThe Tab domain is Pydoll's primary interface for browser automation, acting as an orchestrati"
  },
  {
    "path": "docs/en/deep-dive/architecture/webelement-domain.md",
    "chars": 12032,
    "preview": "# WebElement Domain Architecture\n\nThe WebElement domain bridges high-level automation code and low-level DOM interaction"
  },
  {
    "path": "docs/en/deep-dive/fingerprinting/behavioral-fingerprinting.md",
    "chars": 18692,
    "preview": "# Behavioral Fingerprinting\n\nBehavioral fingerprinting analyzes how users interact with web applications rather than wha"
  },
  {
    "path": "docs/en/deep-dive/fingerprinting/browser-fingerprinting.md",
    "chars": 18017,
    "preview": "# Browser Fingerprinting\n\nBrowser fingerprinting identifies clients by analyzing properties exposed through JavaScript A"
  },
  {
    "path": "docs/en/deep-dive/fingerprinting/evasion-techniques.md",
    "chars": 15500,
    "preview": "# Evasion Techniques\n\nThis document covers practical techniques for evading fingerprinting detection using Pydoll. The p"
  },
  {
    "path": "docs/en/deep-dive/fingerprinting/index.md",
    "chars": 8997,
    "preview": "# Browser & Network Fingerprinting\n\nThis module covers browser and network fingerprinting, a critical aspect of modern w"
  },
  {
    "path": "docs/en/deep-dive/fingerprinting/network-fingerprinting.md",
    "chars": 14731,
    "preview": "# Network Fingerprinting\n\nNetwork fingerprinting identifies clients by analyzing characteristics of the TCP/IP stack, TL"
  },
  {
    "path": "docs/en/deep-dive/fundamentals/cdp.md",
    "chars": 9262,
    "preview": "# Chrome DevTools Protocol (CDP)\n\nThe Chrome DevTools Protocol (CDP) is the foundation that enables Pydoll to control br"
  },
  {
    "path": "docs/en/deep-dive/fundamentals/connection-layer.md",
    "chars": 18294,
    "preview": "# Connection Handler\n\nThe Connection Handler is the foundational layer of Pydoll's architecture, serving as the bridge b"
  },
  {
    "path": "docs/en/deep-dive/fundamentals/iframes-and-contexts.md",
    "chars": 51135,
    "preview": "# Iframes, OOPIFs and Execution Contexts (Deep Dive)\n\nUnderstanding how browser automation handles iframes is critical f"
  },
  {
    "path": "docs/en/deep-dive/fundamentals/index.md",
    "chars": 10391,
    "preview": "# Core Fundamentals\n\n**Master the foundation, everything else becomes easier.**\n\nThis section covers the **bedrock techn"
  },
  {
    "path": "docs/en/deep-dive/fundamentals/typing-system.md",
    "chars": 18244,
    "preview": "# Python's Type System & Pydoll\n\nPydoll leverages Python's type system extensively to provide excellent IDE support, cat"
  },
  {
    "path": "docs/en/deep-dive/guides/index.md",
    "chars": 7822,
    "preview": "# Practical Guides\n\n**Theory meets practice, actionable patterns for real automation challenges.**\n\nWhile the other Deep"
  },
  {
    "path": "docs/en/deep-dive/guides/selectors-guide.md",
    "chars": 25695,
    "preview": "# CSS Selectors vs XPath: A Complete Guide\n\nWhen using the `query()` method, you have two powerful selector languages at"
  },
  {
    "path": "docs/en/deep-dive/index.md",
    "chars": 11622,
    "preview": "# Deep Dive: Technical Foundation\n\n**Welcome to the technical heart of Pydoll, where we explore the systems and protocol"
  },
  {
    "path": "docs/en/deep-dive/network/build-proxy.md",
    "chars": 21592,
    "preview": "# Building Proxy Servers\n\nThis document implements HTTP and SOCKS5 proxy servers from scratch in Python using asyncio. T"
  },
  {
    "path": "docs/en/deep-dive/network/http-proxies.md",
    "chars": 23255,
    "preview": "# HTTP/HTTPS Proxy Architecture\n\nHTTP proxies are the most common proxy protocol on the internet. Nearly every corporate"
  },
  {
    "path": "docs/en/deep-dive/network/index.md",
    "chars": 11391,
    "preview": "# Network & Security Deep Dive\n\n**Welcome to the foundation of modern internet communication, the battleground of anonym"
  },
  {
    "path": "docs/en/deep-dive/network/network-fundamentals.md",
    "chars": 29185,
    "preview": "# Network Fundamentals\n\nThis document covers the foundational network protocols that power the internet and how they can"
  },
  {
    "path": "docs/en/deep-dive/network/proxy-detection.md",
    "chars": 16310,
    "preview": "# Proxy Detection\n\nProxy detection is a probabilistic process. Websites combine dozens of signals to assess whether a co"
  },
  {
    "path": "docs/en/deep-dive/network/proxy-legal.md",
    "chars": 8929,
    "preview": "# Legal and Ethical Considerations\n\nThis document provides **general information** about the legal and ethical landscape"
  },
  {
    "path": "docs/en/deep-dive/network/socks-proxies.md",
    "chars": 22586,
    "preview": "# SOCKS Protocol Architecture\n\nSOCKS (SOCKet Secure) is a proxying protocol that operates between the transport and appl"
  },
  {
    "path": "docs/en/features/advanced/behavioral-captcha-bypass.md",
    "chars": 14053,
    "preview": "# Cloudflare Turnstile Interaction\n\nPydoll provides native support for interacting with Cloudflare Turnstile captchas by"
  },
  {
    "path": "docs/en/features/advanced/decorators.md",
    "chars": 21916,
    "preview": "# Retry Decorator\n\nWeb scraping is inherently unpredictable. Networks fail, pages load slowly, elements appear and disap"
  },
  {
    "path": "docs/en/features/advanced/event-system.md",
    "chars": 19827,
    "preview": "# Event System\n\nPydoll's event system allows you to listen and react to browser activities in real-time. This is essenti"
  },
  {
    "path": "docs/en/features/advanced/remote-connections.md",
    "chars": 18254,
    "preview": "# Remote Connections & Hybrid Automation\n\nPydoll allows you to connect to already-running browsers via WebSocket, enabli"
  },
  {
    "path": "docs/en/features/automation/file-operations.md",
    "chars": 10430,
    "preview": "# File Operations\n\nFile uploads are one of the most challenging aspects of browser automation. Traditional tools often s"
  },
  {
    "path": "docs/en/features/automation/human-interactions.md",
    "chars": 28379,
    "preview": "# Human-Like Interactions\n\nOne of the key differentiators between successful automation and easily-detected bots is how "
  },
  {
    "path": "docs/en/features/automation/iframes.md",
    "chars": 7055,
    "preview": "# Working with IFrames\n\nModern web pages embed content from other documents using `<iframe>`. In previous versions of Py"
  },
  {
    "path": "docs/en/features/automation/keyboard-control.md",
    "chars": 16169,
    "preview": "# Keyboard Control\n\nThe Keyboard API provides complete control over keyboard input at the page level, enabling you to si"
  },
  {
    "path": "docs/en/features/automation/mouse-control.md",
    "chars": 9456,
    "preview": "# Mouse Control\n\nThe Mouse API provides complete control over mouse input at the page level, enabling you to simulate re"
  },
  {
    "path": "docs/en/features/automation/screenshots-and-pdfs.md",
    "chars": 11986,
    "preview": "# Screenshots and PDFs\n\nPydoll provides powerful screenshot and PDF generation capabilities through direct Chrome DevToo"
  },
  {
    "path": "docs/en/features/browser-management/contexts.md",
    "chars": 25811,
    "preview": "# Browser Contexts\n\nBrowser Contexts are Pydoll's solution for creating completely isolated browsing environments within"
  },
  {
    "path": "docs/en/features/browser-management/cookies-sessions.md",
    "chars": 21235,
    "preview": "# Cookies & Sessions\n\nManaging cookies and sessions effectively is crucial for realistic browser automation. Websites us"
  },
  {
    "path": "docs/en/features/browser-management/tabs.md",
    "chars": 24170,
    "preview": "# Multi-Tab Management\n\nPydoll provides sophisticated multi-tab capabilities that enable complex automation workflows sp"
  },
  {
    "path": "docs/en/features/configuration/browser-options.md",
    "chars": 25787,
    "preview": "# Browser Options (ChromiumOptions)\n\n`ChromiumOptions` is your central configuration hub for customizing browser behavio"
  },
  {
    "path": "docs/en/features/configuration/browser-preferences.md",
    "chars": 49309,
    "preview": "# Custom Browser Preferences\n\nOne of Pydoll's most powerful features is direct access to Chromium's internal preference "
  },
  {
    "path": "docs/en/features/configuration/proxy.md",
    "chars": 19956,
    "preview": "# Proxy Configuration\n\nProxies are essential for professional web automation, enabling you to bypass rate limits, access"
  },
  {
    "path": "docs/en/features/core-concepts.md",
    "chars": 18322,
    "preview": "# Core Concepts\n\nUnderstanding what makes Pydoll different starts with its foundational design decisions. These aren't j"
  },
  {
    "path": "docs/en/features/element-finding.md",
    "chars": 35738,
    "preview": "# Element Finding\n\nFinding elements on a web page is the foundation of browser automation. Pydoll introduces a revolutio"
  },
  {
    "path": "docs/en/features/index.md",
    "chars": 7756,
    "preview": "# Features Guide\n\nWelcome to Pydoll's comprehensive features documentation! This is where you'll discover everything tha"
  },
  {
    "path": "docs/en/features/network/http-requests.md",
    "chars": 16605,
    "preview": "# Browser-Context HTTP Requests\n\nMake HTTP requests that automatically inherit your browser's session state, cookies, an"
  },
  {
    "path": "docs/en/features/network/interception.md",
    "chars": 24573,
    "preview": "# Request Interception\n\nRequest interception allows you to intercept, modify, block, or mock HTTP requests and responses"
  },
  {
    "path": "docs/en/features/network/monitoring.md",
    "chars": 21624,
    "preview": "# Network Monitoring\n\nNetwork monitoring in Pydoll allows you to observe and analyze HTTP requests, responses, and other"
  },
  {
    "path": "docs/en/features/network/network-recording.md",
    "chars": 5108,
    "preview": "# HAR Network Recording\n\nCapture all network activity during a browser session and export it as a standard HAR (HTTP Arc"
  },
  {
    "path": "docs/en/index.md",
    "chars": 13630,
    "preview": "<p align=\"center\">\n    <img src=\"resources/images/logo.png\" alt=\"Pydoll Logo\" /> <br><br>\n</p>\n\n<p align=\"center\">\n    <"
  },
  {
    "path": "docs/pt/api/browser/chrome.md",
    "chars": 144,
    "preview": "# Brower Chrome\n \n::: pydoll.browser.chromium.Chrome\n    options:\n      show_root_heading: true\n      show_source: false"
  },
  {
    "path": "docs/pt/api/browser/edge.md",
    "chars": 140,
    "preview": "# Brower Edge\n \n::: pydoll.browser.chromium.Edge\n    options:\n      show_root_heading: true\n      show_source: false\n   "
  },
  {
    "path": "docs/pt/api/browser/managers.md",
    "chars": 2267,
    "preview": "# Gerenciadores do Navegador\n\nO módulo de gerenciadores (managers) fornece classes especializadas para gerenciar diferen"
  },
  {
    "path": "docs/pt/api/browser/options.md",
    "chars": 506,
    "preview": "# Browser Options\n\n## ChromiumOptions\n\n::: pydoll.browser.options.ChromiumOptions\n    options:\n      show_root_heading: "
  },
  {
    "path": "docs/pt/api/browser/requests.md",
    "chars": 4600,
    "preview": "# Requisições do Navegador\n\nO módulo de requisições (requests) fornece capacidades de requisição HTTP dentro do contexto"
  },
  {
    "path": "docs/pt/api/browser/tab.md",
    "chars": 124,
    "preview": "# Tab\n\n::: pydoll.browser.tab.Tab\n    options:\n      show_root_heading: true\n      show_source: false\n      heading_leve"
  },
  {
    "path": "docs/pt/api/commands/browser.md",
    "chars": 1395,
    "preview": "# Comandos do Navegador\n\nOs comandos do navegador fornecem controle de baixo nível sobre as instâncias do navegador e su"
  },
  {
    "path": "docs/pt/api/commands/dom.md",
    "chars": 2192,
    "preview": "# Comandos DOM\n\nOs comandos DOM fornecem funcionalidade abrangente para interagir com o Document Object Model (Modelo de"
  },
  {
    "path": "docs/pt/api/commands/fetch.md",
    "chars": 4622,
    "preview": "# Comandos Fetch\n\nOs comandos Fetch fornecem capacidades avançadas de manipulação e interceptação de requisições de rede"
  },
  {
    "path": "docs/pt/api/commands/index.md",
    "chars": 2846,
    "preview": "# Visão Geral dos Comandos\n\nO módulo de Comandos (Commands) fornece interfaces de alto nível para interagir com os domín"
  },
  {
    "path": "docs/pt/api/commands/input.md",
    "chars": 2353,
    "preview": "# Comandos de Entrada (Input)\n\nOs comandos de entrada lidam com interações de mouse e teclado, fornecendo simulação de e"
  },
  {
    "path": "docs/pt/api/commands/network.md",
    "chars": 3313,
    "preview": "# Comandos de Rede (Network)\n\nOs comandos de rede fornecem controle abrangente sobre requisições de rede, respostas e co"
  },
  {
    "path": "docs/pt/api/commands/page.md",
    "chars": 3397,
    "preview": "# Comandos de Página (Page)\n\nOs comandos de página lidam com a navegação da página, eventos do ciclo de vida e operações"
  },
  {
    "path": "docs/pt/api/commands/runtime.md",
    "chars": 3217,
    "preview": "# Comandos de Tempo de Execução (Runtime)\n\nOs comandos de tempo de execução fornecem capacidades de execução de JavaScri"
  },
  {
    "path": "docs/pt/api/commands/storage.md",
    "chars": 4198,
    "preview": "# Comandos de Armazenamento (Storage)\n\nOs comandos de armazenamento fornecem gerenciamento abrangente do armazenamento d"
  },
  {
    "path": "docs/pt/api/commands/target.md",
    "chars": 4701,
    "preview": "# Comandos de Alvo (Target)\n\nOs comandos de alvo (Target) gerenciam os alvos do navegador, incluindo abas, janelas e out"
  },
  {
    "path": "docs/pt/api/connection/connection.md",
    "chars": 171,
    "preview": "# Connection Handler\n\n::: pydoll.connection.connection_handler.ConnectionHandler\n    options:\n      show_root_heading: t"
  },
  {
    "path": "docs/pt/api/connection/managers.md",
    "chars": 368,
    "preview": "# Connection Managers\n\n## CommandsManager\n\n::: pydoll.connection.managers.commands_manager.CommandsManager\n    options:\n"
  },
  {
    "path": "docs/pt/api/core/constants.md",
    "chars": 277,
    "preview": "# Constants\n\nO módulo de constantes fornece valores predefinidos e configurações padrão para o navegador.\n\n::: pydoll.co"
  },
  {
    "path": "docs/pt/api/core/exceptions.md",
    "chars": 297,
    "preview": "# Exceptions\n\nO módulo de exceções fornece classes de exceção personalizadas que podem ser lançadas por operações do Pyd"
  },
  {
    "path": "docs/pt/api/core/utils.md",
    "chars": 266,
    "preview": "# Utilities\n\nO módulo de utilitários fornece funções e classes auxiliares usadas em todo o Pydoll.\n\n::: pydoll.utils\n   "
  },
  {
    "path": "docs/pt/api/elements/mixins.md",
    "chars": 1481,
    "preview": "# Mixins de Elementos\n\nO módulo de mixins (mixins) fornece funcionalidade reutilizável que pode ser misturada em classes"
  },
  {
    "path": "docs/pt/api/elements/shadow_root.md",
    "chars": 206,
    "preview": "# ShadowRoot\n\n::: pydoll.elements.shadow_root.ShadowRoot\n    options:\n      show_root_heading: true\n      show_source: f"
  },
  {
    "path": "docs/pt/api/elements/web_element.md",
    "chars": 206,
    "preview": "# WebElement\n\n::: pydoll.elements.web_element.WebElement\n    options:\n      show_root_heading: true\n      show_source: f"
  },
  {
    "path": "docs/pt/api/index.md",
    "chars": 5697,
    "preview": "# Referência da API\n\nBem-vindo à Referência da API do Pydoll! Esta seção fornece documentação abrangente para todas as c"
  },
  {
    "path": "docs/pt/api/protocol/base.md",
    "chars": 332,
    "preview": "# Protocol Base Types\n\nTipos e estruturas base para comandos, respostas e eventos do Chrome DevTools Protocol.\n\n## Base "
  },
  {
    "path": "docs/pt/api/protocol/browser.md",
    "chars": 512,
    "preview": "# Protocolo do Navegador\n\nDomínio de comandos, eventos e tipos para o Chrome DevTools Protocol.\n\n## Métodos\n\n::: pydoll."
  },
  {
    "path": "docs/pt/api/protocol/dom.md",
    "chars": 482,
    "preview": "# Protocolo DOM\n\nDomínio de comandos e eventos para o Chrome DevTools Protocol.\n\n## Métodos\n\n::: pydoll.protocol.dom.met"
  },
  {
    "path": "docs/pt/api/protocol/fetch.md",
    "chars": 497,
    "preview": "# Protocolo Fetch\n\nDomínio de comandos, eventos e tipos para o Chrome DevTools Protocol.\n\n## Métodos\n\n::: pydoll.protoco"
  },
  {
    "path": "docs/pt/api/protocol/input.md",
    "chars": 497,
    "preview": "# Protocolo Input\n\nDomínio de comandos, eventos e tipos para o Chrome DevTools Protocol.\n\n## Métodos\n\n::: pydoll.protoco"
  },
  {
    "path": "docs/pt/api/protocol/network.md",
    "chars": 508,
    "preview": "# Protocolo Network\n\nDomínio de comandos, eventos e tipos para o Chrome DevTools Protocol.\n\n## Métodos\n\n::: pydoll.proto"
  },
  {
    "path": "docs/pt/api/protocol/page.md",
    "chars": 493,
    "preview": "# Protocolo Page\n\nDomínio de comandos, eventos e tipos para o Chrome DevTools Protocol.\n\n## Métodos\n\n::: pydoll.protocol"
  },
  {
    "path": "docs/pt/api/protocol/runtime.md",
    "chars": 505,
    "preview": "# Protocolo Runtime\n\nDomínio de comandos, eventos e tipos para o Chrome DevTools Protocol.\n\n## Métodos\n\n::: pydoll.proto"
  },
  {
    "path": "docs/pt/api/protocol/storage.md",
    "chars": 505,
    "preview": "# Protocolo Storage\n\nDomínio de comandos, eventos e tipos para o Chrome DevTools Protocol.\n\n## Métodos\n\n::: pydoll.proto"
  },
  {
    "path": "docs/pt/api/protocol/target.md",
    "chars": 494,
    "preview": "# Protocolo Target\n\nDomínio de comandos e eventos para o Chrome DevTools Protocol.\n\n## Métodos\n\n::: pydoll.protocol.targ"
  },
  {
    "path": "docs/pt/deep-dive/architecture/browser-domain.md",
    "chars": 30906,
    "preview": "# Arquitetura do Domínio do Navegador\n\nO domínio do Navegador (Browser) representa o nível mais alto da hierarquia de au"
  },
  {
    "path": "docs/pt/deep-dive/architecture/browser-requests-architecture.md",
    "chars": 19199,
    "preview": "# Arquitetura de Requisições no Contexto do Navegador\n\nEste documento explora o design arquitetural do sistema de requis"
  },
  {
    "path": "docs/pt/deep-dive/architecture/event-architecture.md",
    "chars": 19145,
    "preview": "# Arquitetura do Sistema de Eventos\n\nEste documento explora a arquitetura interna do sistema de eventos do Pydoll, cobri"
  },
  {
    "path": "docs/pt/deep-dive/architecture/find-elements-mixin.md",
    "chars": 17607,
    "preview": "# Arquitetura do Mixin FindElements\n\nO FindElementsMixin representa uma decisão arquitetural crítica no Pydoll: usar **c"
  },
  {
    "path": "docs/pt/deep-dive/architecture/index.md",
    "chars": 14429,
    "preview": "# Arquitetura Interna\n\n**Entenda o design, depois quebre as regras intencionalmente.**\n\nA maioria da documentação mostra"
  },
  {
    "path": "docs/pt/deep-dive/architecture/shadow-dom.md",
    "chars": 25546,
    "preview": "# Arquitetura do Shadow DOM\n\nO Shadow DOM e um dos aspectos mais desafiadores da automacao web moderna. Elementos dentro"
  },
  {
    "path": "docs/pt/deep-dive/architecture/tab-domain.md",
    "chars": 20698,
    "preview": "# Arquitetura do Domínio da Aba (Tab)\n\nO domínio da Aba (Tab) é a interface principal do Pydoll para automação de navega"
  },
  {
    "path": "docs/pt/deep-dive/architecture/webelement-domain.md",
    "chars": 13510,
    "preview": "# Arquitetura do Domínio WebElement\n\nO domínio WebElement faz a ponte entre o código de automação de alto nível e a inte"
  },
  {
    "path": "docs/pt/deep-dive/fingerprinting/behavioral-fingerprinting.md",
    "chars": 20231,
    "preview": "# Fingerprinting Comportamental\n\nO fingerprinting comportamental analisa como os usuários interagem com aplicações web, "
  },
  {
    "path": "docs/pt/deep-dive/fingerprinting/browser-fingerprinting.md",
    "chars": 18736,
    "preview": "# Browser Fingerprinting\n\nO browser fingerprinting identifica clientes analisando propriedades expostas através de APIs "
  },
  {
    "path": "docs/pt/deep-dive/fingerprinting/evasion-techniques.md",
    "chars": 16251,
    "preview": "# Técnicas de Evasão\n\nEste documento cobre técnicas práticas para evadir detecção de fingerprinting usando o Pydoll. As "
  },
  {
    "path": "docs/pt/deep-dive/fingerprinting/index.md",
    "chars": 10174,
    "preview": "# Análise Profunda de Fingerprinting de Navegador e Rede\n\nEste módulo cobre fingerprinting de navegador e rede, um aspec"
  },
  {
    "path": "docs/pt/deep-dive/fingerprinting/network-fingerprinting.md",
    "chars": 15206,
    "preview": "# Network Fingerprinting\n\nO network fingerprinting identifica clientes analisando características da pilha TCP/IP, hands"
  },
  {
    "path": "docs/pt/deep-dive/fundamentals/cdp.md",
    "chars": 10217,
    "preview": "# Chrome DevTools Protocol (CDP)\n\nO Chrome DevTools Protocol (CDP) é a fundação que permite ao Pydoll controlar navegado"
  },
  {
    "path": "docs/pt/deep-dive/fundamentals/connection-layer.md",
    "chars": 19253,
    "preview": "# Connection Handler (Gerenciador de Conexão)\n\nO Connection Handler é a camada fundamental da arquitetura do Pydoll, ser"
  },
  {
    "path": "docs/pt/deep-dive/fundamentals/iframes-and-contexts.md",
    "chars": 53460,
    "preview": "# Iframes, OOPIFs e Contextos de Execução (Análise Aprofundada)\n\nEntender como a automação de navegador lida com iframes"
  },
  {
    "path": "docs/pt/deep-dive/fundamentals/index.md",
    "chars": 11420,
    "preview": "# Análise Profunda: Fundamentos Essenciais\n\n**Domine a base, e todo o resto se torna mais fácil.**\n\nEsta seção cobre as "
  },
  {
    "path": "docs/pt/deep-dive/fundamentals/typing-system.md",
    "chars": 19386,
    "preview": "# O Sistema de Tipos do Python e o Pydoll\n\nO Pydoll utiliza extensivamente o sistema de tipos do Python para fornecer ex"
  },
  {
    "path": "docs/pt/deep-dive/guides/index.md",
    "chars": 8600,
    "preview": "# Guias Práticos\n\n**A teoria encontra a prática, padrões acionáveis para desafios reais de automação.**\n\nEnquanto as out"
  },
  {
    "path": "docs/pt/deep-dive/guides/selectors-guide.md",
    "chars": 26943,
    "preview": "# Seletores CSS vs XPath: Um Guia Completo\n\nAo usar o método `query()`, você tem duas poderosas linguagens de seletores "
  },
  {
    "path": "docs/pt/deep-dive/index.md",
    "chars": 12577,
    "preview": "# Análise Profunda: Fundamentos Técnicos\n\n**Bem-vindo ao coração técnico do Pydoll, onde exploramos os sistemas e protoc"
  },
  {
    "path": "docs/pt/deep-dive/network/build-proxy.md",
    "chars": 22182,
    "preview": "# Construindo Servidores Proxy\n\nEste documento implementa servidores proxy HTTP e SOCKS5 do zero em Python usando asynci"
  },
  {
    "path": "docs/pt/deep-dive/network/http-proxies.md",
    "chars": 24437,
    "preview": "# Arquitetura de Proxy HTTP/HTTPS\n\nProxies HTTP são o protocolo de proxy mais comum na internet. Quase toda rede corpora"
  },
  {
    "path": "docs/pt/deep-dive/network/index.md",
    "chars": 12303,
    "preview": "# Análise Profunda de Rede e Segurança\n\n**Bem-vindo ao fundamento da comunicação moderna da internet, o campo de batalha"
  },
  {
    "path": "docs/pt/deep-dive/network/network-fundamentals.md",
    "chars": 31230,
    "preview": "# Fundamentos de Rede\n\nEste documento cobre os protocolos de rede fundamentais que alimentam a internet e como eles pode"
  },
  {
    "path": "docs/pt/deep-dive/network/proxy-detection.md",
    "chars": 17747,
    "preview": "# Detecção de Proxy\n\nA detecção de proxy é um processo probabilístico. Sites combinam dezenas de sinais para avaliar se "
  },
  {
    "path": "docs/pt/deep-dive/network/proxy-legal.md",
    "chars": 9684,
    "preview": "# Considerações Legais e Éticas\n\nEste documento fornece **informações gerais** sobre o cenário legal e ético do uso de p"
  },
  {
    "path": "docs/pt/deep-dive/network/socks-proxies.md",
    "chars": 23596,
    "preview": "# Arquitetura do Protocolo SOCKS\n\nSOCKS (SOCKet Secure) é um protocolo de proxy que opera entre as camadas de transporte"
  },
  {
    "path": "docs/pt/features/advanced/behavioral-captcha-bypass.md",
    "chars": 14776,
    "preview": "# Interação com Cloudflare Turnstile\n\nO Pydoll oferece suporte nativo para interagir com captchas Cloudflare Turnstile r"
  },
  {
    "path": "docs/pt/features/advanced/decorators.md",
    "chars": 22842,
    "preview": "# Decorator Retry\n\nWeb scraping é inerentemente imprevisível. Redes falham, páginas carregam lentamente, elementos apare"
  },
  {
    "path": "docs/pt/features/advanced/event-system.md",
    "chars": 20886,
    "preview": "# Sistema de Eventos\n\nO sistema de eventos do Pydoll permite que você ouça e reaja às atividades do navegador em tempo r"
  },
  {
    "path": "docs/pt/features/advanced/remote-connections.md",
    "chars": 19098,
    "preview": "# Conexões Remotas e Automação Híbrida\n\nO Pydoll permite que você se conecte a navegadores já em execução via WebSocket,"
  },
  {
    "path": "docs/pt/features/automation/file-operations.md",
    "chars": 11468,
    "preview": "# Operações com Arquivos\n\nUploads de arquivos são um dos aspectos mais desafiadores da automação de navegadores. Ferrame"
  },
  {
    "path": "docs/pt/features/automation/human-interactions.md",
    "chars": 30011,
    "preview": "# Interações Semelhantes a Humanas\n\nUm dos principais diferenciais entre uma automação bem-sucedida e bots facilmente de"
  },
  {
    "path": "docs/pt/features/automation/iframes.md",
    "chars": 7196,
    "preview": "# Trabalhando com IFrames\n\nPáginas modernas usam `<iframe>` para embutir outros documentos. Nas versões antigas do Pydol"
  },
  {
    "path": "docs/pt/features/automation/keyboard-control.md",
    "chars": 17219,
    "preview": "# Controle de Teclado\n\nA API de Teclado fornece controle completo sobre a entrada de teclado no nível da página, permiti"
  },
  {
    "path": "docs/pt/features/automation/mouse-control.md",
    "chars": 10246,
    "preview": "# Controle do Mouse\n\nA API de Mouse fornece controle completo sobre a entrada do mouse no nível da página, permitindo si"
  },
  {
    "path": "docs/pt/features/automation/screenshots-and-pdfs.md",
    "chars": 12484,
    "preview": "# Capturas de Tela (Screenshots) e PDFs\n\nO Pydoll oferece poderosas capacidades de captura de tela e geração de PDF atra"
  },
  {
    "path": "docs/pt/features/browser-management/contexts.md",
    "chars": 26833,
    "preview": "# Contextos de Navegador (Browser Contexts)\n\nContextos de Navegador são a solução do Pydoll para criar ambientes de nave"
  },
  {
    "path": "docs/pt/features/browser-management/cookies-sessions.md",
    "chars": 22416,
    "preview": "# Cookies e Sessões\n\nGerenciar cookies e sessões de forma eficaz é crucial para uma automação de navegador realista. Os "
  },
  {
    "path": "docs/pt/features/browser-management/tabs.md",
    "chars": 25496,
    "preview": "# Gerenciamento de Múltiplas Abas\n\nO Pydoll oferece capacidades sofisticadas de múltiplas abas que permitem fluxos de tr"
  },
  {
    "path": "docs/pt/features/configuration/browser-options.md",
    "chars": 27660,
    "preview": "# Opções do Navegador (ChromiumOptions)\n\n`ChromiumOptions` é seu hub central de configuração para personalizar o comport"
  },
  {
    "path": "docs/pt/features/configuration/browser-preferences.md",
    "chars": 52433,
    "preview": "# Preferências Personalizadas do Navegador\n\nUma das funcionalidades mais poderosas do Pydoll é o acesso direto ao sistem"
  },
  {
    "path": "docs/pt/features/configuration/proxy.md",
    "chars": 21044,
    "preview": "# Configuração de Proxy\n\nProxies são essenciais para a automação web profissional, permitindo contornar limites de requi"
  },
  {
    "path": "docs/pt/features/core-concepts.md",
    "chars": 20163,
    "preview": "# Conceitos Principais\n\nEntender o que torna o Pydoll diferente começa com suas decisões fundamentais de design. Estas n"
  },
  {
    "path": "docs/pt/features/element-finding.md",
    "chars": 37568,
    "preview": "# Localização de Elementos\n\nEncontrar elementos em uma página web é a base da automação de navegadores. O Pydoll introdu"
  },
  {
    "path": "docs/pt/features/index.md",
    "chars": 8762,
    "preview": "# Guia de Funcionalidades\n\nBem-vindo à documentação abrangente de funcionalidades do Pydoll! Aqui você descobrirá tudo o"
  },
  {
    "path": "docs/pt/features/network/http-requests.md",
    "chars": 17641,
    "preview": "# Requisições HTTP no Contexto do Navegador\n\nFaça requisições HTTP que herdam automaticamente o estado de sessão, cookie"
  },
  {
    "path": "docs/pt/features/network/interception.md",
    "chars": 25754,
    "preview": "# Interceptação de Requisições\n\nA interceptação de requisições permite que você intercepte, modifique, bloqueie ou simul"
  },
  {
    "path": "docs/pt/features/network/monitoring.md",
    "chars": 22549,
    "preview": "# Monitoramento de Rede\n\nO monitoramento de rede no Pydoll permite observar e analisar requisições HTTP, respostas e out"
  },
  {
    "path": "docs/pt/features/network/network-recording.md",
    "chars": 5405,
    "preview": "# Gravacao de Rede HAR\n\nCapture toda a atividade de rede durante uma sessao do navegador e exporte como um arquivo HAR ("
  },
  {
    "path": "docs/pt/index.md",
    "chars": 14373,
    "preview": "<p align=\"center\">\n    <img src=\"../resources/images/logo.png\" alt=\"Pydoll Logo\" /> <br><br>\n</p>\n\n<p align=\"center\">\n  "
  }
]

// ... and 264 more files (download for full content)

About this extraction

This page contains the full source code of the autoscrape-labs/pydoll GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 464 files (5.0 MB), approximately 1.3M tokens, and a symbol index with 3939 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!