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-anchors the recorded extraction code

Requirements

  • Python ≥ 3.11
  • Playwright ≥ 1.57.0

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)

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

Built distribution (wheel)

Table of built distributions (wheels) for testmuai-playwright-bindings 0.1.48b2
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

0.1.48

2 release files

This release

0.1.48b2 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