cdpify 0.3.0__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cdpify-0.3.0 → cdpify-0.4.0}/PKG-INFO +160 -34
- {cdpify-0.3.0 → cdpify-0.4.0}/README.md +319 -195
- cdpify-0.4.0/cdpify/__init__.py +38 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/client.py +190 -160
- cdpify-0.4.0/cdpify/codec.py +236 -0
- cdpify-0.4.0/cdpify/domains/__init__.py +198 -0
- cdpify-0.4.0/cdpify/domains/accessibility/__init__.py +103 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/accessibility/commands.py +9 -9
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/accessibility/events.py +8 -3
- cdpify-0.4.0/cdpify/domains/accessibility/types.py +227 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/accessors.py +193 -62
- cdpify-0.4.0/cdpify/domains/ads/__init__.py +37 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/ads/commands.py +1 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/ads/types.py +1 -1
- cdpify-0.4.0/cdpify/domains/animation/__init__.py +94 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/animation/commands.py +13 -8
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/animation/domain.py +7 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/animation/events.py +14 -5
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/animation/types.py +15 -19
- cdpify-0.4.0/cdpify/domains/audits/__init__.py +299 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/audits/commands.py +3 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/audits/events.py +5 -2
- cdpify-0.4.0/cdpify/domains/audits/types.py +1195 -0
- cdpify-0.4.0/cdpify/domains/autofill/__init__.py +58 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/autofill/commands.py +5 -4
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/autofill/domain.py +2 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/autofill/events.py +3 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/autofill/types.py +19 -16
- cdpify-0.4.0/cdpify/domains/backgroundservice/__init__.py +63 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/backgroundservice/commands.py +4 -4
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/backgroundservice/events.py +10 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/backgroundservice/types.py +19 -18
- cdpify-0.4.0/cdpify/domains/bluetoothemulation/__init__.py +146 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/bluetoothemulation/commands.py +17 -17
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/bluetoothemulation/events.py +19 -6
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/bluetoothemulation/types.py +62 -41
- cdpify-0.4.0/cdpify/domains/browser/__init__.py +142 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/browser/commands.py +38 -28
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/browser/domain.py +19 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/browser/events.py +9 -7
- cdpify-0.4.0/cdpify/domains/browser/types.py +143 -0
- cdpify-0.4.0/cdpify/domains/cachestorage/__init__.py +72 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/cachestorage/commands.py +3 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/cachestorage/types.py +17 -11
- cdpify-0.4.0/cdpify/domains/cast/__init__.py +53 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/cast/events.py +6 -1
- {cdpify-0.3.0/cdpify/domains/digitalcredentials → cdpify-0.4.0/cdpify/domains/cast}/types.py +7 -5
- cdpify-0.4.0/cdpify/domains/console/__init__.py +34 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/console/events.py +5 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/console/types.py +7 -11
- cdpify-0.4.0/cdpify/domains/crashreportcontext/__init__.py +31 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/crashreportcontext/commands.py +2 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/crashreportcontext/types.py +2 -2
- cdpify-0.4.0/cdpify/domains/css/__init__.py +407 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/css/commands.py +51 -44
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/css/domain.py +18 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/css/events.py +14 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/css/types.py +129 -145
- cdpify-0.4.0/cdpify/domains/debugger/__init__.py +245 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/debugger/commands.py +31 -38
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/debugger/domain.py +5 -4
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/debugger/events.py +19 -13
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/debugger/types.py +25 -24
- cdpify-0.4.0/cdpify/domains/deviceaccess/__init__.py +42 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/deviceaccess/commands.py +2 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/deviceaccess/events.py +8 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/deviceaccess/types.py +5 -5
- cdpify-0.4.0/cdpify/domains/deviceorientation/__init__.py +31 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/deviceorientation/commands.py +4 -4
- cdpify-0.4.0/cdpify/domains/digitalcredentials/__init__.py +34 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/digitalcredentials/commands.py +3 -5
- cdpify-0.4.0/cdpify/domains/digitalcredentials/types.py +18 -0
- cdpify-0.4.0/cdpify/domains/dom/__init__.py +431 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/dom/commands.py +77 -41
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/dom/domain.py +63 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/dom/events.py +45 -8
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/dom/types.py +121 -98
- cdpify-0.4.0/cdpify/domains/domdebugger/__init__.py +80 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/domdebugger/commands.py +7 -7
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/domdebugger/domain.py +2 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/domdebugger/types.py +22 -19
- cdpify-0.4.0/cdpify/domains/domsnapshot/__init__.py +87 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/domsnapshot/commands.py +2 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/domsnapshot/domain.py +1 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/domsnapshot/types.py +22 -27
- cdpify-0.4.0/cdpify/domains/domstorage/__init__.py +67 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/domstorage/commands.py +4 -4
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/domstorage/events.py +12 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/domstorage/types.py +2 -3
- cdpify-0.4.0/cdpify/domains/emulation/__init__.py +311 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/emulation/commands.py +67 -73
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/emulation/domain.py +7 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/emulation/events.py +8 -5
- cdpify-0.4.0/cdpify/domains/emulation/types.py +217 -0
- cdpify-0.4.0/cdpify/domains/eventbreakpoints/__init__.py +40 -0
- cdpify-0.4.0/cdpify/domains/extensions/__init__.py +63 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/extensions/commands.py +13 -13
- cdpify-0.4.0/cdpify/domains/extensions/types.py +33 -0
- cdpify-0.4.0/cdpify/domains/fedcm/__init__.py +67 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/fedcm/events.py +8 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/fedcm/types.py +40 -20
- cdpify-0.4.0/cdpify/domains/fetch/__init__.py +91 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/fetch/commands.py +7 -11
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/fetch/events.py +7 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/fetch/types.py +21 -20
- cdpify-0.4.0/cdpify/domains/filesystem/__init__.py +37 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/filesystem/commands.py +1 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/filesystem/types.py +4 -4
- cdpify-0.4.0/cdpify/domains/findinpage/__init__.py +28 -0
- cdpify-0.4.0/cdpify/domains/findinpage/commands.py +25 -0
- cdpify-0.4.0/cdpify/domains/findinpage/domain.py +69 -0
- cdpify-0.4.0/cdpify/domains/headlessexperimental/__init__.py +37 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/headlessexperimental/commands.py +2 -4
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/headlessexperimental/domain.py +2 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/headlessexperimental/types.py +2 -4
- cdpify-0.4.0/cdpify/domains/heapprofiler/__init__.py +101 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/heapprofiler/commands.py +3 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/heapprofiler/events.py +19 -6
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/heapprofiler/types.py +7 -7
- cdpify-0.4.0/cdpify/domains/indexeddb/__init__.py +87 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/indexeddb/types.py +18 -20
- cdpify-0.4.0/cdpify/domains/input/__init__.py +92 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/input/commands.py +43 -61
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/input/events.py +5 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/input/types.py +25 -13
- cdpify-0.4.0/cdpify/domains/inspector/__init__.py +43 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/inspector/events.py +8 -5
- cdpify-0.4.0/cdpify/domains/io/__init__.py +46 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/io/commands.py +7 -7
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/io/domain.py +2 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/io/types.py +1 -1
- cdpify-0.4.0/cdpify/domains/layertree/__init__.py +97 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/layertree/commands.py +3 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/layertree/events.py +7 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/layertree/types.py +13 -17
- cdpify-0.4.0/cdpify/domains/log/__init__.py +38 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/log/commands.py +2 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/log/events.py +5 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/log/types.py +9 -19
- cdpify-0.4.0/cdpify/domains/media/__init__.py +72 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/media/events.py +16 -5
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/media/types.py +14 -16
- cdpify-0.4.0/cdpify/domains/memory/__init__.py +84 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/memory/commands.py +8 -8
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/memory/types.py +20 -15
- cdpify-0.4.0/cdpify/domains/network/__init__.py +641 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/network/commands.py +42 -46
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/network/domain.py +5 -5
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/network/events.py +193 -92
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/network/types.py +557 -493
- cdpify-0.4.0/cdpify/domains/overlay/__init__.py +269 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/overlay/commands.py +22 -22
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/overlay/domain.py +3 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/overlay/events.py +15 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/overlay/types.py +71 -19
- cdpify-0.4.0/cdpify/domains/page/__init__.py +578 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/page/commands.py +109 -83
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/page/domain.py +77 -14
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/page/events.py +86 -44
- cdpify-0.4.0/cdpify/domains/page/types.py +945 -0
- cdpify-0.4.0/cdpify/domains/performance/__init__.py +45 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/performance/commands.py +1 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/performance/domain.py +1 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/performance/events.py +6 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/performance/types.py +3 -3
- cdpify-0.4.0/cdpify/domains/performancetimeline/__init__.py +47 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/performancetimeline/events.py +7 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/performancetimeline/types.py +8 -8
- cdpify-0.4.0/cdpify/domains/preload/__init__.py +93 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/preload/events.py +24 -5
- cdpify-0.4.0/cdpify/domains/preload/types.py +316 -0
- cdpify-0.4.0/cdpify/domains/profiler/__init__.py +83 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/profiler/commands.py +7 -7
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/profiler/events.py +18 -11
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/profiler/types.py +10 -10
- cdpify-0.4.0/cdpify/domains/pwa/__init__.py +65 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/pwa/commands.py +2 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/pwa/types.py +11 -7
- cdpify-0.4.0/cdpify/domains/runtime/__init__.py +215 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/runtime/commands.py +19 -21
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/runtime/events.py +27 -15
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/runtime/types.py +56 -78
- cdpify-0.4.0/cdpify/domains/schema/__init__.py +31 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/schema/commands.py +2 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/schema/types.py +3 -3
- cdpify-0.4.0/cdpify/domains/security/__init__.py +92 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/security/commands.py +3 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/security/domain.py +2 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/security/events.py +11 -4
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/security/types.py +45 -31
- cdpify-0.4.0/cdpify/domains/serviceworker/__init__.py +113 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/serviceworker/commands.py +6 -6
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/serviceworker/events.py +14 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/serviceworker/types.py +34 -24
- cdpify-0.4.0/cdpify/domains/smartcardemulation/__init__.py +146 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/smartcardemulation/commands.py +7 -7
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/smartcardemulation/events.py +73 -16
- cdpify-0.4.0/cdpify/domains/smartcardemulation/types.py +139 -0
- cdpify-0.4.0/cdpify/domains/storage/__init__.py +233 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/storage/commands.py +62 -21
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/storage/domain.py +77 -16
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/storage/events.py +31 -4
- cdpify-0.4.0/cdpify/domains/storage/types.py +97 -0
- cdpify-0.4.0/cdpify/domains/systeminfo/__init__.py +72 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/systeminfo/commands.py +1 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/systeminfo/types.py +28 -17
- cdpify-0.4.0/cdpify/domains/target/__init__.py +158 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/target/commands.py +18 -18
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/target/domain.py +1 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/target/events.py +17 -2
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/target/types.py +23 -17
- cdpify-0.4.0/cdpify/domains/tethering/__init__.py +35 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/tethering/commands.py +3 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/tethering/events.py +4 -1
- cdpify-0.4.0/cdpify/domains/tracing/__init__.py +80 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/tracing/commands.py +6 -8
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/tracing/events.py +10 -6
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/tracing/types.py +42 -23
- cdpify-0.4.0/cdpify/domains/webaudio/__init__.py +118 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webaudio/events.py +34 -5
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webaudio/types.py +51 -25
- cdpify-0.4.0/cdpify/domains/webauthn/__init__.py +116 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webauthn/commands.py +6 -6
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webauthn/domain.py +1 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webauthn/events.py +12 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webauthn/types.py +28 -13
- cdpify-0.4.0/cdpify/domains/webmcp/__init__.py +68 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webmcp/commands.py +1 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webmcp/events.py +15 -9
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webmcp/types.py +17 -15
- cdpify-0.4.0/cdpify/event_queue.py +57 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/events/__init__.py +11 -9
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/events/dispatcher.py +21 -3
- cdpify-0.4.0/cdpify/events/router.py +149 -0
- cdpify-0.4.0/cdpify/events/source.py +36 -0
- cdpify-0.4.0/cdpify/events/subscription.py +106 -0
- cdpify-0.4.0/cdpify/exceptions.py +74 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/commands.py +9 -3
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/domain.py +14 -5
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/events.py +11 -4
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/init.py +103 -83
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/types.py +32 -12
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/utils.py +17 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/views.py +23 -2
- cdpify-0.4.0/cdpify/generator/templates/accessors.py.jinja2 +30 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/templates/commands.py.jinja2 +1 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/templates/domain.py.jinja2 +2 -2
- cdpify-0.4.0/cdpify/generator/templates/domain_init.py.jinja2 +35 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/templates/events.py.jinja2 +40 -40
- cdpify-0.4.0/cdpify/generator/templates/root_init.py.jinja2 +26 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/templates/types.py.jinja2 +12 -2
- cdpify-0.4.0/cdpify/py.typed +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/session.py +40 -54
- cdpify-0.4.0/cdpify/shared/decorators.py +53 -0
- cdpify-0.4.0/cdpify/shared/enums.py +17 -0
- cdpify-0.4.0/cdpify/shared/lazy.py +35 -0
- cdpify-0.4.0/cdpify/transport.py +52 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/transports/websocket.py +313 -256
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify.egg-info/PKG-INFO +160 -34
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify.egg-info/SOURCES.txt +13 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify.egg-info/requires.txt +3 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/pyproject.toml +5 -1
- {cdpify-0.3.0 → cdpify-0.4.0}/tests/test_client.py +303 -239
- {cdpify-0.3.0 → cdpify-0.4.0}/tests/test_codec.py +59 -0
- cdpify-0.4.0/tests/test_decorators_and_exceptions.py +93 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/tests/test_dependency_boundaries.py +20 -2
- cdpify-0.4.0/tests/test_enums.py +117 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/tests/test_event_dispatcher.py +2 -1
- cdpify-0.4.0/tests/test_event_subscription.py +331 -0
- cdpify-0.4.0/tests/test_lazy_imports.py +75 -0
- cdpify-0.4.0/tests/test_models.py +144 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/tests/test_session.py +143 -140
- cdpify-0.4.0/tests/test_websocket_client.py +168 -0
- cdpify-0.4.0/tests/test_websocket_transport.py +379 -0
- cdpify-0.3.0/cdpify/__init__.py +0 -27
- cdpify-0.3.0/cdpify/codec.py +0 -183
- cdpify-0.3.0/cdpify/domains/__init__.py +0 -125
- cdpify-0.3.0/cdpify/domains/accessibility/__init__.py +0 -65
- cdpify-0.3.0/cdpify/domains/accessibility/types.py +0 -223
- cdpify-0.3.0/cdpify/domains/ads/__init__.py +0 -19
- cdpify-0.3.0/cdpify/domains/animation/__init__.py +0 -61
- cdpify-0.3.0/cdpify/domains/audits/__init__.py +0 -160
- cdpify-0.3.0/cdpify/domains/audits/types.py +0 -1092
- cdpify-0.3.0/cdpify/domains/autofill/__init__.py +0 -34
- cdpify-0.3.0/cdpify/domains/backgroundservice/__init__.py +0 -37
- cdpify-0.3.0/cdpify/domains/bluetoothemulation/__init__.py +0 -79
- cdpify-0.3.0/cdpify/domains/browser/__init__.py +0 -87
- cdpify-0.3.0/cdpify/domains/browser/types.py +0 -129
- cdpify-0.3.0/cdpify/domains/cachestorage/__init__.py +0 -45
- cdpify-0.3.0/cdpify/domains/cast/__init__.py +0 -31
- cdpify-0.3.0/cdpify/domains/cast/types.py +0 -14
- cdpify-0.3.0/cdpify/domains/console/__init__.py +0 -18
- cdpify-0.3.0/cdpify/domains/crashreportcontext/__init__.py +0 -16
- cdpify-0.3.0/cdpify/domains/css/__init__.py +0 -247
- cdpify-0.3.0/cdpify/domains/debugger/__init__.py +0 -147
- cdpify-0.3.0/cdpify/domains/deviceaccess/__init__.py +0 -22
- cdpify-0.3.0/cdpify/domains/deviceorientation/__init__.py +0 -14
- cdpify-0.3.0/cdpify/domains/digitalcredentials/__init__.py +0 -16
- cdpify-0.3.0/cdpify/domains/dom/__init__.py +0 -249
- cdpify-0.3.0/cdpify/domains/domdebugger/__init__.py +0 -41
- cdpify-0.3.0/cdpify/domains/domsnapshot/__init__.py +0 -55
- cdpify-0.3.0/cdpify/domains/domstorage/__init__.py +0 -41
- cdpify-0.3.0/cdpify/domains/emulation/__init__.py +0 -161
- cdpify-0.3.0/cdpify/domains/emulation/types.py +0 -211
- cdpify-0.3.0/cdpify/domains/eventbreakpoints/__init__.py +0 -19
- cdpify-0.3.0/cdpify/domains/extensions/__init__.py +0 -38
- cdpify-0.3.0/cdpify/domains/extensions/types.py +0 -26
- cdpify-0.3.0/cdpify/domains/fedcm/__init__.py +0 -41
- cdpify-0.3.0/cdpify/domains/fetch/__init__.py +0 -53
- cdpify-0.3.0/cdpify/domains/filesystem/__init__.py +0 -19
- cdpify-0.3.0/cdpify/domains/headlessexperimental/__init__.py +0 -17
- cdpify-0.3.0/cdpify/domains/heapprofiler/__init__.py +0 -61
- cdpify-0.3.0/cdpify/domains/indexeddb/__init__.py +0 -53
- cdpify-0.3.0/cdpify/domains/input/__init__.py +0 -56
- cdpify-0.3.0/cdpify/domains/inspector/__init__.py +0 -25
- cdpify-0.3.0/cdpify/domains/io/__init__.py +0 -27
- cdpify-0.3.0/cdpify/domains/layertree/__init__.py +0 -61
- cdpify-0.3.0/cdpify/domains/log/__init__.py +0 -20
- cdpify-0.3.0/cdpify/domains/media/__init__.py +0 -45
- cdpify-0.3.0/cdpify/domains/memory/__init__.py +0 -43
- cdpify-0.3.0/cdpify/domains/network/__init__.py +0 -371
- cdpify-0.3.0/cdpify/domains/overlay/__init__.py +0 -141
- cdpify-0.3.0/cdpify/domains/page/__init__.py +0 -325
- cdpify-0.3.0/cdpify/domains/page/types.py +0 -883
- cdpify-0.3.0/cdpify/domains/performance/__init__.py +0 -26
- cdpify-0.3.0/cdpify/domains/performancetimeline/__init__.py +0 -27
- cdpify-0.3.0/cdpify/domains/preload/__init__.py +0 -55
- cdpify-0.3.0/cdpify/domains/preload/types.py +0 -250
- cdpify-0.3.0/cdpify/domains/profiler/__init__.py +0 -51
- cdpify-0.3.0/cdpify/domains/pwa/__init__.py +0 -39
- cdpify-0.3.0/cdpify/domains/runtime/__init__.py +0 -137
- cdpify-0.3.0/cdpify/domains/schema/__init__.py +0 -16
- cdpify-0.3.0/cdpify/domains/security/__init__.py +0 -53
- cdpify-0.3.0/cdpify/domains/serviceworker/__init__.py +0 -67
- cdpify-0.3.0/cdpify/domains/smartcardemulation/__init__.py +0 -87
- cdpify-0.3.0/cdpify/domains/smartcardemulation/types.py +0 -116
- cdpify-0.3.0/cdpify/domains/storage/__init__.py +0 -105
- cdpify-0.3.0/cdpify/domains/storage/types.py +0 -80
- cdpify-0.3.0/cdpify/domains/systeminfo/__init__.py +0 -41
- cdpify-0.3.0/cdpify/domains/target/__init__.py +0 -103
- cdpify-0.3.0/cdpify/domains/tethering/__init__.py +0 -18
- cdpify-0.3.0/cdpify/domains/tracing/__init__.py +0 -51
- cdpify-0.3.0/cdpify/domains/webaudio/__init__.py +0 -73
- cdpify-0.3.0/cdpify/domains/webauthn/__init__.py +0 -71
- cdpify-0.3.0/cdpify/domains/webmcp/__init__.py +0 -43
- cdpify-0.3.0/cdpify/events/router.py +0 -91
- cdpify-0.3.0/cdpify/exceptions.py +0 -18
- cdpify-0.3.0/cdpify/generator/templates/accessors.py.jinja2 +0 -17
- cdpify-0.3.0/cdpify/generator/templates/domain_init.py.jinja2 +0 -22
- cdpify-0.3.0/cdpify/generator/templates/root_init.py.jinja2 +0 -9
- cdpify-0.3.0/cdpify/shared/decorators.py +0 -27
- cdpify-0.3.0/cdpify/transport.py +0 -29
- cdpify-0.3.0/tests/test_decorators_and_exceptions.py +0 -42
- cdpify-0.3.0/tests/test_models.py +0 -59
- cdpify-0.3.0/tests/test_websocket_transport.py +0 -161
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/accessibility/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/ads/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/audits/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/backgroundservice/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/bluetoothemulation/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/cachestorage/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/cast/commands.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/cast/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/console/commands.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/console/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/crashreportcontext/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/deviceaccess/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/deviceorientation/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/digitalcredentials/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/domstorage/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/eventbreakpoints/commands.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/eventbreakpoints/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/extensions/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/fedcm/commands.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/fedcm/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/fetch/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/filesystem/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/heapprofiler/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/indexeddb/commands.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/indexeddb/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/input/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/inspector/commands.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/inspector/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/layertree/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/log/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/media/commands.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/media/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/memory/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/performancetimeline/commands.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/performancetimeline/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/preload/commands.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/preload/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/profiler/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/pwa/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/runtime/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/schema/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/serviceworker/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/smartcardemulation/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/systeminfo/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/tethering/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/tracing/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webaudio/commands.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webaudio/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/domains/webmcp/domain.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/executor.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/__main__.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/downloader.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/formatting.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generator.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/__init__.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/accessors.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/constants.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/generators/context.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/rendering.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/generator/schemas.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/shared/naming.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify/transports/__init__.py +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify.egg-info/dependency_links.txt +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/cdpify.egg-info/top_level.txt +0 -0
- {cdpify-0.3.0 → cdpify-0.4.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cdpify
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: A Python client for the Chrome DevTools Protocol (CDP) optimized for DX.
|
|
5
5
|
Classifier: Programming Language :: Python :: 3
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -8,6 +8,8 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
8
8
|
Classifier: Programming Language :: Python :: 3.14
|
|
9
9
|
Requires-Python: >=3.12
|
|
10
10
|
Description-Content-Type: text/markdown
|
|
11
|
+
Provides-Extra: orjson
|
|
12
|
+
Requires-Dist: orjson>=3.11.3; extra == "orjson"
|
|
11
13
|
Provides-Extra: websocket
|
|
12
14
|
Requires-Dist: websockets>=15.0.1; extra == "websocket"
|
|
13
15
|
Provides-Extra: generator
|
|
@@ -40,7 +42,7 @@ without working with raw JSON messages.
|
|
|
40
42
|
|
|
41
43
|
- **Typed by default** — generated models for commands, results, events, and
|
|
42
44
|
shared protocol types
|
|
43
|
-
- **Complete domain coverage** — access all
|
|
45
|
+
- **Complete domain coverage** — access all 59 generated CDP domains through
|
|
44
46
|
properties such as `client.page`, `client.network`, and `client.runtime`
|
|
45
47
|
- **Async throughout** — transport-neutral core with an optional WebSocket
|
|
46
48
|
implementation
|
|
@@ -56,9 +58,19 @@ pip install "cdpify[websocket]"
|
|
|
56
58
|
```
|
|
57
59
|
|
|
58
60
|
Requires Python 3.12 or newer. The WebSocket extra provides the recommended
|
|
59
|
-
default transport used by `
|
|
61
|
+
default transport used by `CdpClient(url)`. Install `cdpify` without an extra when
|
|
60
62
|
supplying your own `Transport` implementation.
|
|
61
63
|
|
|
64
|
+
For faster JSON encoding and decoding in the WebSocket transport, install the
|
|
65
|
+
optional `orjson` extra as well:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
pip install "cdpify[websocket,orjson]"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The transport automatically uses `orjson` when available and otherwise uses
|
|
72
|
+
Python's standard `json` module. Outgoing WebSocket messages remain text frames.
|
|
73
|
+
|
|
62
74
|
Install the generator dependencies only when regenerating protocol modules:
|
|
63
75
|
|
|
64
76
|
```bash
|
|
@@ -75,7 +87,7 @@ import asyncio
|
|
|
75
87
|
import json
|
|
76
88
|
from urllib.request import urlopen
|
|
77
89
|
|
|
78
|
-
from cdpify import
|
|
90
|
+
from cdpify import CdpClient
|
|
79
91
|
|
|
80
92
|
|
|
81
93
|
def get_websocket_url() -> str:
|
|
@@ -86,7 +98,7 @@ def get_websocket_url() -> str:
|
|
|
86
98
|
async def main() -> None:
|
|
87
99
|
ws_url = get_websocket_url()
|
|
88
100
|
|
|
89
|
-
async with
|
|
101
|
+
async with CdpClient(ws_url) as client:
|
|
90
102
|
await client.page.navigate(url="https://example.com")
|
|
91
103
|
|
|
92
104
|
result = await client.runtime.evaluate(
|
|
@@ -99,14 +111,34 @@ async def main() -> None:
|
|
|
99
111
|
asyncio.run(main())
|
|
100
112
|
```
|
|
101
113
|
|
|
102
|
-
Domains are available as lazy properties on `
|
|
114
|
+
Domains are available as lazy properties on `CdpClient`. Parameters use
|
|
103
115
|
Python's `snake_case`; `cdpify` handles conversion to and from CDP's wire format.
|
|
104
116
|
|
|
117
|
+
Named protocol enums use `StrEnum`, so typed code can use constants such as
|
|
118
|
+
`ResourceType.FETCH` or `CookieOperation.SET_COOKIE`. Decoded responses and
|
|
119
|
+
events contain enum members, including in nested models and lists:
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
from cdpify.domains.network import LoadingFailedEvent, NetworkEvent, ResourceType
|
|
123
|
+
|
|
124
|
+
async for event in client.listen(LoadingFailedEvent):
|
|
125
|
+
assert event.__cdp_event__ is NetworkEvent.LOADING_FAILED
|
|
126
|
+
if event.type is ResourceType.FETCH:
|
|
127
|
+
print(event.error_text)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Enum members work as strings and expose the original protocol value through
|
|
131
|
+
`.value`. Unknown values from newer Chrome versions are preserved as members
|
|
132
|
+
of the same enum without changing its declared constants or iteration.
|
|
133
|
+
Anonymous enum annotations such as `Literal["jpeg", "png"]` still accept direct
|
|
134
|
+
strings. Open string fields, including EventSource's server-defined
|
|
135
|
+
`event_name`, remain strings.
|
|
136
|
+
|
|
105
137
|
## Supported domains
|
|
106
138
|
|
|
107
|
-
The generated client currently includes all
|
|
108
|
-
specifications. Each domain is available as a lazy property on `
|
|
109
|
-
`
|
|
139
|
+
The generated client currently includes all 59 domains from the bundled CDP
|
|
140
|
+
specifications. Each domain is available as a lazy property on `CdpClient` and
|
|
141
|
+
`CdpSession`:
|
|
110
142
|
|
|
111
143
|
| CDP domain | Python accessor | CDP domain | Python accessor |
|
|
112
144
|
| --- | --- | --- | --- |
|
|
@@ -137,37 +169,50 @@ specifications. Each domain is available as a lazy property on `Client` and
|
|
|
137
169
|
| `FedCm` | `client.fed_cm` | `Tethering` | `client.tethering` |
|
|
138
170
|
| `Fetch` | `client.fetch` | `Tracing` | `client.tracing` |
|
|
139
171
|
| `FileSystem` | `client.file_system` | `WebAudio` | `client.web_audio` |
|
|
140
|
-
| `
|
|
141
|
-
| `
|
|
172
|
+
| `FindInPage` | `client.find_in_page` | `WebAuthn` | `client.web_authn` |
|
|
173
|
+
| `HeadlessExperimental` | `client.headless_experimental` | `WebMCP` | `client.web_mcp` |
|
|
174
|
+
| `HeapProfiler` | `client.heap_profiler` | | |
|
|
142
175
|
|
|
143
176
|
## Listening for events
|
|
144
177
|
|
|
145
|
-
|
|
178
|
+
Pass a generated event class to `listen()`. The returned subscription is an
|
|
179
|
+
async iterator of typed events:
|
|
146
180
|
|
|
147
181
|
```python
|
|
148
|
-
from cdpify.domains.network.events import
|
|
182
|
+
from cdpify.domains.network.events import RequestWillBeSentEvent
|
|
149
183
|
|
|
150
184
|
|
|
151
185
|
await client.network.enable()
|
|
152
186
|
|
|
153
|
-
async for event in client.listen(
|
|
154
|
-
event_name=NetworkEvent.REQUEST_WILL_BE_SENT,
|
|
155
|
-
event_type=RequestWillBeSentEvent,
|
|
156
|
-
):
|
|
187
|
+
async for event in client.listen(RequestWillBeSentEvent):
|
|
157
188
|
print(event.request.method, event.request.url)
|
|
158
189
|
```
|
|
159
190
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
191
|
+
The subscription is registered as soon as `listen()` is called, and events are
|
|
192
|
+
buffered until you read them. To wait for an event that your own command
|
|
193
|
+
triggers, subscribe first and then send the command:
|
|
194
|
+
|
|
195
|
+
```python
|
|
196
|
+
from cdpify.domains.page.events import LoadEventFiredEvent
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
async with client.listen(LoadEventFiredEvent) as events:
|
|
200
|
+
await client.page.navigate(url="https://example.com")
|
|
201
|
+
await events.next(timeout=10)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Leaving the `async with` block unsubscribes. A stream also ends when the client
|
|
205
|
+
disconnects; `events.next()` then raises `CDPStreamClosedError`. The optional
|
|
206
|
+
`timeout` on `listen()` limits how long each read waits and raises
|
|
207
|
+
`TimeoutError` when it expires.
|
|
208
|
+
|
|
209
|
+
`client.listen()` yields only events from the root connection. A session view
|
|
210
|
+
applies the same rule to its bound target:
|
|
163
211
|
|
|
164
212
|
```python
|
|
165
213
|
tab = client.session("session-id")
|
|
166
214
|
|
|
167
|
-
async for event in tab.listen(
|
|
168
|
-
event_name=NetworkEvent.REQUEST_WILL_BE_SENT,
|
|
169
|
-
event_type=RequestWillBeSentEvent,
|
|
170
|
-
):
|
|
215
|
+
async for event in tab.listen(RequestWillBeSentEvent):
|
|
171
216
|
# This stream contains events from this session only.
|
|
172
217
|
print(event.request.url)
|
|
173
218
|
```
|
|
@@ -177,15 +222,50 @@ To observe the root connection and all attached sessions together, use
|
|
|
177
222
|
event model:
|
|
178
223
|
|
|
179
224
|
```python
|
|
180
|
-
async for received in client.listen_all(
|
|
181
|
-
event_name=NetworkEvent.REQUEST_WILL_BE_SENT,
|
|
182
|
-
event_type=RequestWillBeSentEvent,
|
|
183
|
-
):
|
|
225
|
+
async for received in client.listen_all(RequestWillBeSentEvent):
|
|
184
226
|
print(received.session_id, received.value.request.url)
|
|
185
227
|
```
|
|
186
228
|
|
|
187
229
|
`received.session_id` is `None` for a root event. Generated event dataclasses
|
|
188
|
-
contain only fields defined by the CDP specification
|
|
230
|
+
contain only fields defined by the CDP specification, plus their CDP name in
|
|
231
|
+
`__cdp_event__`. To listen with your own dataclass, pass the name explicitly:
|
|
232
|
+
`client.listen(MyEvent, event_name="Page.loadEventFired")`.
|
|
233
|
+
|
|
234
|
+
An incoming event is decoded once per event class, when the first listener
|
|
235
|
+
reads it. Matching `listen()`, `CdpSession.listen()`, and `listen_all()`
|
|
236
|
+
subscriptions share that model (`received.value` for `listen_all()`). Treat
|
|
237
|
+
event data as read-only: changing a shared model also changes what other
|
|
238
|
+
listeners see. Make a deep copy when you need your own mutable instance:
|
|
239
|
+
|
|
240
|
+
```python
|
|
241
|
+
from copy import deepcopy
|
|
242
|
+
|
|
243
|
+
owned_event = deepcopy(event)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Different incoming messages and different event classes have separate cached
|
|
247
|
+
models. Unread events are not decoded. A cache is released when the last
|
|
248
|
+
subscription has read or discarded the incoming event.
|
|
249
|
+
|
|
250
|
+
### Limiting buffered events
|
|
251
|
+
|
|
252
|
+
Set `max_queue_size` on `CdpClient` to limit each listener's buffer. The default,
|
|
253
|
+
`0`, is unlimited. A full buffer discards its oldest event so slow consumers do
|
|
254
|
+
not block command responses. Override the limit for an individual subscription:
|
|
255
|
+
|
|
256
|
+
```python
|
|
257
|
+
client = CdpClient(ws_url, max_queue_size=256)
|
|
258
|
+
|
|
259
|
+
async with client:
|
|
260
|
+
async with client.listen(RequestWillBeSentEvent, max_queue_size=32) as events:
|
|
261
|
+
event = await events.next(timeout=10)
|
|
262
|
+
print(events.dropped_events)
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
The same options apply to `listen_all()` and `CdpSession.listen()`. Passing `0`
|
|
266
|
+
to a listener disables its limit. `events.dropped_events` counts events evicted
|
|
267
|
+
by that listener's buffer. Disconnecting drains the remaining buffered events;
|
|
268
|
+
`aclose()` releases them immediately.
|
|
189
269
|
|
|
190
270
|
## Working with target sessions
|
|
191
271
|
|
|
@@ -194,10 +274,10 @@ Attach to a target in flat mode and create an immutable session view with
|
|
|
194
274
|
session:
|
|
195
275
|
|
|
196
276
|
```python
|
|
197
|
-
from cdpify import
|
|
277
|
+
from cdpify import CdpClient
|
|
198
278
|
|
|
199
279
|
|
|
200
|
-
async with
|
|
280
|
+
async with CdpClient(browser_ws_url) as root_client:
|
|
201
281
|
attached = await root_client.target.attach_to_target(
|
|
202
282
|
target_id="target-id",
|
|
203
283
|
flatten=True,
|
|
@@ -238,11 +318,12 @@ await tab.execute("Runtime.evaluate", {"expression": "1 + 1"})
|
|
|
238
318
|
## Configuration
|
|
239
319
|
|
|
240
320
|
```python
|
|
241
|
-
client =
|
|
321
|
+
client = CdpClient(
|
|
242
322
|
url="ws://localhost:9222/devtools/browser/...",
|
|
243
323
|
additional_headers={"Authorization": "Bearer token"},
|
|
244
324
|
max_frame_size=100 * 1024 * 1024,
|
|
245
325
|
default_timeout=30.0,
|
|
326
|
+
max_queue_size=256,
|
|
246
327
|
)
|
|
247
328
|
```
|
|
248
329
|
|
|
@@ -250,11 +331,20 @@ For another transport protocol, implement the exported `Transport` protocol
|
|
|
250
331
|
and inject it directly:
|
|
251
332
|
|
|
252
333
|
```python
|
|
253
|
-
from cdpify import
|
|
334
|
+
from cdpify import CdpClient
|
|
254
335
|
|
|
255
|
-
client =
|
|
336
|
+
client = CdpClient(transport=my_transport)
|
|
256
337
|
```
|
|
257
338
|
|
|
339
|
+
Custom transports can optionally implement `CallbackTransport` from
|
|
340
|
+
`cdpify.transport` to deliver events directly to the client. The default
|
|
341
|
+
WebSocket transport uses this path to avoid an intermediate event queue.
|
|
342
|
+
Transports that implement only `Transport.events()` continue to work.
|
|
343
|
+
|
|
344
|
+
When using `WebSocketTransport.events()` directly, its `max_queue_size` option
|
|
345
|
+
sets the same drop-oldest limit on its transport buffer; `dropped_events` counts
|
|
346
|
+
those evictions. A client-supplied custom transport manages its own buffer limits.
|
|
347
|
+
|
|
258
348
|
For methods not covered by the generated API, use the low-level escape hatch:
|
|
259
349
|
|
|
260
350
|
```python
|
|
@@ -264,6 +354,38 @@ result = await client.execute(
|
|
|
264
354
|
)
|
|
265
355
|
```
|
|
266
356
|
|
|
357
|
+
### Generated type aliases
|
|
358
|
+
|
|
359
|
+
Generated aliases such as `FrameId`, `NodeId`, and `TargetFilter` use Python's
|
|
360
|
+
`type` statement. Use them in annotations and pass ordinary Python values:
|
|
361
|
+
|
|
362
|
+
```python
|
|
363
|
+
from cdpify.domains.page import FrameId
|
|
364
|
+
|
|
365
|
+
frame_id: FrameId = "F1"
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Aliases are not constructors or runtime classes. Use `"F1"` directly rather
|
|
369
|
+
than `FrameId("F1")`, and `isinstance(frame_id, str)` for a runtime check.
|
|
370
|
+
|
|
371
|
+
### When Chrome deviates from the spec
|
|
372
|
+
|
|
373
|
+
Chrome does not always send every field the protocol marks as required.
|
|
374
|
+
Instead of failing, cdpify logs a warning on the `cdpify.codec` logger and
|
|
375
|
+
sets the missing field to `None`, even if its type says otherwise. Unknown
|
|
376
|
+
fields from newer Chrome versions are ignored.
|
|
377
|
+
|
|
378
|
+
Deprecated CDP commands still work but emit a `DeprecationWarning`. Use
|
|
379
|
+
Python's warning filters to silence them or turn them into errors:
|
|
380
|
+
|
|
381
|
+
```python
|
|
382
|
+
import warnings
|
|
383
|
+
|
|
384
|
+
warnings.filterwarnings(
|
|
385
|
+
"ignore", category=DeprecationWarning, message=r"\w+\.\w+ is deprecated"
|
|
386
|
+
)
|
|
387
|
+
```
|
|
388
|
+
|
|
267
389
|
## Development
|
|
268
390
|
|
|
269
391
|
Install the project and its development dependencies with
|
|
@@ -275,6 +397,10 @@ uv run pytest
|
|
|
275
397
|
uv run ruff check . --exclude cdpify/domains
|
|
276
398
|
```
|
|
277
399
|
|
|
400
|
+
Use `uv sync --dev --extra orjson` and `uv run --extra orjson pytest` to include
|
|
401
|
+
the optional backend. CI installs this extra and tests both JSON backends on
|
|
402
|
+
Ubuntu, Windows, and macOS with Python 3.12, 3.13, and 3.14.
|
|
403
|
+
|
|
278
404
|
To download the latest protocol definitions and regenerate all domain clients:
|
|
279
405
|
|
|
280
406
|
```bash
|