본문으로 건너뛰기
cccskills
무료GitHub에 공개

appium-skill

Create Appium tests that automate Android and iOS app interactions in Java, Python, or JavaScript. Configure local devices, emulators, simulators, or TestMu AI cloud devices, with guidance on element selection, waits, and gestures.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

원문원문 설명 보기

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.

설치 방법 보기

이럴 때 유용합니다

  • Automate login tests for Android and iOS apps
  • Create tests for local emulators and simulators
  • Configure real-device tests on TestMu AI cloud
  • Improve element selection and waits in existing tests

포함된 파일(1)

  • SKILL.md11.1 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

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

SignalLanguageClient
Default / "Java"Javaio.appium:java-client
"Python", "pytest"PythonAppium-Python-Client
"JavaScript", "Node"JavaScriptwebdriverio 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

BadGoodWhy
Thread.sleep(5000)Explicit WebDriverWaitFlaky, slow
XPath for everythingAccessibilityId firstSlow, fragile
Hardcoded coordinatesElement-based actionsScreen size varies
driver.resetApp() between testsnoReset: true + targeted cleanupSlow, state issues
Same caps for Android + iOSSeparate capability setsDifferent locators/APIs

Test Structure (JUnit 5)

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.options.UiAutomator2Options;
import org.junit.jupiter.api.*;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.net.URL;
import java.time.Duration;

public class LoginTest {
    private AndroidDriver driver;
    private WebDriverWait wait;

    @BeforeEach
    void setUp() throws Exception {
        UiAutomator2Options options = new UiAutomator2Options()
            .setDeviceName("emulator-5554")
            .setApp("/path/to/app.apk")
            .setAutomationName("UiAutomator2");

        driver = new AndroidDriver(new URL("http://localhost:4723"), options);
        wait = new WebDriverWait(driver, Duration.ofSeconds(15));
    }

    @Test
    void testLoginSuccess() {
        wait.until(ExpectedConditions.visibilityOfElementLocated(
            AppiumBy.accessibilityId("emailInput"))).sendKeys("user@test.com");
        driver.findElement(AppiumBy.accessibilityId("passwordInput"))
            .sendKeys("password123");
        driver.findElement(AppiumBy.accessibilityId("loginButton")).click();
        wait.until(ExpectedConditions.visibilityOfElementLocated(
            AppiumBy.accessibilityId("dashboard")));
    }

    @AfterEach
    void tearDown() {
        if (driver != null) driver.quit();
    }
}

TestMu AI Cloud — Quick Setup

// Upload app first:
// curl -u "user:key" --location --request POST
//   'https://manual-api.lambdatest.com/app/upload/realDevice'
//   --form 'name="app"' --form 'appFile=@"/path/to/app.apk"'
// Response: { "app_url": "lt://APP1234567890" }

UiAutomator2Options options = new UiAutomator2Options();
options.setPlatformName("android");
options.setDeviceName("Pixel 7");
options.setPlatformVersion("13");
options.setApp("lt://APP1234567890");  // from upload response
options.setAutomationName("UiAutomator2");

HashMap<String, Object> ltOptions = new HashMap<>();
ltOptions.put("w3c", true);
ltOptions.put("build", "Appium Build");
ltOptions.put("name", "Login Test");
ltOptions.put("isRealMobile", true);
ltOptions.put("video", true);
ltOptions.put("network", true);
options.setCapability("LT:Options", ltOptions);

String hub = "https://" + System.getenv("LT_USERNAME") + ":"
           + System.getenv("LT_ACCESS_KEY") + "@mobile-hub.lambdatest.com/wd/hub";
AndroidDriver driver = new AndroidDriver(new URL(hub), options);

Test Status Reporting

((JavascriptExecutor) driver).executeScript(
    "lambda-status=" + (testPassed ? "passed" : "failed")
);

Validation Workflow

  1. Platform caps: Correct automationName (UiAutomator2 / XCUITest)
  2. Locators: AccessibilityId first, no absolute XPath
  3. Waits: Explicit WebDriverWait, zero Thread.sleep()
  4. Gestures: Use W3C Actions API, not deprecated TouchAction
  5. App upload: Use lt:// URL for cloud, local path for emulator
  6. Timeout: 30s+ for real devices (slower than emulators)

Quick Reference

TaskCode
Start Appium serverappium (CLI) or appium --relaxed-security
Install appdriver.installApp("/path/to/app.apk")
Launch appdriver.activateApp("com.example.app")
Background appdriver.runAppInBackground(Duration.ofSeconds(5))
Screenshotdriver.getScreenshotAs(OutputType.FILE)
Device orientationdriver.rotate(ScreenOrientation.LANDSCAPE)
Hide keyboarddriver.hideKeyboard()
Push file (Android)driver.pushFile("/sdcard/test.txt", bytes)
Context switchdriver.context("WEBVIEW_com.example")
Get contextsdriver.getContextHandles()

Reference Files

FileWhen to Read
reference/cloud-integration.mdApp upload, real devices, capabilities
reference/python-patterns.mdPython + pytest-appium
reference/javascript-patterns.mdJS + WebdriverIO-Appium
reference/ios-specific.mdiOS-only patterns, XCUITest driver
reference/hybrid-apps.mdWebView testing, context switching

Deep Patterns → reference/playbook.md

§SectionLines
1Project Setup & CapabilitiesMaven, Android/iOS options
2BaseTest with Thread-Safe DriverThreadLocal, multi-platform
3Cross-Platform Page ObjectsAndroidFindBy/iOSXCUITFindBy
4Advanced Gestures (W3C Actions)Swipe, long press, pinch zoom, scroll
5WebView & Hybrid App TestingContext switching
6Device InteractionsFiles, notifications, clipboard, geo
7Parallel Device ExecutionMulti-device TestNG XML
8LambdaTest Real Device CloudCloud grid integration
9CI/CD IntegrationGitHub Actions, emulator runner
10Debugging Quick-Reference12 common problems
11Best Practices Checklist13 items

Limitations

  • Use this skill only when the task clearly matches its upstream source and local project context.
  • Verify commands, generated code, dependencies, credentials, and external service behavior before applying changes.
  • Do not treat examples as a substitute for environment-specific tests, security review, or user approval for destructive or costly actions.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Assess a new or existing AI project by examining its code, goals, and constraints. Recommend skills confirmed to exist in the available registry, then outline tasks and implementation phases with dependencies, completion criteria, and checks.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Planning the first steps of a new AI project
  • Assessing technical issues in an existing project
  • Selecting relevant skills from an available registry
sickn33/agentic-awesome-skills4.8만2026년 10월 19일 업데이트

007

무료

Review code and infrastructure for security risks, map potential threats, and plan stronger defenses. The skill covers OWASP checks, attack and defense exercises, and incident response, with validation required for each environment.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Reviewing code and infrastructure security
  • Mapping threats with STRIDE or PASTA
  • Planning stronger security settings
sickn33/agentic-awesome-skills4.8만2026년 10월 19일 업데이트

Turn a repeatable task into an Andru.ia skill with clear inputs, outputs, examples, and limits. Draft SKILL.md, check the folder structure and required validations, and prepare a pull request describing the changes for review.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Creating a skill for a repeatable task
  • Improving an existing skill’s examples and limits
  • Validating skill files and preparing a pull request
sickn33/agentic-awesome-skills4.8만2026년 10월 19일 업데이트

Prepare an industry briefing once a project's sector is defined. It covers sector context, potentially applicable regulations, familiar interface patterns, technology choices, and risks, while separating verified evidence from hypotheses and questions requiring further review.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Researching industry requirements before product design
  • Checking regulations for a project's jurisdiction
  • Choosing interface patterns familiar to target users
sickn33/agentic-awesome-skills4.8만2026년 10월 19일 업데이트

Create presentation drafts from text, outlines, or documents through the 2slides API. Match a reference image's style, choose themes, add AI voice narration, and export slide images or audio for review and use.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Create a presentation from text or an outline
  • Summarize a document into slides
  • Match slide styling to a reference image
sickn33/agentic-awesome-skills4.8만2026년 10월 19일 업데이트

Plan a 360-degree or peer feedback process and create empty response templates from confirmed requirements. Produces consistent CSV, SQL, JSON Schema, or Notion property mappings while keeping visibility choices and scoring configuration separate.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Plan an anonymous peer feedback process
  • Create a CSV template for feedback responses
  • Align feedback fields across SQL and JSON Schema
sickn33/agentic-awesome-skills4.8만2026년 10월 19일 업데이트

sickn33의 스킬 모두 보기

이 스킬의 문제 신고