乐闻世界logo
搜索文章和话题

What is the working principle of Appium?

2月21日 16:19

Appium's working principle is based on client-server architecture and WebDriver protocol, interacting with mobile devices through automation engines. Here's a detailed explanation of how Appium works:

Architecture Components

1. Appium Server

Appium Server is the core component responsible for:

  • Receiving HTTP requests from clients
  • Parsing WebDriver commands
  • Converting commands to platform-specific operations
  • Communicating with mobile devices or emulators
  • Returning execution results to clients

2. Appium Client

Appium Client is client libraries in various languages:

  • Provides language-specific APIs
  • Wraps HTTP requests
  • Simplifies test code writing
  • Supports multiple programming languages

3. Automation Engine

Different platforms use different automation engines:

  • iOS: XCUITest (iOS 9.3+), UIAutomation (iOS 9.2-)
  • Android: UiAutomator2 (Android 5.0+), UiAutomator (Android 4.2-)
  • Windows: WinAppDriver

Workflow

1. Session Creation

javascript
// Client code const { Builder } = require('selenium-webdriver'); const capabilities = { platformName: 'Android', deviceName: 'emulator-5554', app: '/path/to/app.apk', automationName: 'UiAutomator2' }; const driver = await new Builder() .withCapabilities(capabilities) .usingServer('http://localhost:4723/wd/hub') .build();

Steps:

  1. Client sends POST /session request
  2. Server parses desired capabilities
  3. Selects appropriate automation engine based on platform
  4. Starts application and establishes session
  5. Returns session ID to client

2. Element Location

javascript
// Locate by ID const element = await driver.findElement(By.id('com.example.app:id/button')); // Locate by XPath const element = await driver.findElement(By.xpath('//android.widget.Button[@text="Submit"]')); // Locate by Accessibility ID const element = await driver.findElement(By.accessibilityId('submit-button'));

Location Process:

  1. Client sends element location request
  2. Server converts location strategy to platform-specific query
  3. Automation engine executes query on device
  4. Returns matching elements

3. Element Operations

javascript
// Click element await element.click(); // Send text await element.sendKeys('Hello World'); // Get attribute const text = await element.getText();

Operation Process:

  1. Client sends operation command
  2. Server converts command to platform-specific operation
  3. Automation engine executes operation on device
  4. Returns operation result

WebDriver Protocol

Appium follows W3C WebDriver standard:

HTTP Endpoints

shell
POST /session # Create new session DELETE /session/:id # Delete session GET /session/:id/element # Find element POST /session/:id/element/:id/click # Click element

JSON Wire Protocol

Requests and responses use JSON format:

json
// Request { "desiredCapabilities": { "platformName": "Android", "deviceName": "emulator-5554" } } // Response { "value": { "element-6066-11e4-a52e-4f735466cecf": "0.123456789" }, "status": 0 }

Platform-specific Implementation

Android Implementation

javascript
const capabilities = { platformName: 'Android', automationName: 'UiAutomator2', appPackage: 'com.example.app', appActivity: '.MainActivity', deviceName: 'Android Emulator', platformVersion: '11.0' };

Working Principle:

  1. Appium Server starts UiAutomator2 server
  2. Installs test APK on device
  3. Communicates with device via ADB
  4. Executes operations using UiAutomator2 API

iOS Implementation

javascript
const capabilities = { platformName: 'iOS', automationName: 'XCUITest', bundleId: 'com.example.app', deviceName: 'iPhone 14', platformVersion: '16.0', udid: 'auto' };

Working Principle:

  1. Appium Server uses XCUITest framework
  2. Communicates with device via WebDriverAgent
  3. Executes operations using XCUITest API
  4. Supports real devices and simulators

Hybrid Application Handling

Context Switching

javascript
// Get all contexts const contexts = await driver.getContexts(); console.log(contexts); // ['NATIVE_APP', 'WEBVIEW_com.example.app'] // Switch to WebView await driver.context('WEBVIEW_com.example.app'); // Operate in WebView const element = await driver.findElement(By.css('#submit-button')); await element.click(); // Switch back to native context await driver.context('NATIVE_APP');

Handling Process:

  1. Detect WebViews in application
  2. Get all available contexts
  3. Switch to WebView context
  4. Use WebDriver API to operate WebView
  5. Switch back to native context

Desired Capabilities

Desired Capabilities are key parameters for configuring sessions:

javascript
const capabilities = { // Platform related platformName: 'Android', platformVersion: '11.0', deviceName: 'Pixel 5', // Application related app: '/path/to/app.apk', appPackage: 'com.example.app', appActivity: '.MainActivity', bundleId: 'com.example.app', // Automation related automationName: 'UiAutomator2', noReset: true, fullReset: false, // Other configuration newCommandTimeout: 60, autoGrantPermissions: true };

Communication Mechanism

HTTP Communication

Appium uses HTTP protocol for communication:

shell
Client (HTTP Request) → Appium Server → Automation Engine → Device Client (HTTP Response) ← Appium Server ← Automation Engine ← Device

WebSocket Communication

Appium 2.0 supports WebSocket for better performance:

javascript
const { Builder } = require('selenium-webdriver'); const driver = await new Builder() .usingServer('ws://localhost:4723') .withCapabilities(capabilities) .build();

Best Practices

  1. Reasonable Use of Desired Capabilities:

    • Only configure necessary parameters
    • Use default values to reduce configuration
    • Adjust configuration based on platform
  2. Optimize Element Location:

    • Prioritize stable location strategies
    • Avoid using fragile XPath
    • Use Accessibility ID for better maintainability
  3. Handle Asynchronous Operations:

    • Use explicit waits
    • Avoid hard-coded wait times
    • Handle loading states
  4. Error Handling:

    • Catch and handle exceptions
    • Provide clear error messages
    • Implement retry mechanisms

Appium's working principle through standardized WebDriver protocol and platform-specific automation engines provides a powerful and flexible solution for mobile application automation testing.

标签:Appium