cdpify 0.2.11__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.
Files changed (490) hide show
  1. cdpify-0.4.0/PKG-INFO +430 -0
  2. cdpify-0.4.0/README.md +411 -0
  3. cdpify-0.4.0/cdpify/__init__.py +38 -0
  4. cdpify-0.4.0/cdpify/client.py +190 -0
  5. cdpify-0.4.0/cdpify/codec.py +236 -0
  6. cdpify-0.4.0/cdpify/domains/__init__.py +198 -0
  7. cdpify-0.4.0/cdpify/domains/accessibility/__init__.py +103 -0
  8. cdpify-0.4.0/cdpify/domains/accessibility/commands.py +151 -0
  9. cdpify-0.2.11/cdpify/domains/accessibility/client.py → cdpify-0.4.0/cdpify/domains/accessibility/domain.py +28 -47
  10. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/accessibility/events.py +11 -5
  11. cdpify-0.4.0/cdpify/domains/accessibility/types.py +227 -0
  12. cdpify-0.4.0/cdpify/domains/accessors.py +435 -0
  13. cdpify-0.4.0/cdpify/domains/ads/__init__.py +37 -0
  14. cdpify-0.4.0/cdpify/domains/ads/commands.py +28 -0
  15. cdpify-0.4.0/cdpify/domains/ads/domain.py +45 -0
  16. cdpify-0.4.0/cdpify/domains/ads/types.py +60 -0
  17. cdpify-0.4.0/cdpify/domains/animation/__init__.py +94 -0
  18. cdpify-0.4.0/cdpify/domains/animation/commands.py +110 -0
  19. cdpify-0.2.11/cdpify/domains/animation/client.py → cdpify-0.4.0/cdpify/domains/animation/domain.py +39 -63
  20. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/animation/events.py +19 -9
  21. cdpify-0.4.0/cdpify/domains/animation/types.py +92 -0
  22. cdpify-0.4.0/cdpify/domains/audits/__init__.py +299 -0
  23. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/audits/commands.py +17 -16
  24. cdpify-0.2.11/cdpify/domains/audits/client.py → cdpify-0.4.0/cdpify/domains/audits/domain.py +15 -25
  25. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/audits/events.py +7 -3
  26. cdpify-0.4.0/cdpify/domains/audits/types.py +1195 -0
  27. cdpify-0.4.0/cdpify/domains/autofill/__init__.py +58 -0
  28. cdpify-0.4.0/cdpify/domains/autofill/commands.py +47 -0
  29. cdpify-0.4.0/cdpify/domains/autofill/domain.py +87 -0
  30. cdpify-0.4.0/cdpify/domains/autofill/events.py +30 -0
  31. cdpify-0.4.0/cdpify/domains/autofill/types.py +75 -0
  32. cdpify-0.4.0/cdpify/domains/backgroundservice/__init__.py +63 -0
  33. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/backgroundservice/commands.py +12 -11
  34. cdpify-0.2.11/cdpify/domains/backgroundservice/client.py → cdpify-0.4.0/cdpify/domains/backgroundservice/domain.py +17 -32
  35. cdpify-0.4.0/cdpify/domains/backgroundservice/events.py +53 -0
  36. cdpify-0.4.0/cdpify/domains/backgroundservice/types.py +48 -0
  37. cdpify-0.4.0/cdpify/domains/bluetoothemulation/__init__.py +146 -0
  38. cdpify-0.4.0/cdpify/domains/bluetoothemulation/commands.py +216 -0
  39. cdpify-0.4.0/cdpify/domains/bluetoothemulation/domain.py +314 -0
  40. cdpify-0.4.0/cdpify/domains/bluetoothemulation/events.py +75 -0
  41. cdpify-0.4.0/cdpify/domains/bluetoothemulation/types.py +117 -0
  42. cdpify-0.4.0/cdpify/domains/browser/__init__.py +142 -0
  43. cdpify-0.4.0/cdpify/domains/browser/commands.py +277 -0
  44. cdpify-0.2.11/cdpify/domains/browser/client.py → cdpify-0.4.0/cdpify/domains/browser/domain.py +106 -139
  45. cdpify-0.4.0/cdpify/domains/browser/events.py +45 -0
  46. cdpify-0.4.0/cdpify/domains/browser/types.py +143 -0
  47. cdpify-0.4.0/cdpify/domains/cachestorage/__init__.py +72 -0
  48. cdpify-0.4.0/cdpify/domains/cachestorage/commands.py +101 -0
  49. cdpify-0.2.11/cdpify/domains/cachestorage/client.py → cdpify-0.4.0/cdpify/domains/cachestorage/domain.py +23 -36
  50. cdpify-0.4.0/cdpify/domains/cachestorage/types.py +74 -0
  51. cdpify-0.4.0/cdpify/domains/cast/__init__.py +53 -0
  52. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/cast/commands.py +20 -17
  53. cdpify-0.2.11/cdpify/domains/cast/client.py → cdpify-0.4.0/cdpify/domains/cast/domain.py +22 -42
  54. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/cast/events.py +13 -7
  55. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/cast/types.py +2 -3
  56. cdpify-0.4.0/cdpify/domains/console/__init__.py +34 -0
  57. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/console/commands.py +2 -2
  58. cdpify-0.2.11/cdpify/domains/console/client.py → cdpify-0.4.0/cdpify/domains/console/domain.py +10 -22
  59. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/console/events.py +7 -3
  60. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/console/types.py +3 -4
  61. cdpify-0.4.0/cdpify/domains/crashreportcontext/__init__.py +31 -0
  62. cdpify-0.4.0/cdpify/domains/crashreportcontext/commands.py +21 -0
  63. cdpify-0.4.0/cdpify/domains/crashreportcontext/domain.py +30 -0
  64. cdpify-0.4.0/cdpify/domains/crashreportcontext/types.py +20 -0
  65. cdpify-0.4.0/cdpify/domains/css/__init__.py +407 -0
  66. cdpify-0.4.0/cdpify/domains/css/commands.py +658 -0
  67. cdpify-0.2.11/cdpify/domains/css/client.py → cdpify-0.4.0/cdpify/domains/css/domain.py +153 -200
  68. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/css/events.py +30 -22
  69. cdpify-0.4.0/cdpify/domains/css/types.py +673 -0
  70. cdpify-0.4.0/cdpify/domains/debugger/__init__.py +245 -0
  71. cdpify-0.4.0/cdpify/domains/debugger/commands.py +534 -0
  72. cdpify-0.2.11/cdpify/domains/debugger/client.py → cdpify-0.4.0/cdpify/domains/debugger/domain.py +113 -198
  73. cdpify-0.4.0/cdpify/domains/debugger/events.py +180 -0
  74. cdpify-0.4.0/cdpify/domains/debugger/types.py +160 -0
  75. cdpify-0.4.0/cdpify/domains/deviceaccess/__init__.py +42 -0
  76. cdpify-0.4.0/cdpify/domains/deviceaccess/commands.py +39 -0
  77. cdpify-0.4.0/cdpify/domains/deviceaccess/domain.py +76 -0
  78. cdpify-0.4.0/cdpify/domains/deviceaccess/events.py +33 -0
  79. cdpify-0.4.0/cdpify/domains/deviceaccess/types.py +27 -0
  80. cdpify-0.4.0/cdpify/domains/deviceorientation/__init__.py +31 -0
  81. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/deviceorientation/commands.py +4 -3
  82. cdpify-0.2.11/cdpify/domains/deviceorientation/client.py → cdpify-0.4.0/cdpify/domains/deviceorientation/domain.py +10 -18
  83. cdpify-0.4.0/cdpify/domains/digitalcredentials/__init__.py +34 -0
  84. cdpify-0.4.0/cdpify/domains/digitalcredentials/commands.py +34 -0
  85. cdpify-0.4.0/cdpify/domains/digitalcredentials/domain.py +47 -0
  86. cdpify-0.4.0/cdpify/domains/digitalcredentials/types.py +18 -0
  87. cdpify-0.4.0/cdpify/domains/dom/__init__.py +431 -0
  88. cdpify-0.4.0/cdpify/domains/dom/commands.py +842 -0
  89. cdpify-0.2.11/cdpify/domains/dom/client.py → cdpify-0.4.0/cdpify/domains/dom/domain.py +245 -291
  90. cdpify-0.4.0/cdpify/domains/dom/events.py +274 -0
  91. cdpify-0.4.0/cdpify/domains/dom/types.py +294 -0
  92. cdpify-0.4.0/cdpify/domains/domdebugger/__init__.py +80 -0
  93. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/domdebugger/commands.py +39 -37
  94. cdpify-0.2.11/cdpify/domains/domdebugger/client.py → cdpify-0.4.0/cdpify/domains/domdebugger/domain.py +38 -69
  95. cdpify-0.4.0/cdpify/domains/domdebugger/types.py +51 -0
  96. cdpify-0.4.0/cdpify/domains/domsnapshot/__init__.py +87 -0
  97. cdpify-0.4.0/cdpify/domains/domsnapshot/commands.py +86 -0
  98. cdpify-0.2.11/cdpify/domains/domsnapshot/client.py → cdpify-0.4.0/cdpify/domains/domsnapshot/domain.py +17 -30
  99. cdpify-0.4.0/cdpify/domains/domsnapshot/types.py +296 -0
  100. cdpify-0.4.0/cdpify/domains/domstorage/__init__.py +67 -0
  101. cdpify-0.4.0/cdpify/domains/domstorage/commands.py +50 -0
  102. cdpify-0.2.11/cdpify/domains/domstorage/client.py → cdpify-0.4.0/cdpify/domains/domstorage/domain.py +22 -42
  103. cdpify-0.4.0/cdpify/domains/domstorage/events.py +54 -0
  104. cdpify-0.4.0/cdpify/domains/domstorage/types.py +30 -0
  105. cdpify-0.4.0/cdpify/domains/emulation/__init__.py +311 -0
  106. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/emulation/commands.py +216 -155
  107. cdpify-0.2.11/cdpify/domains/emulation/client.py → cdpify-0.4.0/cdpify/domains/emulation/domain.py +188 -311
  108. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/emulation/events.py +12 -6
  109. cdpify-0.4.0/cdpify/domains/emulation/types.py +217 -0
  110. cdpify-0.4.0/cdpify/domains/eventbreakpoints/__init__.py +40 -0
  111. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/eventbreakpoints/commands.py +9 -8
  112. cdpify-0.2.11/cdpify/domains/eventbreakpoints/client.py → cdpify-0.4.0/cdpify/domains/eventbreakpoints/domain.py +13 -24
  113. cdpify-0.4.0/cdpify/domains/extensions/__init__.py +63 -0
  114. cdpify-0.4.0/cdpify/domains/extensions/commands.py +117 -0
  115. cdpify-0.4.0/cdpify/domains/extensions/domain.py +163 -0
  116. cdpify-0.4.0/cdpify/domains/extensions/types.py +33 -0
  117. cdpify-0.4.0/cdpify/domains/fedcm/__init__.py +67 -0
  118. cdpify-0.4.0/cdpify/domains/fedcm/commands.py +57 -0
  119. cdpify-0.4.0/cdpify/domains/fedcm/domain.py +119 -0
  120. cdpify-0.4.0/cdpify/domains/fedcm/events.py +42 -0
  121. cdpify-0.4.0/cdpify/domains/fedcm/types.py +71 -0
  122. cdpify-0.4.0/cdpify/domains/fetch/__init__.py +91 -0
  123. cdpify-0.4.0/cdpify/domains/fetch/commands.py +165 -0
  124. cdpify-0.2.11/cdpify/domains/fetch/client.py → cdpify-0.4.0/cdpify/domains/fetch/domain.py +33 -59
  125. cdpify-0.4.0/cdpify/domains/fetch/events.py +79 -0
  126. cdpify-0.4.0/cdpify/domains/fetch/types.py +72 -0
  127. cdpify-0.4.0/cdpify/domains/filesystem/__init__.py +37 -0
  128. cdpify-0.4.0/cdpify/domains/filesystem/commands.py +29 -0
  129. cdpify-0.4.0/cdpify/domains/filesystem/domain.py +37 -0
  130. cdpify-0.4.0/cdpify/domains/filesystem/types.py +33 -0
  131. cdpify-0.4.0/cdpify/domains/findinpage/__init__.py +28 -0
  132. cdpify-0.4.0/cdpify/domains/findinpage/commands.py +25 -0
  133. cdpify-0.4.0/cdpify/domains/findinpage/domain.py +69 -0
  134. cdpify-0.4.0/cdpify/domains/headlessexperimental/__init__.py +37 -0
  135. cdpify-0.4.0/cdpify/domains/headlessexperimental/commands.py +46 -0
  136. cdpify-0.4.0/cdpify/domains/headlessexperimental/domain.py +75 -0
  137. cdpify-0.4.0/cdpify/domains/headlessexperimental/types.py +21 -0
  138. cdpify-0.4.0/cdpify/domains/heapprofiler/__init__.py +101 -0
  139. cdpify-0.4.0/cdpify/domains/heapprofiler/commands.py +126 -0
  140. cdpify-0.2.11/cdpify/domains/heapprofiler/client.py → cdpify-0.4.0/cdpify/domains/heapprofiler/domain.py +38 -71
  141. cdpify-0.4.0/cdpify/domains/heapprofiler/events.py +69 -0
  142. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/heapprofiler/types.py +12 -15
  143. cdpify-0.4.0/cdpify/domains/indexeddb/__init__.py +87 -0
  144. cdpify-0.4.0/cdpify/domains/indexeddb/commands.py +174 -0
  145. cdpify-0.2.11/cdpify/domains/indexeddb/client.py → cdpify-0.4.0/cdpify/domains/indexeddb/domain.py +34 -58
  146. cdpify-0.4.0/cdpify/domains/indexeddb/types.py +92 -0
  147. cdpify-0.4.0/cdpify/domains/input/__init__.py +92 -0
  148. cdpify-0.4.0/cdpify/domains/input/commands.py +250 -0
  149. cdpify-0.2.11/cdpify/domains/input/client.py → cdpify-0.4.0/cdpify/domains/input/domain.py +45 -85
  150. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/input/events.py +7 -3
  151. cdpify-0.4.0/cdpify/domains/input/types.py +64 -0
  152. cdpify-0.4.0/cdpify/domains/inspector/__init__.py +43 -0
  153. cdpify-0.2.11/cdpify/domains/eventbreakpoints/types.py → cdpify-0.4.0/cdpify/domains/inspector/commands.py +8 -3
  154. cdpify-0.4.0/cdpify/domains/inspector/domain.py +38 -0
  155. cdpify-0.4.0/cdpify/domains/inspector/events.py +56 -0
  156. cdpify-0.4.0/cdpify/domains/io/__init__.py +46 -0
  157. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/io/commands.py +19 -16
  158. cdpify-0.2.11/cdpify/domains/io/client.py → cdpify-0.4.0/cdpify/domains/io/domain.py +18 -24
  159. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/io/types.py +1 -4
  160. cdpify-0.4.0/cdpify/domains/layertree/__init__.py +97 -0
  161. cdpify-0.4.0/cdpify/domains/layertree/commands.py +132 -0
  162. cdpify-0.2.11/cdpify/domains/layertree/client.py → cdpify-0.4.0/cdpify/domains/layertree/domain.py +32 -54
  163. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/layertree/events.py +13 -11
  164. cdpify-0.4.0/cdpify/domains/layertree/types.py +97 -0
  165. cdpify-0.4.0/cdpify/domains/log/__init__.py +38 -0
  166. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/log/commands.py +4 -3
  167. cdpify-0.2.11/cdpify/domains/log/client.py → cdpify-0.4.0/cdpify/domains/log/domain.py +16 -34
  168. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/log/events.py +7 -3
  169. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/log/types.py +15 -13
  170. cdpify-0.4.0/cdpify/domains/media/__init__.py +72 -0
  171. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/media/commands.py +2 -2
  172. cdpify-0.2.11/cdpify/domains/media/client.py → cdpify-0.4.0/cdpify/domains/media/domain.py +8 -17
  173. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/media/events.py +28 -16
  174. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/media/types.py +22 -22
  175. cdpify-0.4.0/cdpify/domains/memory/__init__.py +84 -0
  176. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/memory/commands.py +26 -21
  177. cdpify-0.2.11/cdpify/domains/memory/client.py → cdpify-0.4.0/cdpify/domains/memory/domain.py +31 -62
  178. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/memory/types.py +20 -16
  179. cdpify-0.4.0/cdpify/domains/network/__init__.py +641 -0
  180. cdpify-0.4.0/cdpify/domains/network/commands.py +505 -0
  181. cdpify-0.2.11/cdpify/domains/network/client.py → cdpify-0.4.0/cdpify/domains/network/domain.py +110 -348
  182. cdpify-0.4.0/cdpify/domains/network/events.py +779 -0
  183. cdpify-0.4.0/cdpify/domains/network/types.py +1463 -0
  184. cdpify-0.4.0/cdpify/domains/overlay/__init__.py +269 -0
  185. cdpify-0.4.0/cdpify/domains/overlay/commands.py +387 -0
  186. cdpify-0.2.11/cdpify/domains/overlay/client.py → cdpify-0.4.0/cdpify/domains/overlay/domain.py +116 -188
  187. cdpify-0.4.0/cdpify/domains/overlay/events.py +88 -0
  188. cdpify-0.4.0/cdpify/domains/overlay/types.py +432 -0
  189. cdpify-0.4.0/cdpify/domains/page/__init__.py +578 -0
  190. cdpify-0.4.0/cdpify/domains/page/commands.py +839 -0
  191. cdpify-0.2.11/cdpify/domains/page/client.py → cdpify-0.4.0/cdpify/domains/page/domain.py +295 -351
  192. cdpify-0.4.0/cdpify/domains/page/events.py +428 -0
  193. cdpify-0.4.0/cdpify/domains/page/types.py +945 -0
  194. cdpify-0.4.0/cdpify/domains/performance/__init__.py +45 -0
  195. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/performance/commands.py +16 -11
  196. cdpify-0.2.11/cdpify/domains/performance/client.py → cdpify-0.4.0/cdpify/domains/performance/domain.py +18 -30
  197. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/performance/events.py +7 -3
  198. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/performance/types.py +2 -3
  199. cdpify-0.4.0/cdpify/domains/performancetimeline/__init__.py +47 -0
  200. cdpify-0.4.0/cdpify/domains/performancetimeline/commands.py +22 -0
  201. cdpify-0.4.0/cdpify/domains/performancetimeline/domain.py +34 -0
  202. cdpify-0.4.0/cdpify/domains/performancetimeline/events.py +31 -0
  203. cdpify-0.4.0/cdpify/domains/performancetimeline/types.py +64 -0
  204. cdpify-0.4.0/cdpify/domains/preload/__init__.py +93 -0
  205. cdpify-0.2.11/cdpify/domains/deviceorientation/types.py → cdpify-0.4.0/cdpify/domains/preload/commands.py +8 -3
  206. cdpify-0.4.0/cdpify/domains/preload/domain.py +32 -0
  207. cdpify-0.4.0/cdpify/domains/preload/events.py +132 -0
  208. cdpify-0.4.0/cdpify/domains/preload/types.py +316 -0
  209. cdpify-0.4.0/cdpify/domains/profiler/__init__.py +83 -0
  210. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/profiler/commands.py +19 -16
  211. cdpify-0.2.11/cdpify/domains/profiler/client.py → cdpify-0.4.0/cdpify/domains/profiler/domain.py +26 -51
  212. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/profiler/events.py +15 -11
  213. cdpify-0.4.0/cdpify/domains/profiler/types.py +83 -0
  214. cdpify-0.4.0/cdpify/domains/pwa/__init__.py +65 -0
  215. cdpify-0.4.0/cdpify/domains/pwa/commands.py +145 -0
  216. cdpify-0.4.0/cdpify/domains/pwa/domain.py +180 -0
  217. cdpify-0.4.0/cdpify/domains/pwa/types.py +36 -0
  218. cdpify-0.4.0/cdpify/domains/runtime/__init__.py +215 -0
  219. cdpify-0.4.0/cdpify/domains/runtime/commands.py +394 -0
  220. cdpify-0.2.11/cdpify/domains/runtime/client.py → cdpify-0.4.0/cdpify/domains/runtime/domain.py +68 -129
  221. cdpify-0.4.0/cdpify/domains/runtime/events.py +161 -0
  222. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/runtime/types.py +106 -72
  223. cdpify-0.4.0/cdpify/domains/schema/__init__.py +31 -0
  224. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/schema/commands.py +4 -3
  225. cdpify-0.2.11/cdpify/domains/schema/client.py → cdpify-0.4.0/cdpify/domains/schema/domain.py +8 -12
  226. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/schema/types.py +2 -3
  227. cdpify-0.4.0/cdpify/domains/security/__init__.py +92 -0
  228. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/security/commands.py +10 -9
  229. cdpify-0.2.11/cdpify/domains/security/client.py → cdpify-0.4.0/cdpify/domains/security/domain.py +21 -40
  230. cdpify-0.4.0/cdpify/domains/security/events.py +72 -0
  231. cdpify-0.4.0/cdpify/domains/security/types.py +156 -0
  232. cdpify-0.4.0/cdpify/domains/serviceworker/__init__.py +113 -0
  233. cdpify-0.4.0/cdpify/domains/serviceworker/commands.py +81 -0
  234. cdpify-0.2.11/cdpify/domains/serviceworker/client.py → cdpify-0.4.0/cdpify/domains/serviceworker/domain.py +39 -78
  235. cdpify-0.4.0/cdpify/domains/serviceworker/events.py +50 -0
  236. cdpify-0.4.0/cdpify/domains/serviceworker/types.py +150 -0
  237. cdpify-0.4.0/cdpify/domains/smartcardemulation/__init__.py +146 -0
  238. cdpify-0.4.0/cdpify/domains/smartcardemulation/commands.py +190 -0
  239. cdpify-0.4.0/cdpify/domains/smartcardemulation/domain.py +289 -0
  240. cdpify-0.4.0/cdpify/domains/smartcardemulation/events.py +288 -0
  241. cdpify-0.4.0/cdpify/domains/smartcardemulation/types.py +139 -0
  242. cdpify-0.4.0/cdpify/domains/storage/__init__.py +233 -0
  243. cdpify-0.4.0/cdpify/domains/storage/commands.py +325 -0
  244. cdpify-0.4.0/cdpify/domains/storage/domain.py +474 -0
  245. cdpify-0.4.0/cdpify/domains/storage/events.py +105 -0
  246. cdpify-0.4.0/cdpify/domains/storage/types.py +97 -0
  247. cdpify-0.4.0/cdpify/domains/systeminfo/__init__.py +72 -0
  248. cdpify-0.4.0/cdpify/domains/systeminfo/commands.py +46 -0
  249. cdpify-0.2.11/cdpify/domains/systeminfo/client.py → cdpify-0.4.0/cdpify/domains/systeminfo/domain.py +13 -21
  250. cdpify-0.4.0/cdpify/domains/systeminfo/types.py +118 -0
  251. cdpify-0.4.0/cdpify/domains/target/__init__.py +158 -0
  252. cdpify-0.4.0/cdpify/domains/target/commands.py +323 -0
  253. cdpify-0.2.11/cdpify/domains/target/client.py → cdpify-0.4.0/cdpify/domains/target/domain.py +67 -120
  254. cdpify-0.4.0/cdpify/domains/target/events.py +113 -0
  255. cdpify-0.4.0/cdpify/domains/target/types.py +80 -0
  256. cdpify-0.4.0/cdpify/domains/tethering/__init__.py +35 -0
  257. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/tethering/commands.py +6 -5
  258. cdpify-0.2.11/cdpify/domains/tethering/client.py → cdpify-0.4.0/cdpify/domains/tethering/domain.py +12 -20
  259. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/tethering/events.py +9 -5
  260. cdpify-0.4.0/cdpify/domains/tracing/__init__.py +80 -0
  261. cdpify-0.4.0/cdpify/domains/tracing/commands.py +100 -0
  262. cdpify-0.2.11/cdpify/domains/tracing/client.py → cdpify-0.4.0/cdpify/domains/tracing/domain.py +26 -38
  263. cdpify-0.4.0/cdpify/domains/tracing/events.py +65 -0
  264. cdpify-0.4.0/cdpify/domains/tracing/types.py +99 -0
  265. cdpify-0.4.0/cdpify/domains/webaudio/__init__.py +118 -0
  266. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/domains/webaudio/commands.py +9 -8
  267. cdpify-0.2.11/cdpify/domains/webaudio/client.py → cdpify-0.4.0/cdpify/domains/webaudio/domain.py +13 -24
  268. cdpify-0.4.0/cdpify/domains/webaudio/events.py +210 -0
  269. cdpify-0.4.0/cdpify/domains/webaudio/types.py +154 -0
  270. cdpify-0.4.0/cdpify/domains/webauthn/__init__.py +116 -0
  271. cdpify-0.4.0/cdpify/domains/webauthn/commands.py +183 -0
  272. cdpify-0.2.11/cdpify/domains/webauthn/client.py → cdpify-0.4.0/cdpify/domains/webauthn/domain.py +50 -83
  273. cdpify-0.4.0/cdpify/domains/webauthn/events.py +71 -0
  274. cdpify-0.4.0/cdpify/domains/webauthn/types.py +108 -0
  275. cdpify-0.4.0/cdpify/domains/webmcp/__init__.py +68 -0
  276. cdpify-0.4.0/cdpify/domains/webmcp/commands.py +43 -0
  277. cdpify-0.4.0/cdpify/domains/webmcp/domain.py +81 -0
  278. cdpify-0.4.0/cdpify/domains/webmcp/events.py +75 -0
  279. cdpify-0.4.0/cdpify/domains/webmcp/types.py +67 -0
  280. cdpify-0.4.0/cdpify/event_queue.py +57 -0
  281. cdpify-0.4.0/cdpify/events/__init__.py +11 -0
  282. cdpify-0.4.0/cdpify/events/dispatcher.py +115 -0
  283. cdpify-0.4.0/cdpify/events/router.py +149 -0
  284. cdpify-0.4.0/cdpify/events/source.py +36 -0
  285. cdpify-0.4.0/cdpify/events/subscription.py +106 -0
  286. cdpify-0.4.0/cdpify/exceptions.py +74 -0
  287. cdpify-0.4.0/cdpify/executor.py +39 -0
  288. cdpify-0.4.0/cdpify/generator/__main__.py +77 -0
  289. cdpify-0.4.0/cdpify/generator/downloader.py +34 -0
  290. cdpify-0.4.0/cdpify/generator/formatting.py +22 -0
  291. cdpify-0.4.0/cdpify/generator/generator.py +59 -0
  292. cdpify-0.4.0/cdpify/generator/generators/__init__.py +3 -0
  293. cdpify-0.4.0/cdpify/generator/generators/accessors.py +20 -0
  294. cdpify-0.4.0/cdpify/generator/generators/commands.py +96 -0
  295. cdpify-0.4.0/cdpify/generator/generators/constants.py +7 -0
  296. cdpify-0.4.0/cdpify/generator/generators/context.py +59 -0
  297. cdpify-0.4.0/cdpify/generator/generators/domain.py +106 -0
  298. cdpify-0.4.0/cdpify/generator/generators/events.py +113 -0
  299. cdpify-0.4.0/cdpify/generator/generators/init.py +103 -0
  300. cdpify-0.4.0/cdpify/generator/generators/types.py +125 -0
  301. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify/generator/generators/utils.py +26 -24
  302. cdpify-0.4.0/cdpify/generator/generators/views.py +111 -0
  303. cdpify-0.4.0/cdpify/generator/rendering.py +25 -0
  304. cdpify-0.2.11/cdpify/generator/models.py → cdpify-0.4.0/cdpify/generator/schemas.py +8 -8
  305. cdpify-0.4.0/cdpify/generator/templates/accessors.py.jinja2 +30 -0
  306. cdpify-0.4.0/cdpify/generator/templates/commands.py.jinja2 +38 -0
  307. cdpify-0.4.0/cdpify/generator/templates/domain.py.jinja2 +65 -0
  308. cdpify-0.4.0/cdpify/generator/templates/domain_init.py.jinja2 +35 -0
  309. cdpify-0.4.0/cdpify/generator/templates/events.py.jinja2 +40 -0
  310. cdpify-0.4.0/cdpify/generator/templates/root_init.py.jinja2 +26 -0
  311. cdpify-0.4.0/cdpify/generator/templates/types.py.jinja2 +43 -0
  312. cdpify-0.4.0/cdpify/py.typed +0 -0
  313. cdpify-0.4.0/cdpify/session.py +40 -0
  314. cdpify-0.4.0/cdpify/shared/decorators.py +53 -0
  315. cdpify-0.4.0/cdpify/shared/enums.py +17 -0
  316. cdpify-0.4.0/cdpify/shared/lazy.py +35 -0
  317. cdpify-0.4.0/cdpify/shared/naming.py +12 -0
  318. cdpify-0.4.0/cdpify/transport.py +52 -0
  319. cdpify-0.4.0/cdpify/transports/__init__.py +1 -0
  320. cdpify-0.4.0/cdpify/transports/websocket.py +313 -0
  321. cdpify-0.4.0/cdpify.egg-info/PKG-INFO +430 -0
  322. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify.egg-info/SOURCES.txt +159 -63
  323. cdpify-0.4.0/cdpify.egg-info/requires.txt +11 -0
  324. {cdpify-0.2.11 → cdpify-0.4.0}/pyproject.toml +28 -6
  325. cdpify-0.4.0/tests/test_client.py +303 -0
  326. cdpify-0.4.0/tests/test_codec.py +177 -0
  327. cdpify-0.4.0/tests/test_decorators_and_exceptions.py +93 -0
  328. cdpify-0.4.0/tests/test_dependency_boundaries.py +125 -0
  329. cdpify-0.4.0/tests/test_enums.py +117 -0
  330. cdpify-0.4.0/tests/test_event_dispatcher.py +100 -0
  331. cdpify-0.4.0/tests/test_event_subscription.py +331 -0
  332. cdpify-0.4.0/tests/test_lazy_imports.py +75 -0
  333. cdpify-0.4.0/tests/test_models.py +144 -0
  334. cdpify-0.4.0/tests/test_session.py +143 -0
  335. cdpify-0.4.0/tests/test_websocket_client.py +168 -0
  336. cdpify-0.4.0/tests/test_websocket_transport.py +379 -0
  337. cdpify-0.2.11/PKG-INFO +0 -182
  338. cdpify-0.2.11/README.md +0 -171
  339. cdpify-0.2.11/cdpify/__init__.py +0 -17
  340. cdpify-0.2.11/cdpify/client.py +0 -450
  341. cdpify-0.2.11/cdpify/domains/__init__.py +0 -91
  342. cdpify-0.2.11/cdpify/domains/accessibility/__init__.py +0 -68
  343. cdpify-0.2.11/cdpify/domains/accessibility/commands.py +0 -130
  344. cdpify-0.2.11/cdpify/domains/accessibility/types.py +0 -197
  345. cdpify-0.2.11/cdpify/domains/animation/__init__.py +0 -62
  346. cdpify-0.2.11/cdpify/domains/animation/commands.py +0 -104
  347. cdpify-0.2.11/cdpify/domains/animation/types.py +0 -82
  348. cdpify-0.2.11/cdpify/domains/audits/__init__.py +0 -161
  349. cdpify-0.2.11/cdpify/domains/audits/types.py +0 -839
  350. cdpify-0.2.11/cdpify/domains/backgroundservice/__init__.py +0 -38
  351. cdpify-0.2.11/cdpify/domains/backgroundservice/events.py +0 -39
  352. cdpify-0.2.11/cdpify/domains/backgroundservice/types.py +0 -47
  353. cdpify-0.2.11/cdpify/domains/browser/__init__.py +0 -88
  354. cdpify-0.2.11/cdpify/domains/browser/commands.py +0 -243
  355. cdpify-0.2.11/cdpify/domains/browser/events.py +0 -43
  356. cdpify-0.2.11/cdpify/domains/browser/types.py +0 -123
  357. cdpify-0.2.11/cdpify/domains/cachestorage/__init__.py +0 -47
  358. cdpify-0.2.11/cdpify/domains/cachestorage/commands.py +0 -94
  359. cdpify-0.2.11/cdpify/domains/cachestorage/events.py +0 -5
  360. cdpify-0.2.11/cdpify/domains/cachestorage/types.py +0 -68
  361. cdpify-0.2.11/cdpify/domains/cast/__init__.py +0 -34
  362. cdpify-0.2.11/cdpify/domains/console/__init__.py +0 -21
  363. cdpify-0.2.11/cdpify/domains/css/__init__.py +0 -244
  364. cdpify-0.2.11/cdpify/domains/css/commands.py +0 -571
  365. cdpify-0.2.11/cdpify/domains/css/types.py +0 -566
  366. cdpify-0.2.11/cdpify/domains/debugger/__init__.py +0 -150
  367. cdpify-0.2.11/cdpify/domains/debugger/commands.py +0 -482
  368. cdpify-0.2.11/cdpify/domains/debugger/events.py +0 -134
  369. cdpify-0.2.11/cdpify/domains/debugger/types.py +0 -141
  370. cdpify-0.2.11/cdpify/domains/deviceorientation/__init__.py +0 -15
  371. cdpify-0.2.11/cdpify/domains/deviceorientation/events.py +0 -5
  372. cdpify-0.2.11/cdpify/domains/dom/__init__.py +0 -250
  373. cdpify-0.2.11/cdpify/domains/dom/commands.py +0 -724
  374. cdpify-0.2.11/cdpify/domains/dom/events.py +0 -232
  375. cdpify-0.2.11/cdpify/domains/dom/types.py +0 -230
  376. cdpify-0.2.11/cdpify/domains/domdebugger/__init__.py +0 -43
  377. cdpify-0.2.11/cdpify/domains/domdebugger/events.py +0 -5
  378. cdpify-0.2.11/cdpify/domains/domdebugger/types.py +0 -40
  379. cdpify-0.2.11/cdpify/domains/domsnapshot/__init__.py +0 -57
  380. cdpify-0.2.11/cdpify/domains/domsnapshot/commands.py +0 -65
  381. cdpify-0.2.11/cdpify/domains/domsnapshot/events.py +0 -5
  382. cdpify-0.2.11/cdpify/domains/domsnapshot/types.py +0 -209
  383. cdpify-0.2.11/cdpify/domains/domstorage/__init__.py +0 -44
  384. cdpify-0.2.11/cdpify/domains/domstorage/commands.py +0 -49
  385. cdpify-0.2.11/cdpify/domains/domstorage/events.py +0 -44
  386. cdpify-0.2.11/cdpify/domains/domstorage/types.py +0 -28
  387. cdpify-0.2.11/cdpify/domains/emulation/__init__.py +0 -162
  388. cdpify-0.2.11/cdpify/domains/emulation/types.py +0 -194
  389. cdpify-0.2.11/cdpify/domains/eventbreakpoints/__init__.py +0 -20
  390. cdpify-0.2.11/cdpify/domains/eventbreakpoints/events.py +0 -5
  391. cdpify-0.2.11/cdpify/domains/fetch/__init__.py +0 -56
  392. cdpify-0.2.11/cdpify/domains/fetch/commands.py +0 -145
  393. cdpify-0.2.11/cdpify/domains/fetch/events.py +0 -65
  394. cdpify-0.2.11/cdpify/domains/fetch/types.py +0 -65
  395. cdpify-0.2.11/cdpify/domains/heapprofiler/__init__.py +0 -64
  396. cdpify-0.2.11/cdpify/domains/heapprofiler/commands.py +0 -99
  397. cdpify-0.2.11/cdpify/domains/heapprofiler/events.py +0 -55
  398. cdpify-0.2.11/cdpify/domains/indexeddb/__init__.py +0 -55
  399. cdpify-0.2.11/cdpify/domains/indexeddb/commands.py +0 -141
  400. cdpify-0.2.11/cdpify/domains/indexeddb/events.py +0 -5
  401. cdpify-0.2.11/cdpify/domains/indexeddb/types.py +0 -94
  402. cdpify-0.2.11/cdpify/domains/input/__init__.py +0 -59
  403. cdpify-0.2.11/cdpify/domains/input/commands.py +0 -213
  404. cdpify-0.2.11/cdpify/domains/input/types.py +0 -49
  405. cdpify-0.2.11/cdpify/domains/io/__init__.py +0 -29
  406. cdpify-0.2.11/cdpify/domains/io/events.py +0 -5
  407. cdpify-0.2.11/cdpify/domains/layertree/__init__.py +0 -64
  408. cdpify-0.2.11/cdpify/domains/layertree/commands.py +0 -125
  409. cdpify-0.2.11/cdpify/domains/layertree/types.py +0 -85
  410. cdpify-0.2.11/cdpify/domains/log/__init__.py +0 -23
  411. cdpify-0.2.11/cdpify/domains/media/__init__.py +0 -48
  412. cdpify-0.2.11/cdpify/domains/memory/__init__.py +0 -45
  413. cdpify-0.2.11/cdpify/domains/memory/events.py +0 -5
  414. cdpify-0.2.11/cdpify/domains/network/__init__.py +0 -398
  415. cdpify-0.2.11/cdpify/domains/network/commands.py +0 -545
  416. cdpify-0.2.11/cdpify/domains/network/events.py +0 -646
  417. cdpify-0.2.11/cdpify/domains/network/types.py +0 -1198
  418. cdpify-0.2.11/cdpify/domains/overlay/__init__.py +0 -138
  419. cdpify-0.2.11/cdpify/domains/overlay/commands.py +0 -331
  420. cdpify-0.2.11/cdpify/domains/overlay/events.py +0 -78
  421. cdpify-0.2.11/cdpify/domains/overlay/types.py +0 -220
  422. cdpify-0.2.11/cdpify/domains/page/__init__.py +0 -322
  423. cdpify-0.2.11/cdpify/domains/page/commands.py +0 -690
  424. cdpify-0.2.11/cdpify/domains/page/events.py +0 -367
  425. cdpify-0.2.11/cdpify/domains/page/types.py +0 -817
  426. cdpify-0.2.11/cdpify/domains/performance/__init__.py +0 -29
  427. cdpify-0.2.11/cdpify/domains/profiler/__init__.py +0 -54
  428. cdpify-0.2.11/cdpify/domains/profiler/types.py +0 -82
  429. cdpify-0.2.11/cdpify/domains/runtime/__init__.py +0 -140
  430. cdpify-0.2.11/cdpify/domains/runtime/commands.py +0 -301
  431. cdpify-0.2.11/cdpify/domains/runtime/events.py +0 -132
  432. cdpify-0.2.11/cdpify/domains/schema/__init__.py +0 -18
  433. cdpify-0.2.11/cdpify/domains/schema/events.py +0 -5
  434. cdpify-0.2.11/cdpify/domains/security/__init__.py +0 -56
  435. cdpify-0.2.11/cdpify/domains/security/events.py +0 -56
  436. cdpify-0.2.11/cdpify/domains/security/types.py +0 -114
  437. cdpify-0.2.11/cdpify/domains/serviceworker/__init__.py +0 -60
  438. cdpify-0.2.11/cdpify/domains/serviceworker/commands.py +0 -78
  439. cdpify-0.2.11/cdpify/domains/serviceworker/events.py +0 -34
  440. cdpify-0.2.11/cdpify/domains/serviceworker/types.py +0 -66
  441. cdpify-0.2.11/cdpify/domains/storage/__init__.py +0 -170
  442. cdpify-0.2.11/cdpify/domains/storage/client.py +0 -700
  443. cdpify-0.2.11/cdpify/domains/storage/commands.py +0 -409
  444. cdpify-0.2.11/cdpify/domains/storage/events.py +0 -175
  445. cdpify-0.2.11/cdpify/domains/storage/types.py +0 -228
  446. cdpify-0.2.11/cdpify/domains/systeminfo/__init__.py +0 -43
  447. cdpify-0.2.11/cdpify/domains/systeminfo/commands.py +0 -45
  448. cdpify-0.2.11/cdpify/domains/systeminfo/events.py +0 -5
  449. cdpify-0.2.11/cdpify/domains/systeminfo/types.py +0 -96
  450. cdpify-0.2.11/cdpify/domains/target/__init__.py +0 -106
  451. cdpify-0.2.11/cdpify/domains/target/commands.py +0 -292
  452. cdpify-0.2.11/cdpify/domains/target/events.py +0 -97
  453. cdpify-0.2.11/cdpify/domains/target/types.py +0 -67
  454. cdpify-0.2.11/cdpify/domains/tethering/__init__.py +0 -20
  455. cdpify-0.2.11/cdpify/domains/tethering/types.py +0 -10
  456. cdpify-0.2.11/cdpify/domains/tracing/__init__.py +0 -54
  457. cdpify-0.2.11/cdpify/domains/tracing/commands.py +0 -77
  458. cdpify-0.2.11/cdpify/domains/tracing/events.py +0 -55
  459. cdpify-0.2.11/cdpify/domains/tracing/types.py +0 -62
  460. cdpify-0.2.11/cdpify/domains/webaudio/__init__.py +0 -76
  461. cdpify-0.2.11/cdpify/domains/webaudio/events.py +0 -168
  462. cdpify-0.2.11/cdpify/domains/webaudio/types.py +0 -118
  463. cdpify-0.2.11/cdpify/domains/webauthn/__init__.py +0 -74
  464. cdpify-0.2.11/cdpify/domains/webauthn/commands.py +0 -169
  465. cdpify-0.2.11/cdpify/domains/webauthn/events.py +0 -61
  466. cdpify-0.2.11/cdpify/domains/webauthn/types.py +0 -51
  467. cdpify-0.2.11/cdpify/events/__init__.py +0 -5
  468. cdpify-0.2.11/cdpify/events/dispatcher.py +0 -50
  469. cdpify-0.2.11/cdpify/exceptions.py +0 -18
  470. cdpify-0.2.11/cdpify/generator/__main__.py +0 -27
  471. cdpify-0.2.11/cdpify/generator/config.py +0 -104
  472. cdpify-0.2.11/cdpify/generator/constants.py +0 -2
  473. cdpify-0.2.11/cdpify/generator/downloader.py +0 -43
  474. cdpify-0.2.11/cdpify/generator/generator.py +0 -140
  475. cdpify-0.2.11/cdpify/generator/generators/__init__.py +0 -13
  476. cdpify-0.2.11/cdpify/generator/generators/base.py +0 -117
  477. cdpify-0.2.11/cdpify/generator/generators/client.py +0 -257
  478. cdpify-0.2.11/cdpify/generator/generators/commands.py +0 -150
  479. cdpify-0.2.11/cdpify/generator/generators/events.py +0 -145
  480. cdpify-0.2.11/cdpify/generator/generators/init.py +0 -103
  481. cdpify-0.2.11/cdpify/generator/generators/types.py +0 -161
  482. cdpify-0.2.11/cdpify/generator/parser.py +0 -23
  483. cdpify-0.2.11/cdpify/logging.py +0 -97
  484. cdpify-0.2.11/cdpify/shared/decorators.py +0 -30
  485. cdpify-0.2.11/cdpify/shared/models.py +0 -155
  486. cdpify-0.2.11/cdpify.egg-info/PKG-INFO +0 -182
  487. cdpify-0.2.11/cdpify.egg-info/requires.txt +0 -4
  488. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify.egg-info/dependency_links.txt +0 -0
  489. {cdpify-0.2.11 → cdpify-0.4.0}/cdpify.egg-info/top_level.txt +0 -0
  490. {cdpify-0.2.11 → cdpify-0.4.0}/setup.cfg +0 -0
cdpify-0.4.0/PKG-INFO ADDED
@@ -0,0 +1,430 @@
1
+ Metadata-Version: 2.4
2
+ Name: cdpify
3
+ Version: 0.4.0
4
+ Summary: A Python client for the Chrome DevTools Protocol (CDP) optimized for DX.
5
+ Classifier: Programming Language :: Python :: 3
6
+ Classifier: Programming Language :: Python :: 3.12
7
+ Classifier: Programming Language :: Python :: 3.13
8
+ Classifier: Programming Language :: Python :: 3.14
9
+ Requires-Python: >=3.12
10
+ Description-Content-Type: text/markdown
11
+ Provides-Extra: orjson
12
+ Requires-Dist: orjson>=3.11.3; extra == "orjson"
13
+ Provides-Extra: websocket
14
+ Requires-Dist: websockets>=15.0.1; extra == "websocket"
15
+ Provides-Extra: generator
16
+ Requires-Dist: jinja2>=3.1.6; extra == "generator"
17
+ Requires-Dist: pydantic>=2.12.5; extra == "generator"
18
+ Requires-Dist: ruff>=0.14.10; extra == "generator"
19
+
20
+ # cdpify
21
+
22
+ 🚀 **An async, typed Python client for the Chrome DevTools Protocol.**
23
+
24
+ `cdpify` turns the Chrome DevTools Protocol (CDP) into a Pythonic, IDE-friendly
25
+ API. Commands, results, events, and protocol types are generated from the
26
+ official CDP specifications, so you get autocomplete and typed responses
27
+ without working with raw JSON messages.
28
+
29
+ ## Contents
30
+
31
+ - [Why cdpify?](#why-cdpify)
32
+ - [Installation](#installation)
33
+ - [Quick start](#quick-start)
34
+ - [Supported domains](#supported-domains)
35
+ - [Listening for events](#listening-for-events)
36
+ - [Working with target sessions](#working-with-target-sessions)
37
+ - [Configuration](#configuration)
38
+ - [Development](#development)
39
+ - [Resources](#resources)
40
+
41
+ ## Why cdpify?
42
+
43
+ - **Typed by default** — generated models for commands, results, events, and
44
+ shared protocol types
45
+ - **Complete domain coverage** — access all 59 generated CDP domains through
46
+ properties such as `client.page`, `client.network`, and `client.runtime`
47
+ - **Async throughout** — transport-neutral core with an optional WebSocket
48
+ implementation
49
+ - **Typed event streams** — consume CDP events with async iterators
50
+ - **Multi-target support** — use immutable, concurrency-safe session views
51
+ - **Low-level protocol access** — execute any CDP method through `execute()`
52
+ when needed
53
+
54
+ ## Installation
55
+
56
+ ```bash
57
+ pip install "cdpify[websocket]"
58
+ ```
59
+
60
+ Requires Python 3.12 or newer. The WebSocket extra provides the recommended
61
+ default transport used by `CdpClient(url)`. Install `cdpify` without an extra when
62
+ supplying your own `Transport` implementation.
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
+
74
+ Install the generator dependencies only when regenerating protocol modules:
75
+
76
+ ```bash
77
+ pip install "cdpify[generator]"
78
+ ```
79
+
80
+ ## Quick start
81
+
82
+ Start Chrome or Chromium with remote debugging enabled, then obtain a page's
83
+ `webSocketDebuggerUrl` from `http://localhost:9222/json`.
84
+
85
+ ```python
86
+ import asyncio
87
+ import json
88
+ from urllib.request import urlopen
89
+
90
+ from cdpify import CdpClient
91
+
92
+
93
+ def get_websocket_url() -> str:
94
+ with urlopen("http://localhost:9222/json", timeout=5) as response:
95
+ return json.load(response)[0]["webSocketDebuggerUrl"]
96
+
97
+
98
+ async def main() -> None:
99
+ ws_url = get_websocket_url()
100
+
101
+ async with CdpClient(ws_url) as client:
102
+ await client.page.navigate(url="https://example.com")
103
+
104
+ result = await client.runtime.evaluate(
105
+ expression="document.title",
106
+ return_by_value=True,
107
+ )
108
+ print(result.result.value)
109
+
110
+
111
+ asyncio.run(main())
112
+ ```
113
+
114
+ Domains are available as lazy properties on `CdpClient`. Parameters use
115
+ Python's `snake_case`; `cdpify` handles conversion to and from CDP's wire format.
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
+
137
+ ## Supported domains
138
+
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`:
142
+
143
+ | CDP domain | Python accessor | CDP domain | Python accessor |
144
+ | --- | --- | --- | --- |
145
+ | `Accessibility` | `client.accessibility` | `IndexedDB` | `client.indexed_db` |
146
+ | `Ads` | `client.ads` | `Input` | `client.input` |
147
+ | `Animation` | `client.animation` | `Inspector` | `client.inspector` |
148
+ | `Audits` | `client.audits` | `IO` | `client.io` |
149
+ | `Autofill` | `client.autofill` | `LayerTree` | `client.layer_tree` |
150
+ | `BackgroundService` | `client.background_service` | `Log` | `client.log` |
151
+ | `BluetoothEmulation` | `client.bluetooth_emulation` | `Media` | `client.media` |
152
+ | `Browser` | `client.browser` | `Memory` | `client.memory` |
153
+ | `CacheStorage` | `client.cache_storage` | `Network` | `client.network` |
154
+ | `Cast` | `client.cast` | `Overlay` | `client.overlay` |
155
+ | `Console` | `client.console` | `Page` | `client.page` |
156
+ | `CrashReportContext` | `client.crash_report_context` | `Performance` | `client.performance` |
157
+ | `CSS` | `client.css` | `PerformanceTimeline` | `client.performance_timeline` |
158
+ | `Debugger` | `client.debugger` | `Preload` | `client.preload` |
159
+ | `DeviceAccess` | `client.device_access` | `Profiler` | `client.profiler` |
160
+ | `DeviceOrientation` | `client.device_orientation` | `PWA` | `client.pwa` |
161
+ | `DigitalCredentials` | `client.digital_credentials` | `Runtime` | `client.runtime` |
162
+ | `DOM` | `client.dom` | `Schema` | `client.schema` |
163
+ | `DOMDebugger` | `client.dom_debugger` | `Security` | `client.security` |
164
+ | `DOMSnapshot` | `client.dom_snapshot` | `ServiceWorker` | `client.service_worker` |
165
+ | `DOMStorage` | `client.dom_storage` | `SmartCardEmulation` | `client.smart_card_emulation` |
166
+ | `Emulation` | `client.emulation` | `Storage` | `client.storage` |
167
+ | `EventBreakpoints` | `client.event_breakpoints` | `SystemInfo` | `client.system_info` |
168
+ | `Extensions` | `client.extensions` | `Target` | `client.target` |
169
+ | `FedCm` | `client.fed_cm` | `Tethering` | `client.tethering` |
170
+ | `Fetch` | `client.fetch` | `Tracing` | `client.tracing` |
171
+ | `FileSystem` | `client.file_system` | `WebAudio` | `client.web_audio` |
172
+ | `FindInPage` | `client.find_in_page` | `WebAuthn` | `client.web_authn` |
173
+ | `HeadlessExperimental` | `client.headless_experimental` | `WebMCP` | `client.web_mcp` |
174
+ | `HeapProfiler` | `client.heap_profiler` | | |
175
+
176
+ ## Listening for events
177
+
178
+ Pass a generated event class to `listen()`. The returned subscription is an
179
+ async iterator of typed events:
180
+
181
+ ```python
182
+ from cdpify.domains.network.events import RequestWillBeSentEvent
183
+
184
+
185
+ await client.network.enable()
186
+
187
+ async for event in client.listen(RequestWillBeSentEvent):
188
+ print(event.request.method, event.request.url)
189
+ ```
190
+
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:
211
+
212
+ ```python
213
+ tab = client.session("session-id")
214
+
215
+ async for event in tab.listen(RequestWillBeSentEvent):
216
+ # This stream contains events from this session only.
217
+ print(event.request.url)
218
+ ```
219
+
220
+ To observe the root connection and all attached sessions together, use
221
+ `listen_all()`. Routing metadata is returned separately from the generated CDP
222
+ event model:
223
+
224
+ ```python
225
+ async for received in client.listen_all(RequestWillBeSentEvent):
226
+ print(received.session_id, received.value.request.url)
227
+ ```
228
+
229
+ `received.session_id` is `None` for a root event. Generated event dataclasses
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.
269
+
270
+ ## Working with target sessions
271
+
272
+ Attach to a target in flat mode and create an immutable session view with
273
+ `client.session()`. Every generated command on that view is routed to the bound
274
+ session:
275
+
276
+ ```python
277
+ from cdpify import CdpClient
278
+
279
+
280
+ async with CdpClient(browser_ws_url) as root_client:
281
+ attached = await root_client.target.attach_to_target(
282
+ target_id="target-id",
283
+ flatten=True,
284
+ )
285
+ tab = root_client.session(attached.session_id)
286
+
287
+ await tab.page.enable()
288
+ await tab.runtime.evaluate(expression="console.log('Hello from CDP')")
289
+ ```
290
+
291
+ There is no mutable "active session". Create one view per attached target and
292
+ use them safely from concurrent tasks:
293
+
294
+ ```python
295
+ import asyncio
296
+
297
+
298
+ tab_a = root_client.session(session_a)
299
+ tab_b = root_client.session(session_b)
300
+
301
+ await asyncio.gather(
302
+ tab_a.runtime.evaluate(expression="document.title"),
303
+ tab_b.runtime.evaluate(expression="document.title"),
304
+ )
305
+ ```
306
+
307
+ Session routing is transport metadata, not a generated command parameter.
308
+ Generated methods therefore never accept an additional routing `session_id`.
309
+ A real `sessionId` declared by the CDP specification remains a normal typed
310
+ parameter. For low-level access, `root_client.execute()` optionally accepts a
311
+ session ID, while `tab.execute()` is always bound and cannot be overridden:
312
+
313
+ ```python
314
+ await root_client.execute("Page.enable", session_id=session_a)
315
+ await tab.execute("Runtime.evaluate", {"expression": "1 + 1"})
316
+ ```
317
+
318
+ ## Configuration
319
+
320
+ ```python
321
+ client = CdpClient(
322
+ url="ws://localhost:9222/devtools/browser/...",
323
+ additional_headers={"Authorization": "Bearer token"},
324
+ max_frame_size=100 * 1024 * 1024,
325
+ default_timeout=30.0,
326
+ max_queue_size=256,
327
+ )
328
+ ```
329
+
330
+ For another transport protocol, implement the exported `Transport` protocol
331
+ and inject it directly:
332
+
333
+ ```python
334
+ from cdpify import CdpClient
335
+
336
+ client = CdpClient(transport=my_transport)
337
+ ```
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
+
348
+ For methods not covered by the generated API, use the low-level escape hatch:
349
+
350
+ ```python
351
+ result = await client.execute(
352
+ "Runtime.evaluate",
353
+ {"expression": "1 + 1", "returnByValue": True},
354
+ )
355
+ ```
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
+
389
+ ## Development
390
+
391
+ Install the project and its development dependencies with
392
+ [uv](https://docs.astral.sh/uv/):
393
+
394
+ ```bash
395
+ uv sync --dev
396
+ uv run pytest
397
+ uv run ruff check . --exclude cdpify/domains
398
+ ```
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
+
404
+ To download the latest protocol definitions and regenerate all domain clients:
405
+
406
+ ```bash
407
+ uv run python -m cdpify.generator
408
+ ```
409
+
410
+ Generate only selected domains by repeating `--domain`:
411
+
412
+ ```bash
413
+ uv run python -m cdpify.generator --domain Page --domain Runtime
414
+ ```
415
+
416
+ Use `--spec-dir` and `--output-dir` to override where downloaded specifications
417
+ and generated modules are written.
418
+
419
+ The generated output lives in `cdpify/domains/` and should not be edited by
420
+ hand. The repository also refreshes the upstream specification automatically
421
+ once a week and opens a pull request when generated code changes.
422
+
423
+ ## Resources
424
+
425
+ - [Chrome DevTools Protocol documentation](https://chromedevtools.github.io/devtools-protocol/)
426
+ - [Chrome DevTools Protocol repository](https://github.com/ChromeDevTools/devtools-protocol)
427
+ - [Examples](examples)
428
+
429
+ The code-generation approach was inspired by
430
+ [`cdp-use`](https://github.com/browser-use/cdp-use).