This release is a pre-release and may not be stable for production use.
testmuai-playwright-bindings
TestMu binding for Playwright Python — a thin test runtime for running TestMu-exported tests locally or on the LambdaTest grid.
Installation
pip install testmuai-playwright-bindings
Then install the Playwright browsers (one-time):
playwright install
Quick Start
Set credentials (LambdaTest grid) once in your environment:
export LT_USERNAME="your_username"
export LT_ACCESS_KEY="your_access_key"
Then write a test:
import testmu
@testmu.test
async def my_test(page):
async with testmu.step("Open site"):
await page.goto("https://example.com")
async with testmu.step("Verify title"):
await testmu.expect(page).to_have_title("Example Domain")
testmu.run(my_test)
testmu.run() is a synchronous entry point — it sets up the session,
launches the browser, runs your test, and tears everything down.
Configuration
Configuration is sourced from environment variables. See .env.example for the full list. The most common ones:
| Variable | Purpose | Required |
|---|---|---|
LT_USERNAME |
LambdaTest grid username | For cloud features |
LT_ACCESS_KEY |
LambdaTest grid access key | For cloud features |
TESTMU_HEADLESS |
true (default) or false |
No |
TESTMU_SMART |
1 to enable vision/heal AI features |
No |
TESTMU_READ_SETTLE_MS |
How long a recorded read whose answer differs from its expected answer keeps re-reading (ms, default 15000, max 30000) | No |
Test-level metadata (build, name, variables, etc.) can be passed via
testmu.configure(...) at the top of generated test files.
Runtime modes (kane_version)
Generated tests pick a runtime mode with testmu.configure(kane_version=...):
"v4" (the default) or "v3". Every public name (testmu.var,
testmu.execute_js, testmu.Condition, …) follows the mode at call time, so
a name imported before configure() runs still does the right thing:
import testmu
from testmu import var # bound before configure()
testmu.configure(kane_version="v3")
var("{{price}}") # served by the v3 implementation
Package layout (for contributors)
The two modes live in separate implementation packages behind a small shared layer, so a change to one mode can't change the other:
| Path | What |
|---|---|
testmu/__init__.py |
public surface: shared names + per-mode forwarders |
testmu/_router.py |
picks the mode's package on each call; installs the heal patch on Locator once |
testmu/_configure.py, _config.py, _errors.py, _step.py, _heal_cache.py, _test_state.py |
shared: one of each whatever the mode |
testmu/_condition_enums.py, _devtools_types.py, _clipboard_store.py |
shared classes identical in both modes (PossibleCondition, NetworkEntry, ClipboardStore, …): testmu.<name> is the real class |
testmu/_aliases.py |
keeps old private paths working (below) |
testmu/_v4/ |
the v4 implementation |
testmu/_v3/ |
the v3 implementation |
_v4/ and _v3/ never import each other; each imports only itself and the
shared modules. Neither checks kane_version: the router already picked the
package, so each holds only its own mode's code paths. A change for one mode goes in that mode's folder only; a fix
both modes need is made in both. Tests follow the same split: tests/v4/,
tests/v3/ (where v3 is the default mode) and tests/shared/ (public
surface, routing, aliases).
Old private paths still work. Modules that used to live at
testmu.<name> (testmu._vars, testmu._helpers.devtools_network,
testmu.playwright_async, …) are aliases of the v4 modules: importing the old
path returns the same module object, so state and mock.patch / setattr
through it reach the real module. Old paths always mean v4. Prefer the public
testmu.<name> API, which follows the configured mode.
Routed classes. testmu.Condition and testmu.ResolvedCondition differ by
mode, so they are proxies: calling one builds the active mode's class, and
isinstance holds for either mode's instances. They can't be subclassed
(TypeError), and typing.get_type_hints on them is empty. Every other public
class is identical in both modes and is exported as the real class.
Features
@testmu.test— decorator that wraps async Playwright tests with session lifecycle managementtestmu.step(...)— context manager for structured test stepstestmu.var()/testmu.set_var()— template-based variable resolution (with ATMS lookup when authed)- Helpers —
execute_js,execute_api,execute_db,vision_query,network_query,smartui_snapshot_async, and more - Reporters — local console reporter and TestMu cloud reporter (LambdaTest dashboard)
- Self-healing locators — automatic locator recovery via heal patch (when smart mode enabled)
- Replayed reads —
textual_analyzerre-reads an answer that disagrees with its expected answer until it holds (budget above), and a drift heal re-anchors the recorded extraction code
Requirements
- Python ≥ 3.11
- Playwright ≥ 1.57.0
Links
- PyPI: https://pypi.org/project/testmuai-playwright-bindings/
- TestMu: https://testmu.ai
- LambdaTest grid: https://www.lambdatest.com
- Issues: https://github.com/LambdaTest/testmuai-bindings/issues
License
Released under the MIT License.
Metadata
Release files for testmuai-playwright-bindings 0.1.48b2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| testmuai_playwright_bindings-0.1.48b2.tar.gz | 476.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| testmuai_playwright_bindings-0.1.48b2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.0 MB
Release files / testmuai_playwright_bindings-0.1.48b2.tar.gz
| Download URL | testmuai_playwright_bindings-0.1.48b2.tar.gz |
|---|---|
| Size | 476.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f8132d6c7d5a27f00af64ffe67631d2f4fccf4177c3745bcedb8c92aa18e3a70
|
|
BLAKE2b-256 checksum How to use checksums |
7fec187ec3ff1a4939d73b88356835ecc41b1c174cd295a2f24ec2d5d76fd0fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|
Release files / testmuai_playwright_bindings-0.1.48b2-py3-none-any.whl
| Download URL | testmuai_playwright_bindings-0.1.48b2-py3-none-any.whl |
|---|---|
| Size | 559.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
47f0e406d26c393a7fda89cd1c283a0a6749525b9b1687e874f9b05edeaefac3
|
|
BLAKE2b-256 checksum How to use checksums |
5d6c449ec327a4267df0b6d155d2c923714a8fe5d0e0cc995cbcc74b917868ac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|