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. Its optional variables={name: value} fills {{name}} references in the recorded code (JS-escaped) and in the query, condition and expected value before the read runs

Requirements

  • Python ≥ 3.11
  • Playwright ≥ 1.57.0

License

Released under the MIT License.

Metadata

Release files for testmuai-playwright-bindings 0.1.49b1

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.49b1
File Size Uploaded
testmuai_playwright_bindings-0.1.49b1.tar.gz 476.9 kB Details

Built distribution (wheel)

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

Total release size: 1.0 MB

Release files / testmuai_playwright_bindings-0.1.49b1.tar.gz

Download URL testmuai_playwright_bindings-0.1.49b1.tar.gz
Size 476.9 kB
Tags Source
SHA-256 checksum
How to use checksums
049b5ae0d18a75fafa4032e796338b4b2e8af8cbda6661bcb2f0644f8093a9c6
BLAKE2b-256 checksum
How to use checksums
80b4e095093eac7c891f0e124a28d91e20dd6fcedee552bd075c71733320015d
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.49b1-py3-none-any.whl

Download URL testmuai_playwright_bindings-0.1.49b1-py3-none-any.whl
Size 559.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1b84fe25a181592fdc1017bcdbd275ec3469d82afb87e6a4f833a41288896b0b
BLAKE2b-256 checksum
How to use checksums
1008ad4321cb667e2fa1cd73386d41f11908c6d304bf3be00e9dae2cf31e31ea
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

This release

0.1.49b1 This release

2 release files

0.1.48

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