v1.2.0

Anthelion User Guide

Professional test automation for mobile games. Record, script, execute, and analyze tests across Android and iOS with Unity engine support.

🎮

Game-Aware Testing

Inspect live Unity scene hierarchies, interact with GameObjects by name, path, or tag, and validate component properties in real time.

🔴

Record & Replay

Record gameplay interactions and automatically generate Python test scripts. Edit, extend, and replay with full control.

📺

Live Screen Streaming

Stream device screens in real time. Click on the stream to raycast into the game scene and discover UI elements instantly.

📊

Rich Results & Reports

View detailed test results with video recordings, screenshots, logs, callstacks, a Popups tab auditing any in-game popups the dismissal guard handled, and downloadable HTML reports.


System Requirements

ComponentRequirement
Operating SystemmacOS 12+ (Monterey or later), or Windows 10/11 (64-bit)
Memory8 GB RAM minimum, 16 GB recommended
Storage~2 GB for application + downloaded runtimes
Android TestingUSB-connected Android device with Developer Mode enabled (supported on macOS and Windows)
iOS TestingmacOS only. USB-connected iOS device with Developer Mode enabled, Xcode installed, and WebDriverAgent one-time setup completed. iOS testing is not available on Windows.
NetworkDesktop machine and mobile devices must be on the same local network (same Wi-Fi SSID / LAN subnet)
Unity SDKUnity 2021.3 or later
Same-network requirement. The Anthelion desktop application communicates with your Unity game build over the local network to drive test execution, stream the live hierarchy, and capture screenshots. The desktop machine and every mobile device under test must be on the same Wi-Fi network or LAN subnet.

The following network configurations will prevent device communication and are not supported:
  • Desktop and devices on different Wi-Fi networks (e.g., devices on cellular/hotspot)
  • VPN clients that tunnel LAN traffic or block local subnet access
  • Guest Wi-Fi networks or access points with client isolation / AP isolation enabled
  • Corporate firewalls that block peer-to-peer traffic on the local subnet
If devices appear in the Devices page but tests hang or fail to connect to the game, check the network first.
Anthelion automatically installs required runtimes (Java JDK, Android SDK, Node.js, Python) during first launch. No manual setup needed.

Unity SDK Setup

The Anthelion SDK integrates into your Unity project as a package. It embeds a lightweight communication layer that enables test automation and live hierarchy inspection.

Installation

  1. Locate the SDK package. You will receive a .tgz file (e.g., com.anthelion.sdk-1.2.0.tgz) alongside the desktop application installer.
  2. Open your Unity project and navigate to Window → Package Manager.
  3. Click the + button in the top-left corner and select "Add package from tarball...".
  4. Browse to and select the .tgz file. Unity will import the com.anthelion.sdk package and resolve its dependency (com.unity.nuget.newtonsoft-json).
  5. Build your game normally. No code changes or manual initialization required. The SDK initializes automatically at runtime and remains dormant unless launched through Anthelion.
The SDK has zero impact on your game when not connected to Anthelion. It activates only when your build is launched by the Anthelion desktop application for testing or recording.

Supported Commands

The SDK ships with 25+ built-in commands including FindObject, Tap, Drag, SetText, GetText, GetHierarchy, CaptureScreenshot, LoadScene, and more. These are invoked remotely by test scripts and the Anthelion orchestrator.


Install the Desktop Application

Anthelion runs on both macOS and Windows. Follow the steps for your operating system. On either platform, the required runtimes (Java JDK, Android SDK, Node.js, Python) are downloaded automatically on first launch — see First Launch & Setup.

macOS

  1. Obtain the installer. You will receive a .dmg file (e.g., Anthelion-Standalone-1.2.0.dmg).
  2. Open the DMG and drag Anthelion.app into your Applications folder.
  3. Launch Anthelion from Applications. The application is notarized and signed, so it will open without any security prompts.

Windows

  1. Obtain the installer. You will receive an .exe file (e.g., Anthelion Orchestrator Setup 1.2.0.exe).
  2. Run the installer by double-clicking it. You can accept the default install location or choose your own, then follow the prompts to finish. A Start Menu entry and a desktop shortcut are created automatically.
  3. Launch Anthelion Orchestrator from the Start Menu or the desktop shortcut.
Windows SmartScreen warning. The current Windows build is not yet code-signed, so Windows may show a blue “Windows protected your PC” SmartScreen dialog the first time you run the installer. This is expected. Click More info, then Run anyway to continue. (Signed builds, which suppress this prompt, are coming in a future release.)
iOS testing is macOS only. The Windows build supports Android device testing. iOS automation depends on Xcode and is available only on macOS — the iOS-related settings appear greyed out on Windows.

Android Device Setup (USB Debugging)

To test on a physically-connected Android device, you must enable Developer options and USB debugging so Anthelion can detect and drive the device. This applies on both macOS and Windows.

1. Enable Developer Options

  1. On the Android device, open Settings → About phone (on some devices: About device → Software information).
  2. Find Build number and tap it seven times. You will see a “You are now a developer” confirmation.

2. Enable USB Debugging

  1. Go to Settings → System → Developer options (the exact location varies by manufacturer).
  2. Turn on USB debugging.
  3. Connect the device to your computer with a USB cable. On the device, an “Allow USB debugging?” prompt appears — tap Allow (tick Always allow from this computer to avoid being asked again).
Once USB debugging is allowed, the device appears automatically in the Anthelion Devices page (Source: Local). If it does not show up: unplug and replug the cable, confirm the “Allow USB debugging” prompt was accepted, and make sure the cable supports data transfer (not charge-only).
“Google Play Protect” prompt on install. Because Anthelion installs your game directly (not from the Play Store), Android’s Play Protect can show a “Send app for a security check?” dialog while the app installs — and if it is left open it blocks the app from starting, stalling the run. Anthelion automatically suppresses this on local devices at the start of each run, so you normally won’t see it. If it still appears on a newer Android device, disable it once: open the Play Store → tap your profile icon → Play ProtectSettings (gear icon) → turn off Scan apps with Play Protect. The app is already signed; this only affects Play Protect’s scan of sideloaded apps on your test device.
Run fails immediately with a “permission” error on some devices. If a run fails at session start with “An unknown server-side error… INSTALL_GRANT_RUNTIME_PERMISSIONS”, the device’s ROM is blocking apps installed over USB from auto-granting their permissions — which Appium needs to set up its on-device helper. This is a device-side restriction (it happens identically on macOS, not just Windows) and is fixed with one extra developer toggle, which varies by manufacturer:
  • Xiaomi / Redmi / POCO (MIUI/HyperOS) — in Developer options, enable USB debugging (Security settings) (requires signing into a Mi account). This is almost always the cause on these phones.
  • Oppo / realme / vivo (ColorOS/Funtouch) — enable Disable permission monitoring and Install via USB.
  • Other devices — enable Install via USB in Developer options.
After enabling it, unplug and replug the device, then re-run.
“Install via USB” popup appears every run (Xiaomi / Redmi / POCO). On MIUI/HyperOS you may see an “Install via USB — io.appium.uiautomator2.server” confirmation each time a run starts (Anthelion installs Appium’s on-device helper). If the “Remember my choice” checkbox is greyed out, MIUI is blocking it — that option only unlocks when the device is signed into a Mi account and online, so your choice can never stick and the prompt keeps returning. To stop it: sign into a Mi account and connect the phone to Wi‑Fi, then in Developer options enable Install via USB and USB debugging (Security settings) (both require the Mi account), and turn off Turn on MIUI optimization. MIUI also rate-limits this install path, so the security-settings route is what removes the prompt for good. This is a device-side MIUI restriction, not an Anthelion setting.

iOS Device Setup (WebDriverAgent)

Before you can run tests on any iOS device, you must build and sign WebDriverAgent (WDA) once on your machine. WDA is the bridge that lets Anthelion drive iOS devices; without a signed build of WDA from your Apple Developer account, iOS device automation will not work.

macOS only — this is a hard prerequisite for iOS testing. iOS automation requires Xcode and is available only on macOS; this entire section does not apply to the Windows build. Android users can skip it as well. iOS devices will appear in the Devices page only after WDA has been successfully built, signed, and trusted on the device. If iOS tests hang at session start or iOS devices fail to appear, this setup is almost always the cause.

You will need:

One-Time Setup Steps

These steps mirror the Settings → iOS Device Setup panel inside the Anthelion application. You can perform the setup from either location.

  1. In Anthelion, open Settings and click Open WebDriverAgent in Xcode. Xcode will launch with the bundled WDA project.
  2. In the Xcode scheme selector at the top of the window, select WebDriverAgentRunner (not WebDriverAgentLib or IntegrationApp).
  3. In the Xcode sidebar, select the WebDriverAgent project (blue project icon at the top).
  4. Select the WebDriverAgentLib target → Signing & Capabilities tab → enable Automatically manage signing and choose your Apple Developer Team from the dropdown.
  5. Select the WebDriverAgentRunner target and repeat the same signing setup (automatic signing, your Team).
  6. Change the WebDriverAgentRunner Bundle Identifier to a unique value, for example com.yourcompany.WebDriverAgentRunner. Xcode will reject duplicates if the default identifier is already registered.
  7. Connect your iOS device via USB and select it as the build destination in the Xcode toolbar.
  8. Clean the build folder with Cmd+Shift+K, then run the tests with Cmd+U. Xcode will build, sign, install, and launch WDA on the device.
  9. On the iOS device itself, open Settings → General → VPN & Device Management and trust the developer certificate that was just installed. Without this step, iOS will refuse to launch WDA.
This is a one-time setup per iOS device per machine. Once WDA is built, signed, and the developer certificate is trusted on the device, the device is ready for automated testing and will appear in the Devices page whenever it is connected via USB.
Signed WDA builds expire after 7 days for free Apple Developer accounts. If iOS tests suddenly stop working on a previously-working device, re-run Cmd+U in Xcode to rebuild and re-sign WDA.

First Launch & License Activation

On first launch, Anthelion runs a one-time setup that installs required runtimes and starts infrastructure services. This typically takes 2–5 minutes.

Step 1: Activate Your License

A license activation dialog appears automatically. Enter your license key in the format:

XXXXX-XXXXX-XXXXX-XXXXX

Click Activate. The license is validated and bound to your machine. You will see confirmation with your license details including expiration date and licensed features.

Your license is hardware-bound. If you change machines, contact your administrator to transfer the license.

Step 2: Automated Infrastructure Setup

After license activation, Anthelion automatically installs and configures the required runtime environment. A progress bar displays each phase:

PhaseWhat HappensProgress
Version ReconciliationChecks existing runtimes against required versions0–2%
Java JDKInstalls Eclipse Temurin JDK 17 (if needed)2–15%
Android SDKInstalls Android Build Tools 34 (if needed)15–35%
Node.jsInstalls Node.js 20 LTS (if needed)35–45%
PythonInstalls Python 3.13 runtime (if needed)45–55%
AppiumInstalls Appium with device drivers55–70%
ServerPrepares Anthelion server environment70–80%
Start AppiumLaunches Appium Device Farm service80–90%
Start ServerLaunches Anthelion server90–100%
Subsequent launches skip already-installed runtimes. Startup after the first run typically takes only 5–10 seconds.

Step 3: Ready

Once setup completes, you are taken to the Dashboard. Connect a device via USB to begin testing.


Sample Project: Trash Cat

Anthelion ships with a complete sample project built on Unity's Trash Cat (Endless Runner) game. This gives you a working example to explore before integrating the SDK into your own game — pre-built APK/IPA, a ready-made test workspace, and four test scripts covering common automation scenarios.

What's Included

When Anthelion launches for the first time, it automatically sets up the sample project in your Documents folder:

ComponentLocationDescription
Pre-built app ~/Documents/Anthelion/TrashCatAutomationWorkspace/builds/ Android APK and iOS IPA with the Anthelion SDK already embedded. Ready to install and test immediately — no Unity project setup needed.
Test workspace ~/Documents/Anthelion/TrashCatAutomationWorkspace/ A complete Anthelion workspace with a default test suite, helper scripts, and Lua automation scripts. Opens directly in the Workspace page.

Sample Test Scripts

The default suite includes four test scripts that demonstrate key Anthelion capabilities:

ScriptWhat It TestsConcepts Demonstrated
test_app_launch.py App installs, launches, and reaches the main screen Basic smoke test, device screenshots
test_gameplay.py Starts a game session, plays for 35 seconds, verifies game-over screen On-device Lua scripting (gameplay simulation at 60fps), wait_for_object with timeout, helper functions
test_settings.py Opens settings, adjusts master and music volume sliders, closes settings Resolution-independent drag (drag_adaptive), UI navigation via hierarchy paths
test_settings_by_obj_state.py Validates settings UI using component property assertions Whitebox property assertions, reading component state at runtime

Try It: Run the Sample Tests

  1. Open the workspace. In Anthelion, go to Workspace and open the TrashCatAutomationWorkspace folder. Its test suites and scripts appear in the explorer.
  2. Connect a device. Plug in an Android or iOS device via USB. It appears in the Devices page.
  3. Run the suite. Select a suite — for example daily_smoke_suite — click Run, and choose your device. Anthelion automatically installs the Trash Cat app, launches it, and runs the suite's tests in order, capturing screenshots at each step.
  4. Review results. After execution, go to Results to see pass/fail status, screenshots, video recordings, and detailed logs for each test.
💡
The sample scripts are great starting points for your own tests. Copy a script, modify the object paths and assertions to match your game, and you have a working test. The helpers/ folder shows how to extract reusable functions shared across scripts.

Integrating the SDK into Your Own Game

When you're ready to test your own game, the SDK integration is identical to how it's set up in the Trash Cat sample:

  1. Open your Unity project and go to Window → Package Manager.
  2. Click the + button and select "Add package from tarball...". Choose the .tgz SDK package file that ships with Anthelion.
  3. Build your game normally for Android (APK) or iOS (Xcode project → IPA). No additional configuration needed — the SDK auto-initializes at runtime.
The SDK requires no scene edits, no initialization code, and no manual setup. Once the package is added, it builds with your game and activates automatically when launched through Anthelion. The sample Trash Cat app uses the exact same integration — there's nothing special about it.

Application Pages

Anthelion organizes its interface into five main pages, accessible from the sidebar navigation on the left.

Dashboard

System overview, server status, device counts, and workspace management.

📱

Devices

View and manage connected Android and iOS devices.

📂

Workspace

Create test suites, record tests, edit scripts, and run executions.

📊

Results

View execution history, logs, videos, screenshots, and download reports.

Additional pages include Settings for application configuration and license management.

Dashboard

The Dashboard is your landing page after startup. It provides:

Devices

The Devices page shows all connected devices detected by Appium Device Farm.

Ensure your device has Developer Mode and USB Debugging enabled. For iOS, you also need to trust the computer on the device.
iOS prerequisite: iOS devices will only appear here after you have completed the one-time WebDriverAgent setup. Without a signed WDA build on your machine, iOS automation cannot start.
Network prerequisite: the device and the desktop machine running Anthelion must be on the same Wi-Fi network / LAN subnet. If a device shows up here but your tests cannot connect to the running game, this is almost always the cause. See System Requirements for the full list of unsupported network configurations.

Workspace

The Workspace is the primary interface for test development. It uses a three-panel layout: file explorer on the left, script editor in the center, and execution panel on the right. See the Workspace section below for full details.

Results

The Results page displays your complete test execution history. Each result shows status, device, duration, and pass/fail counts. Click any result to view detailed logs, video, screenshots, and callstacks. See the Results section below for full details.

Settings

The Settings page provides application configuration:


Workspace

The Workspace is where you build, record, and execute tests. It is organized into three panels and a menu bar.

Three-Panel Layout
PanelContents
Left — Explorer Tree view of your workspace structure: test suites (folders), scripts (files), builds (APK/IPA), and the workspace helpers folder.
Center — Editor Monaco code editor for test scripts with syntax highlighting, tab management, and inline insertion from staging. Also displays suite configuration when a suite is selected, and the workspace Automation Settings.
Right — Execution Device execution queues showing running and queued tests. Also hosts the hierarchy tree, device screen viewer, and command staging area during recording.

The menu bar at the top provides dropdown menus for workspace, script, build, compilation, execution, and save operations.

Automation Settings

Some runtime behaviour should be decided once for a whole project, not repeated in every suite. That lives in Automation Settings — a single automation.config.json at the root of your workspace, sitting next to workspace.config.json in the explorer. It is version-controlled with the project, so the whole team shares one definition.

The two files
FileWhat it is
automation.config.json
workspace root
The settings every suite inherits: how native permission dialogs are handled, and the catalog of dismissable in-game popups.
automation.override.config.json
inside a suite
Created only when one suite genuinely needs to differ. Absent for every suite that just inherits.

What you can set

💡
Declaring a popup in the catalog does not auto-dismiss it. The guard acts only where a test calls it. The catalog decides what a popup is; the script decides where to guard for it.

When a suite needs an override

Open a suite's override editor to change either setting for that suite alone. Both controls default to Inherit — leave them there and the suite simply follows the workspace.

Turning a popup off for a suite that tests it. Say a suite asserts that accepting the Starter Pack offer adds currency. If the shared guard closed that offer first, the test could never act on it. Tick StarterPackOffer under "Popups this suite handles itself" and the guard leaves it alone — in that suite only.

A suite can only subtract from the catalog. It can never define a popup of its own, because two definitions of the same popup is exactly the drift Automation Settings exists to remove. If an override ends up matching the workspace settings anyway, the editor offers to Remove override so the file does not linger as dead weight.

⚠️
Recording does not capture native-dialog decisions. A recorded script captures what you did inside the game, not the OS prompts that appeared alongside it — so playing through a permission prompt leaves no step behind. If a test needs to accept or decline one, set the mode here and add the steps yourself, either from the hierarchy menu's Dialog category or by hand. Only the automatic capture is missing, not the commands.

If you open a workspace created before Automation Settings existed, the app offers to move the old per-suite keys into it for you in one click. Until you accept, those old keys are ignored and the workspace runs on defaults.

Creating Test Suites & Scripts

Create a Test Suite

  1. Open the Workspace menu in the menu bar or right-click in the explorer panel.
  2. Select "Add Suite". Enter a name for the suite. A new folder is created in your workspace directory.
  3. The suite appears in the explorer tree. Expand it to view its scripts.

Add a Test Script

  1. Select a suite in the explorer, then go to Script → Add Script (or right-click the suite).
  2. Enter a script name and choose the language (Python, C#, or Java). Python is the primary language for test scripts.
  3. The script opens in the center editor with a template including imports, setup, and teardown boilerplate.

Suite Configuration

Each suite has a configuration (suite.config.json) that defines:

Select a suite and click the configuration icon to edit these settings in a visual editor.

Native permission dialogs and dismissable popups are not suite settings — they are shared across the workspace in Automation Settings, which a suite may override where it genuinely differs.

Managing Builds

Use Build → Add Build Files to import your game's APK (Android) or IPA (iOS) into the workspace. Set a build as the default for its platform so tests automatically install the correct build.

Helper Scripts

The Workspace Helpers folder is a special section in the explorer for shared utility code. Helper scripts are available to all test scripts in the workspace but are not executed directly as tests.

Use Cases

One concern per file

Anthelion auto-imports every helper file in a helpers folder, so you never edit an index or registry to add one. Because of that, keep one concern per file and name each file for what it does — _login.py, _menu_navigation.py, _currency_asserts.py — rather than collecting everything into a single module. Single-purpose files keep shared code easy to find, share, and override, and produce smaller, clearer diffs. The starter _common_helper.py you see in a new workspace is just a seed: rename it for its concern and add sibling files as new concerns appear.

Workspace vs Suite helpers

Helpers live at two levels, and the closer level wins:

Prefer the workspace level for anything two or more suites use; drop down to suite level only for suite-specific behavior.

Creating & using a Helper Script

Select the Workspace Helpers node (or a suite's helpers node) in the explorer and add a new script — it is created in the corresponding helpers directory and auto-imported. In a test, bring all in-scope helpers in with from helpers import * and call one by passing your test case, e.g. _login(self); the helper receives it as tc and can use tc.ant_driver and the tc.assert* methods.

Recording Tests

Recording lets you interact with your game on a real device and automatically capture those interactions as test script commands.

Start a Recording Session

  1. Open a test script in the editor that you want to record into.
  2. Go to Execution → Record Script from the menu bar.
  3. Select the target device from the device dropdown. Only online devices matching the script's target platform are shown.
  4. Select the build file (APK/IPA) to install. Anthelion automatically suggests the default build for the device's platform.
  5. Click Start Recording. Anthelion installs the build, launches the game, and begins capturing interactions.

During Recording

End Recording

Click Stop Recording. Any remaining staged commands can be reviewed and inserted. The script in the editor now contains all recorded commands.

Tip: Use Pause generously. Pause before navigating menus or performing setup steps, then resume when you reach the part of the game you want to test.

Live Screen Streaming & Raycast

The device screen viewer shows a real-time MJPEG stream of your device during recording or test execution.

Screen Interaction (Raycast)

Click anywhere on the device stream to perform a UI raycast. Anthelion sends the screen coordinates to the game's SDK, which identifies the UI element at that position. The matching element is then highlighted in the hierarchy tree, making it easy to:

Orientation

The viewer auto-detects portrait/landscape orientation. You can also toggle orientation manually using the rotation button.

Raycast only identifies UI elements (Canvas-based). For 3D objects with colliders, use the Physics Raycast commands from the context menu.

Command Staging Area

The staging area is a review buffer between command capture and script insertion. It operates in two modes:

ModeBehavior
Staging Mode (default) Commands are queued in the staging area for review. You can inspect each command's generated code, reorder, remove, and then insert individually or in batch.
Direct Insert Mode Commands bypass the staging area and are inserted directly into the script at the cursor position. Useful for fast-paced recording when you don't need to review each command.

Working with Staged Commands

Guarding a popup

A promo popup — a live-ops offer, a returning-player bundle — may appear on some runs and not others. A recorded tap on it fails on the runs where it never shows. A popup guard is the fix: it handles the popup if it's there and skips cleanly if it isn't.

  1. While recording, tap the popup's close control on the device so the step is captured like any other tap.
  2. Click the 🛡️ optional toggle on that step in the staging area.
  3. A confirmation dialog opens and waits for you — nothing is written until you accept it. Usually it shows the locators, the timeout, and which of the two forms below it will use; when the recorder can't tell which popup you meant it asks instead (see below). Cancel writes nothing and leaves the step a normal tap.
  4. Confirm, and the recorded tap is replaced by the guard.

Which form you get depends on whether the popup is already in Automation Settings:

The popup is…What gets written
in the catalog The guard names the catalog entry — dismiss_popup_if_present(popup="…") — and no locators are copied into your script. Move the popup in the game later and you fix it once, in Automation Settings.
not in the catalog
the default
The guard is written with its locators inline, as handle_popup(detect=…, action=…). It works, but that definition now lives in this one script — if the popup moves, every script that guards it needs editing.

A new workspace starts with an empty catalog, so the inline form is what you'll see first. To switch a guard to the shared by-name form: add the popup to Automation Settings, then guard the step again — the dialog will now recognise it.

In the inline form the recorder only has the one object you tapped, so both locators point at the close control rather than at the popup and then its button. That is deliberate and correct — a close control is on screen exactly when its popup is — but it's worth knowing, because the API Reference's hand-written handle_popup example points detect at the popup container instead. Both shapes are valid.

When the recorder has to ask

Sometimes the dialog can't settle the match on its own — the object you tapped could belong to more than one catalogued popup, or its name matches an entry that doesn't say where that popup lives. Rather than guess, the dialog shows a pick-list:

Giving each catalog entry a full path rather than a bare name is what lets the recorder answer this itself instead of asking you.
⚠️
You can only guard a popup you actually met. Guards follow what you did on the device, so there is no way to arm one ahead of a popup you haven't seen — and a popup that appears rarely may simply never turn up while you record. For those, hand-write dismiss_popup_if_present() — with no popup name — at the points where one could interrupt (after a menu return, say). It watches for every popup in the catalog at once, so you don't have to know which might show up, and does nothing at all when none do. This is also the answer for a popup you know about but can't reproduce on demand.
⚠️
One call closes one popup. The no-name form watches the whole catalog, but it stops at the first popup that appears — it does not keep going and clear the rest. If your game stacks them, a daily-reward dialog with a bundle offer behind it, one call leaves the second one on screen. Write one call per popup you expect to be stacked.

Context Menu & Auto Script Generation

Right-clicking any object in the hierarchy tree opens a context menu with commands organized by category. Each command generates the corresponding Python code and sends it to the staging area (or directly to the script).

Command Categories

CategoryCommandsDescription
Discovery Find Object (by Path, Name, Tag), Wait for Object, UI Raycast, Physics Raycast Locate and wait for game objects in the scene.
Interaction Tap Element, Get Text, Set Text, Drag Element, Swipe Gesture Interact with UI elements: tap buttons, read/write text fields, drag sliders.
Validation Assert Exists, Assert In (with property check) Verify that elements exist or that component properties have expected values.
Timing Add Sleep (2s / 5s), Get Time Scale, Set Time Scale Insert delays or control game time speed for testing animations or timed events.
Screenshot Capture Screenshot (full device), Screenshot Element Take screenshots of the full device screen or specific elements for visual validation.
Dialog Native dialog handling Handle system dialogs (permissions, alerts) that appear during gameplay.
🛡️
Popup guards are not in this menu. They follow what you actually did on the device: tap the popup's close control while recording, then flip that recorded step to a guard with the 🛡️ toggle in the staging area. Adding a guard from the hierarchy would not have dismissed the popup in front of you, so you would still have had to tap it — leaving a duplicate step behind.

Smart Filtering

The context menu automatically adapts to the selected object:

Property Inspection & Modification

For advanced validation, select an object in the hierarchy to open the Inspector Panel. This shows all components attached to the GameObject and their properties. You can:

Lua Scripting for Gameplay Automation

Anthelion supports Lua scripts that execute directly inside the Unity game runtime. Unlike Python test scripts that run externally and send commands over the network, Lua scripts run on the device within the game process.

When to Use Lua

Adding a Lua Script

  1. Create a Lua file in your workspace or add an existing .lua file.
  2. Write your automation logic using the Anthelion Lua API, which provides access to the game's scene objects and components.
  3. Reference the Lua script from your Python test using the execute_lua command, which uploads and runs the script on the device.
Lua scripts are executed by the AnthelionScriptEngine embedded in the Unity SDK. They have access to the full Unity API through the Anthelion Lua bindings.

Running Tests

Run a Single Script

  1. Open the script you want to run in the editor.
  2. Go to Execution → Play Script, or use the play button in the toolbar.
  3. Select the target device from the device selection dialog. You can select multiple devices to run the script in parallel.
  4. The test is queued on each selected device and execution begins.

Run a Full Suite

  1. Select the suite in the explorer.
  2. Go to Execution → Play Suite.
  3. Select target device(s). All scripts in the suite run in the configured order on each device.

Parallel Execution

Select multiple devices in the device selection dialog to run tests in parallel across devices. Each device executes independently with its own progress tracking.

Execution Panel

The right panel shows real-time execution status for each device:

Install Build
Launch App
Connect SDK
Execute Script
Cleanup
Results

Compilation (C# / Java)

If your test scripts or helper scripts use C# or Java (supplementary languages), you need to compile them before execution:

Compilation output is displayed in a dedicated modal showing success/failure and error messages.


Results

The Results page is your central hub for reviewing test execution outcomes. It displays a chronologically ordered history of all test runs.

Results List

Each result is displayed as a card showing:

Suite Grouping

When running a suite, individual script results are grouped under the suite execution. The suite card shows aggregate statistics (total scripts, passed, failed) with expandable per-script details.

Active Sessions

A pulsing badge on the Results navigation item indicates how many tests are currently running. Active sessions appear at the top of the results list with live status updates.

Pagination

Results are paginated (20 per page) with server-side pagination for performance. Navigate between pages using the pagination controls at the bottom.

Result Details

Click any result card to open the Test Results Viewer, which provides comprehensive diagnostic information organized into tabs:

High-level statistics for the test execution:

  • Total tests, passed, failed, and error counts.
  • Success rate as a percentage.
  • Total duration of the test run.
  • Device information — which device and platform the test ran on.

Individual test case results listed with:

  • Test name and class name.
  • Pass/fail status with duration.
  • Error message summary for failed tests.
  • Associated screenshots (if captured during the test).

Detailed failure analysis for each failed test:

  • Error type — the exception class (e.g., AssertionError, TimeoutError).
  • Error message — human-readable failure description.
  • Full callstack / traceback — the complete Python stack trace showing exactly where the test failed, including file names and line numbers.

Gallery of all screenshots captured during the test:

  • Screenshots are displayed as a grid with thumbnails.
  • Click any screenshot to view it in a lightbox viewer.
  • Each screenshot shows the associated test case, timestamp, and description.
  • Includes both manual capture_screenshot calls and automatic failure screenshots.

Step-by-step execution timeline showing:

  • Each command executed with its name, start time, end time, and duration.
  • Pass/fail status per step with color coding.
  • Error messages for failed steps.
  • Associated screenshot paths for visual context.
  • A linear, chronological view of the entire test execution flow.

Raw log output from the test execution:

  • Device logs — logcat (Android) or device console (iOS) output.
  • Appium logs — driver-level interaction logs.
  • Unity logs — game engine console output forwarded via the SDK.
  • Test script output — print statements and logging from your Python test.

Video Recording

When available, the results viewer includes an embedded video player showing a recording of the device screen during test execution. This is invaluable for understanding visual bugs, animation issues, and the exact sequence of UI changes.

Downloading Results & Reports

Anthelion provides two download formats for test results:

📦

ZIP Archive

Download the complete raw results including JSON data, screenshots, video recordings, and log files. Useful for archival and CI/CD integration.

📄

HTML Report

A self-contained HTML report with summary statistics, test case details, failure analysis, and embedded screenshots. Shareable with stakeholders who don't have access to Anthelion.

How to Download

HTML reports are fully self-contained with no external dependencies. They can be opened in any browser, emailed to team members, or attached to issue trackers.

Quick Reference

Test Script Structure (Python)

import unittest
from anthelion_driver import AnthelionDriver

class MyGameTest(unittest.TestCase):

    def setUp(self):
        self.driver = AnthelionDriver()
        self.driver.connect()

    def test_main_menu(self):
        # Find and tap a button
        btn = self.driver.find_object(by="name", value="PlayButton")
        btn.tap()

        # Wait for a scene element
        self.driver.wait_for_object(by="path", value="/Canvas/GamePanel")

        # Capture a screenshot
        self.driver.capture_screenshot("game_started")

        # Assert an element exists
        score = self.driver.find_object(by="name", value="ScoreText")
        self.assertIsNotNone(score)

    def tearDown(self):
        self.driver.disconnect()

if __name__ == '__main__':
    unittest.main()

Common Workflows

TaskSteps
Record a new test Create script → Execution → Record Script → Play game → Stop → Insert staged commands
Run tests on multiple devices Execution → Play Suite → Select multiple devices → Monitor in execution panel
Find a UI element by clicking During recording, click on device stream → Element highlights in hierarchy → Right-click for commands
Add an assertion Right-click element in hierarchy → Validation → Assert Exists or Assert In
Take a screenshot in a test Right-click element in hierarchy → Screenshot → Capture Screenshot
Share test results Results page → Click download HTML report icon → Share the HTML file

What Anthelion Does Not Support

Anthelion automates functional testing of your game's own content — UI, gameplay, scenes, and in-game flows. A few things fall outside that scope by design. This section documents them so expectations are clear.

Third-party ads (ad testing & ad dismissal)

Anthelion does not test, verify, or automatically dismiss third-party ads. This includes interstitial, rewarded, and banner ads served by ad-network and mediation SDKs such as Google AdMob, AppLovin MAX, Unity Ads, and ironSource / Unity LevelPlay. Anthelion cannot confirm ad fill, verify ad delivery, or interact with an ad while it is displayed.

There are two independent reasons for this:

Sources (ad-network policies): Google AdMob — Invalid traffic and How you can prevent invalid activity (“Clicking live ads in your own app is not allowed. Use test ads”); AppLovin — Policies for Publishers (“Impressions and clicks on ads must be the result of legitimate human end user activity”).

Recommended approach. During QA, enable your ad SDK's built-in test mode / test ad units so ads never bill real advertisers, and keep automated scripts on flows that do not depend on an ad being served.