Skip to content

probe-convert

probe-convert is a standalone multi-format test converter that translates tests from 7 source formats into ProbeScript with 100% construct coverage across all supported languages.

Source FrameworkExtensionsConstructsFullPartial
Maestro.yaml, .yml26242
Gherkin (Cucumber).feature34340
Robot Framework.robot29281
Detox.js, .ts22220
Appium (Python).py14131
Appium (Java).java, .kt12120
Appium (JS/WebdriverIO).js13130
Terminal window
make build-convert # from repo root, outputs bin/probe-convert
Terminal window
bin/probe-convert tests/login.yaml

Format is auto-detected from file extension and content markers.

Terminal window
bin/probe-convert -r maestro_tests/ -o probe_tests/
Terminal window
bin/probe-convert --from maestro flow.yml
Terminal window
bin/probe-convert --dry-run tests/login.yaml
Terminal window
# Validate with probe lint
bin/probe-convert --lint tests/login.yaml -o output/
# Validate with probe test --dry-run
bin/probe-convert --verify tests/login.yaml -o output/
  • Full — Lossless 1:1 mapping (e.g., tapOn becomes tap on)
  • Partial — Lossy but valid ProbeScript with guidance comments (e.g., evalScript becomes a run dart: block)

No constructs remain at Manual level — all have been promoted to Full or Partial.

# login.yaml (Maestro)
appId: com.example.app
---
- launchApp
- tapOn: "Sign In"
- inputText: "user@test.com"
- assertVisible: "Dashboard"

Becomes:

test "login"
open the app
tap on "Sign In"
type "user@test.com"
see "Dashboard"
Feature: Login
Background:
Given the app is launched
Scenario: Valid login
When I tap on "Sign In"
Then I should see "Dashboard"

Becomes:

before each
open the app
test "Valid login"
tap on "Sign In"
see "Dashboard"
describe('Login', () => {
it('should sign in', async () => {
await element(by.id('email')).typeText('user@test.com');
await element(by.text('Sign In')).tap();
await expect(element(by.text('Dashboard'))).toBeVisible();
});
});

Becomes:

test "should sign in"
type "user@test.com" into #email
tap on "Sign In"
see "Dashboard"

View the formal construct catalog for any language:

Terminal window
bin/probe-convert catalog # summary table
bin/probe-convert catalog maestro # full Maestro catalog
bin/probe-convert catalog gherkin # full Gherkin catalog
bin/probe-convert catalog --markdown # Markdown output
FlagDescription
--from, -fForce source format (maestro, gherkin, robot, detox, appium)
--output, -oOutput directory or file
--dry-runPreview to stdout
--recursive, -rRecurse into subdirectories
--lintValidate with probe lint after conversion
--verifyValidate with probe test --dry-run after conversion
--probe-pathPath to probe binary (auto-detected)

The converter guesses format from file extension and content:

  • .feature maps to Gherkin, .robot maps to Robot Framework
  • .yaml/.yml maps to Maestro if it contains appId, tapOn, launchApp, etc.
  • .js/.ts maps to Detox if it contains element(by. or device.launchApp, otherwise Appium JS
  • .py maps to Appium Python
  • .java/.kt maps to Appium Java