Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

testmuai-playwright-bindings

PyPI version Python versions License: MIT

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 management
  • testmu.step(...) — context manager for structured test steps
  • testmu.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_analyzer re-reads an answer that disagrees with its expected answer until it holds (budget above), and a drift heal re-derives the extraction from the query

Requirements

  • Python ≥ 3.11
  • Playwright ≥ 1.57.0

License

Released under the MIT License.

Metadata

Release files for testmuai-playwright-bindings 0.1.48b3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for testmuai-playwright-bindings 0.1.48b3
File Size Uploaded
testmuai_playwright_bindings-0.1.48b3.tar.gz 475.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for testmuai-playwright-bindings 0.1.48b3
File Interpreter ABI Platform
testmuai_playwright_bindings-0.1.48b3-py3-none-any.whl Python 3 none any Details

Total release size: 1.0 MB

Release files / testmuai_playwright_bindings-0.1.48b3.tar.gz

Download URL testmuai_playwright_bindings-0.1.48b3.tar.gz
Size 475.6 kB
Tags Source
SHA-256 checksum
How to use checksums
852cbc442dd8265de5a6791b90013c9ded1b5b7d274cbbaff972b3b5c0e76b54
BLAKE2b-256 checksum
How to use checksums
9417763014bf293e5fb6d7e95e528bc52bb19695d83afc4a2926029846182732
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.48b3-py3-none-any.whl

Download URL testmuai_playwright_bindings-0.1.48b3-py3-none-any.whl
Size 558.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
302cab7d0284dee029e3a9abde5226bcb1a67906a87e7ce85aaed5453b80af28
BLAKE2b-256 checksum
How to use checksums
00a024300f4b3fe3b2b67b381159c524cc2cbcd77f37571360b9a91ea6faf6aa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.17

Release history Release notifications | RSS feed

0.1.48

2 release files

This release

0.1.48b3 This release

2 release files

0.1.42

2 release files

0.1.41

2 release files

0.1.40

2 release files

0.1.39

2 release files

0.1.38

2 release files

0.1.35

2 release files

0.1.33

2 release files

0.1.32

2 release files

0.1.31

2 release files

0.1.30

2 release files

0.1.26

2 release files

0.1.25

2 release files

0.1.24

2 release files

0.1.21

2 release files

0.1.20

2 release files

0.1.19

2 release files

0.1.18

2 release files

0.1.17

2 release files

0.1.16

2 release files

0.1.15

2 release files

0.1.14

2 release files

0.1.13

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page