Skip to main content

Pythonic bindings for the Handsets Android control CLI

Project description

handsets — Python bindings

A small, Pythonic wrapper around the Handsets CLI (hs). Drives Android devices from Python without reimplementing the subprocess + JSON-parse + exit-code boilerplate every caller used to write by hand.

Install

pip install handsets

You also need the hs binary on $PATH. See the project install instructions.

Usage

from handsets import Session

with Session() as d:                   # `hs use` on enter, `hs drop` on exit
    for node in d.ui():
        print(node.cls, node.text, node.coords)

    d.tap("Continue")                  # text lookup
    d.tap(540, 860)                    # raw coords
    d.type("EditText", "you@x.com")    # selector + text — atomic ACTION_SET_TEXT
    d.submit()
    d.wait("Welcome", timeout="15s")

Errors map to typed exceptions:

from handsets import Session, NotFound, Timeout, Ambiguous

try:
    d.tap("Submit", unique=True, timeout="5s")
except NotFound:
    ...  # exit code 2 — selector matched nothing
except Timeout:
    ...  # exit code 3 — wait budget exhausted
except Ambiguous:
    ...  # exit code 4 — --unique saw multiple matches

Everything else (daemon errors, bad arguments, secure-window blocks) raises a generic HandsetsError whose .code attribute carries the structured ErrCode enum value from the CLI's JSON output.

Talking to a specific device

Session(serial="PIXEL6_SERIAL")

Multiple sessions can run side-by-side; each one shells out independently.

Why a thin wrapper?

The CLI already does the hard work: warm daemon, push-mirrored state, millisecond round-trips. The Python layer's job is to make that ergonomic — context managers, typed exceptions, no manual subprocess.run. Future versions may keep an hs run subprocess warm and stream commands over its stdin to amortise per-call process overhead.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

handsets-0.1.14.tar.gz (7.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

handsets-0.1.14-py3-none-any.whl (7.5 kB view details)

Uploaded Python 3

File details

Details for the file handsets-0.1.14.tar.gz.

File metadata

  • Download URL: handsets-0.1.14.tar.gz
  • Upload date:
  • Size: 7.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.9

File hashes

Hashes for handsets-0.1.14.tar.gz
Algorithm Hash digest
SHA256 d511d62f5e27e4b5ea8f98fc44f8bc62d67055a0909e45cc2db815c5a88995e5
MD5 e70f575c06415273ce23c1f631703042
BLAKE2b-256 bc2f25ffd06d0f1df44429a894a174f9aef5c33e55476bfc760abe14cd2f516a

See more details on using hashes here.

File details

Details for the file handsets-0.1.14-py3-none-any.whl.

File metadata

  • Download URL: handsets-0.1.14-py3-none-any.whl
  • Upload date:
  • Size: 7.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.9

File hashes

Hashes for handsets-0.1.14-py3-none-any.whl
Algorithm Hash digest
SHA256 09de7573d9153316683066f27d1fec66d704fcf8878f97063ecad7aedba365a2
MD5 01ffc3ddac83005dce247c33c44fd318
BLAKE2b-256 ec81ad261ae6b225b5ef9489d61546f9fd36dea4ec09b05ae943e6b1746c7eff

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page