Back to Projects
Python to Maestro YAML

Python to Maestro YAML

PythonMaestroASTMigrationPyPI

The Challenge

Organizations adopting Maestro often face a massive hurdle: a legacy codebase of thousands of Selenium/Appium tests. Rewriting these scripts is inefficient and error-prone.

The Solution

Built a robust AST-based transpiler that parses Python code to generate equivalent declarative Maestro YAML flows, bridging the gap between imperative scripting and declarative testing.

Key Features

  • AST Parsing
  • Intelligent Mapping
  • YAML Generation
  • Legacy Migration

Case Study: Automating the Migration from Selenium/Appium to Maestro

Project Context

pythontomaestro is a specialized tool designed to accelerate the migration of legacy Python-based automation scripts (Selenium and Appium) to Maestro, a modern mobile UI testing framework. It parses existing Python code to generate equivalent declarative Maestro YAML flows, bridging the gap between imperative scripting and declarative testing.

Key Objectives

  • Automate Conversion: reduce manual effort in rewriting tests.
  • Preserve Intent: Accurately map user interactions (taps, inputs, navigation) to Maestro commands.
  • Identify Gaps: Clearly flag unconvertible logic (loops, conditionals) for manual review.

Stakeholders/Users

  • SDETs (Software Development Engineers in Test): Seeking to modernize their mobile testing stack.
  • QA Engineers: Migrating legacy regression suites to Maestro.
  • DevOps Teams: Integrating new Maestro flows into CI/CD pipelines.

Technical Background

  • Source Language: Python (using selenium and appium-python-client libraries).
  • Target Language: Maestro YAML.
  • Core Technology: Python ast (Abstract Syntax Tree) module for static code analysis.
  • Constraints: Python is imperative (dynamic logic), while Maestro is declarative (linear flows).

Problem

The Migration Bottleneck

Organizations adopting Maestro for its speed and simplicity often face a massive hurdle: a legacy codebase of thousands of Selenium/Appium tests. Rewriting these scripts from scratch is:

  1. Inefficient: It consumes weeks of engineering time that could be spent on new feature testing.
  2. Error-Prone: Manual translation often leads to missed steps or incorrect selector mappings.
  3. Risk-Heavy: A "big bang" migration risks losing test coverage during the transition period.

Existing approaches usually involve regex-based find-and-replace, which is brittle and fails on multi-line statements or complex chained calls (e.g., driver.find_element(...).click()).

Challenges

1. Paradigm Mismatch

The primary challenge was translating imperative Python code (which supports arbitrary logic, loops, and external library calls) into declarative Maestro YAML.

  • Constraint: Maestro flows are primarily linear sequences of user actions.
  • Complexity: Python scripts often mix test steps with setup logic (webdriver.Chrome()), control flow (if, for), and custom helper methods.

2. Syntax Variability

Python allows multiple ways to express the same action:

  • element.click() vs driver.find_element(...).click() (chained).
  • time.sleep(5) vs explicit waits.
  • Variable assignments vs direct usage.

3. Partial Convertibility

Not all Python code has a Maestro equivalent. Complex logic like database connections or conditional navigation based on external state cannot be automatically transpiled to a static YAML file.

Solution

Approach: AST-Based Transpilation

Instead of simple text processing, I built a robust AST (Abstract Syntax Tree) Parser. This allows the tool to understand the structure and grammar of the Python code, ensuring accurate extraction of test intent regardless of formatting.

Step-by-Step Implementation

  1. AST Parsing (src/parser.py):

    • Traverses the Python source code to identify test methods.
    • Ignores Noise: Automatically filters out driver initialization (webdriver.Chrome(), Remote) as Maestro handles app launching natively.
    • Handles Chaining: Detects and parses chained calls like find_element(...).click() by inspecting nested AST nodes.
    • Captures Control Flow: Explicitly visits If, For, and While nodes to flag them as unsupported.
  2. Intelligent Mapping (src/mapper.py):

    • Maps Selenium actions to Maestro commands:
      • click() → tapOn
      • send_keys() → inputText (preceded by tapOn)
      • get() → openLink
      • back() → back
      • swipe() → swipe (with coordinate parsing)
    • Advanced Handling:
      • Converts print() statements to runScript: console.log(...).
      • Converts time.sleep() to runScript delays.
    • Error Reporting: When an unknown action or complex control flow is encountered, it inserts a TODO_UNSUPPORTED_ACTION into the YAML with a helpful suggestion (e.g., "Suggestion: Unroll loops...").
  3. YAML Generation (src/generator.py):

    • Produces clean, valid YAML output.
    • Safety Net: If a file contains any TODO items, a top-level warning comment (# WARNING: This flow contains unsupported actions...) is injected to ensure the user knows manual review is required.

Tools Used

  • Python ast: For robust parsing.
  • argparse: For the CLI interface.
  • PyYAML: For generating compliant Maestro output.

Outcome/Impact

Measurable Improvements

  • Speed: Converts a typical test file in seconds, compared to manual rewriting.
  • Accuracy: Accurate mapping for standard actions (click, input, navigation), eliminating typo risks.
  • Visibility: The "TODO" system provides an immediate checklist of manual work, turning a vague migration task into a defined set of action items.

Limitations of V1

  • Complex Logic: Loops (for, while) and conditionals (if) are not unrolled or converted; they are flagged for manual intervention.
  • Custom Wrappers: The tool currently supports standard Selenium/Appium APIs. Custom wrapper methods (e.g., my_lib.click_button()) are flagged as unknown.
  • Selectors: XPath selectors are flagged as TODO as Maestro prefers id or text.

Summary

pythontomaestro effectively automates the repetitive migration work, allowing engineers to focus on the complex logic. By leveraging AST parsing, it provides a robust, structure-aware conversion that handles chained calls and standard actions seamlessly, while intelligently flagging unsupported logic for manual review. This tool transforms a daunting migration project into a manageable, accelerated process.

Get In Touch

Interested in collaborating or have a question about my projects? Feel free to reach out. I'm always open to discussing new ideas and opportunities.

Say Hello