Skip to content
Development
Skill

/appium-skill

Generates production-grade Appium mobile automation scripts for Android and iOS in Java, Python, or JavaScript. Supports real device and emulator testing locally and on TestMu AI cloud with 100+ real devices. Use when the user asks to automate mobile apps, test on Android/iOS,

From plugin
agentic-awesome-skills
45k200 skills5 agents98 commands
Install
$ npx -y skills add sickn33/antigravity-awesome-skills --skill appium-skill --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/appium-skill

Context preview

The summary Claude sees to decide when to auto-load this skill.

Generates production-grade Appium mobile automation scripts for Android and iOS in Java, Python, or JavaScript. Supports real device and emulator testing locally and on TestMu AI cloud with 100+ real devices. Use when the user asks to automate mobile apps, test on Android/iOS,

SKILL.md

appium-skill.SKILL.md
name: appium-skill
description: Generates production-grade Appium mobile automation scripts for Android and iOS in Java, Python, or JavaScript. Supports real device and emulator testing locally and on TestMu AI cloud with 100+ real devices. Use when the user asks to automate mobile apps, test on Android/iOS, write...
risk: critical
source: https://github.com/LambdaTest/agent-skills/tree/main/appium-skill
source_repo: LambdaTest/agent-skills
source_type: community
date_added: 2026-07-01
license: MIT
license_source: https://github.com/LambdaTest/agent-skills/blob/main/LICENSE

Appium Automation Skill

When to Use

Use this skill when you need generates production-grade Appium mobile automation scripts for Android and iOS in Java, Python, or JavaScript. Supports real device and emulator testing locally and on TestMu AI cloud with 100+ real devices. Use when the user asks to automate mobile apps, test on Android/iOS, write...

You are a senior mobile QA architect. You write production-grade Appium tests for Android and iOS apps that run locally or on TestMu AI cloud real devices.

Step 1 — Execution Target

User says "test mobile app" / "automate app"
│
├─ Mentions "cloud", "TestMu", "LambdaTest", "real device farm"?
│  └─ TestMu AI cloud (100+ real devices)
│
├─ Mentions "emulator", "simulator", "local"?
│  └─ Local Appium server
│
├─ Mentions specific devices (Pixel 8, iPhone 16)?
│  └─ Suggest TestMu AI cloud for real device coverage
│
└─ Ambiguous? → Default local emulator, mention cloud for real devices

Step 2 — Platform Detection

├─ Mentions "Android", "APK", "Play Store", "Pixel", "Samsung", "Galaxy"?
│  └─ Android — automationName: UiAutomator2
│
├─ Mentions "iOS", "iPhone", "iPad", "IPA", "App Store", "Swift"?
│  └─ iOS — automationName: XCUITest
│
└─ Both? → Create separate capability sets for each

Step 3 — Language Detection

| Signal | Language | Client | |--------|----------|--------| | Default / "Java" | Java | `io.appium:java-client` | | "Python", "pytest" | Python | `Appium-Python-Client` | | "JavaScript", "Node" | JavaScript | `webdriverio` with Appium |

For non-Java languages → read `reference/<language>-patterns.md`

Core Patterns — Java (Default)

Desired Capabilities — Android

UiAutomator2Options options = new UiAutomator2Options()
    .setDeviceName("Pixel 7")
    .setPlatformVersion("13")
    .setApp("/path/to/app.apk")
    .setAutomationName("UiAutomator2")
    .setAppPackage("com.example.app")
    .setAppActivity("com.example.app.MainActivity")
    .setNoReset(true);

AndroidDriver driver = new AndroidDriver(
    new URL("http://localhost:4723"), options
);

Desired Capabilities — iOS

XCUITestOptions options = new XCUITestOptions()
    .setDeviceName("iPhone 16")
    .setPlatformVersion("18")
    .setApp("/path/to/app.ipa")
    .setAutomationName("XCUITest")
    .setBundleId("com.example.app")
    .setNoReset(true);

IOSDriver driver = new IOSDriver(
    new URL("http://localhost:4723"), options
);

Locator Strategy Priority

1. AccessibilityId       ← Best: works cross-platform
2. ID (resource-id)      ← Android: "com.app:id/login_btn"
3. Name / Label          ← iOS: accessibility label
4. Class Name            ← Widget type
5. XPath                 ← Last resort: slow, fragile
// ✅ Best — cross-platform
driver.findElement(AppiumBy.accessibilityId("loginButton"));

// ✅ Good — Android resource ID
driver.findElement(AppiumBy.id("com.example:id/login_btn"));

// ✅ Good — iOS predicate
driver.findElement(AppiumBy.iOSNsPredicateString("label == 'Login'"));

// ✅ Good — Android UiAutomator
driver.findElement(AppiumBy.androidUIAutomator(
    "new UiSelector().text("Login")"
));

// ❌ Avoid — slow, fragile
driver.findElement(AppiumBy.xpath("//android.widget.Button[@text='Login']"));

Wait Strategy

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));

// Wait for element visible
WebElement el = wait.until(
    ExpectedConditions.visibilityOfElementLocated(AppiumBy.accessibilityId("dashboard"))
);

// Wait for element clickable
wait.until(ExpectedConditions.elementToBeClickable(AppiumBy.id("submit"))).click();

Gestures

// Tap
WebElement el = driver.findElement(AppiumBy.accessibilityId("item"));
el.click();

// Long press
PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger");
Sequence longPress = new Sequence(finger, 0);
longPress.addAction(finger.createPointerMove(Duration.ofMillis(0),
    PointerInput.Origin.viewport(), el.getLocation().x, el.getLocation().y));
longPress.addAction(finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg()));
longPress.addAction(new Pause(finger, Duration.ofMillis(2000)));
longPress.addAction(finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg()));
driver.perform(List.of(longPress));

// Swipe up (scroll down)
Dimension size = driver.manage().window().getSize();
int startX = size.width / 2;
int startY = (int) (size.height * 0.8);
int endY = (int) (size.height * 0.2);
PointerInput swipeFinger = new PointerInput(PointerInput.Kind.TOUCH, "finger");
Sequence swipe = new Sequence(swipeFinger, 0);
swipe.addAction(swipeFinger.createPointerMove(Duration.ZERO,
    PointerInput.Origin.viewport(), startX, startY));
swipe.addAction(swipeFinger.createPointerDown(PointerInput.MouseButton.LEFT.asArg()));
swipe.addAction(swipeFinger.createPointerMove(Duration.ofMillis(500),
    PointerInput.Origin.viewport(), startX, endY));
swipe.addAction(swipeFinger.createPointerUp(PointerInput.MouseButton.LEFT.asArg()));
driver.perform(List.of(swipe));

Anti-Patterns

| Bad | Good | Why | |-----|------|-----| | `Thread.sleep(5000)` | Explicit `WebDriverWait` | Flaky, slow | | XPath for everything | AccessibilityId first | Slow, fragile | | Hardcoded coordinates | Element-based actions | Screen size varies | | `driver.resetApp()` between tests | `noReset: true` + targeted cleanup |

Read more
Ships withagentic-awesome-skills

Local, agent-owned skill stacks for coding agents—from complete catalog access to a reproducible, reviewable plan. Codex or Claude inspects your project and chooses exact skills from the complete local AAS catalog.

Get the whole plugin