solvecdp
fastcdp provides an async Python client for the Chrome DevTools Protocol (CDP) over solveit’s js bridge. It exposes every CDP domain as a Python attribute with auto-generated signatures and docstrings — e.g. await cdp.page.navigate(url=...).
It includes event subscription via cdp.on()/cdp.wait_event(), navigation helpers (goto, wait_for_selector, wait_for), screenshot capture, and accessibility tree access. A cdp_search utility lets you search CDP commands by name or description. For use inside safepyrun sandboxes, cdp_yolo() registers all CDP classes.
Installation
You must install the solveit-chrome extension before using solvecdp.
Solveit already has solvecdp installed, but if you want to install the latest you can get it from pypi:
$ pip install solvecdp
How to use
from solvecdp import *
The JsCDP class
Every CDP domain is available as an attribute with auto-generated signatures. You can search for commands with cdp_search:
cdp_search('screenshot')
"Emulation.setVisibleSize: Resizes the frame/viewport of the page. Note that this does not affect the frame's container\n(e.g. browser window). Can \nHeadlessExperimental.beginFrame: Sends a BeginFrame to the target and returns when the frame was completed. Optionally captures a\nscreenshot from the res\n evt Overlay.screenshotRequested: Fired when user asks to capture screenshot of some area on the page.\nPage.captureScreenshot: Capture page screenshot."
Create a new page:
jc = await JsCDP.new()
Go to a page:
await jc.goto('https://httpbin.org/forms/post')
Eval js:
await jc.eval('document.title')
'6. httpbin.org/forms/post'
Or you can wait_for any js expression to be truthy, and have it returned:
await jc.wait_for('document.title')
'6. httpbin.org/forms/post'
Take a screenshot of the page:
img = await jc.screenshot()
Clean up when done:
await jc.close()
See JsCDP docs for full details.
Filling forms
page = await JsCDP.new(url='https://httpbin.org/forms/post')
For finding elements to interact with, use ax_tree:
root = await page.ax_tree()
print(str(root)[:300])
- **RootWebArea** "6. httpbin.org/forms/post" `focusable=True` `url=https://httpbin.org/forms/post` [#14]
- **LabelText** "" [#20]
- **StaticText** "Customer name: " [#62]
- **InlineTextBox** "Customer name: "
- **textbox** "Customer name: " `focusable=True` `editable=plaintext` `set
find and find_id are used to identify elements in the tree:
nmid = root.find_id('textbox', 'Customer name')
nmid
2
You can use regular CDP methods, or one of the provided shortcuts:
await page.fill_text(nmid, 'Jeremy Howard')
await page.click(root.find_id('radio', 'Large'))
await page.js_node_run('this.value = "18:30"', root.find_id('InputTime', 'delivery time'));
You can use click to click a button, or click_and_wait to wait for the next page to load:
await page.click_and_wait(root.find_id('button', 'Submit order'))
await page.close()
To allow LLMs like solveit with safepyrun to access solvecdp, use:
cdp_yolo()
Then use a prompt such as:
Try using python to create a
page_JsCDP object, then goto<url>, fill it out, read it to check it’s filled correctly, then submit it, and see what you get back. Don’t use find_id - you can get all the ids at once with ax_tree (don’t truncate the result of it). Don’t add extra waits etc - solvecdp handles it automatically. IDs can change so be sure to use the ax_tree IDs you read.
Release files for solvecdp 0.0.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| solvecdp-0.0.6.tar.gz | 8.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| solvecdp-0.0.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.0 kB
Release files / solvecdp-0.0.6.tar.gz
| Download URL | solvecdp-0.0.6.tar.gz |
|---|---|
| Size | 8.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e12d31ce9a2424d5e7625359f31929acdf58a6a8f95ecd7512b30087ef0416c7
|
|
BLAKE2b-256 checksum How to use checksums |
6e05ec4f59195c12f92b87d87d3f12651a5a489aa4db4a8de9513a7d531d6d6f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.2
|
Release files / solvecdp-0.0.6-py3-none-any.whl
| Download URL | solvecdp-0.0.6-py3-none-any.whl |
|---|---|
| Size | 8.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5e0995265e8f70e02af425fcfcbfc2ba490dcaedb29cf7ed3901aaa0e2eefd2f
|
|
BLAKE2b-256 checksum How to use checksums |
b05ee4b03397ed5c6d767878ce7055ae565b287d5ade1f37f9ee02ea2f0116c2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.2
|