""" Appium的主要设计理念: 1. 不需重新编译或修改被测应用程序 2. 不限于特定语言或框架 3. 使用WebDriver协议以保持API统一性 4. 开源和跨平台支持 """
Appium整体架构:
┌─────────────────────────────────────────────────────────────┐
│ Appium Client │
│ (Python/Java/JavaScript/Ruby/C#等语言绑定) │
└───────────────────────┬─────────────────────────────────────┘
│ HTTP请求 (WebDriver协议)
▼
┌─────────────────────────────────────────────────────────────┐
│ Appium Server │
│ (Node.js应用,核心调度中心) │
└───────────────────────┬─────────────────────────────────────┘
│ 平台特定协议
▼
┌─────────────────────────────────────────────────────────────┐
│ 平台特定驱动 (Android/iOS) │
│ (UiAutomator2, XCUITest, Espresso等) │
└───────────────────────┬─────────────────────────────────────┘
│ 设备原生API
▼
┌─────────────────────────────────────────────────────────────┐
│ 移动设备/模拟器 │
│ (Android手机/平板, iPhone/iPad) │
└─────────────────────────────────────────────────────────────┘
""" Appium Server基于Node.js,包含以下主要模块: 1. HTTP Server - 接收WebDriver协议请求 2. Router - 将请求路由到相应的处理程序 3. Drivers - 平台特定驱动管理器 4. Plugins - 插件系统 5. Session Manager - 会话管理 """
""" HTTP请求处理过程: 1. 客户端 → Appium Server: HTTP请求 (WebDriver协议) 2. Appium Server解析请求和期望功能 3. 根据平台(iOS/Android)将请求路由到相应的驱动程序 4. 驱动程序将WebDriver命令转换为平台原生命令 5. 平台驱动通过设备代理执行命令 6. 执行结果按相同路径返回给客户端 """
""" 会话创建过程: POST /session { "desiredCapabilities": { "platformName": "Android", "platformVersion": "10", "deviceName": "emulator-5554", "app": "/path/to/app.apk" } } 响应: { "sessionId": "12345678-1234-1234-1234-123456789012", "capabilities": {...} } """
UiAutomator2工作原理:
┌─────────────────┐ HTTP ┌─────────────────┐
│ Appium Server │ ?─────────? │ UiAutomator2 │
│ (Node.js) │ │ Server (APK) │
└─────────────────┘ └─────────┬───────┘
│ Binder IPC
▼
┌─────────────────┐
│ Android System │
│ UiAutomator │
│ Framework │
└─────────────────┘
""" UiAutomator2工作流程: 1. Appium Server启动时,检测设备状态 2. 安装并启动UiAutomator2 Server APK到设备上 3. UiAutomator2 Server在设备上开启HTTP服务(默认8200端口) 4. Appium Server将WebDriver命令转发给设备上的UiAutomator2 Server 5. UiAutomator2 Server通过Android UiAutomator框架执行命令 6. 命令结果返回给Appium Server,再返回给客户端 """
// UiAutomator2 Server中的关键组件
public class AppiumBootstrap {
// 接收Appium Server的命令
public JSONObject handleCommand(JSONObject command) {
String action = command.getString("action");
switch (action) {
case "findElement":
return findElement(command);
case "click":
return clickElement(command);
case "sendKeys":
return sendKeys(command);
}
}
private JSONObject findElement(JSONObject command) {
// 使用UiAutomator API查找元素
BySelector selector = buildSelector(command);
UiObject2 element = InstrumentationRegistry
.getInstrumentation()
.getUiAutomation()
.findObject(selector);
return convertToJSON(element);
}
}
""" Android元素定位的底层实现: 1. 客户端发送元素定位请求 2. Appium Server转发给UiAutomator2 Server 3. UiAutomator2使用Accessibility服务遍历视图层次结构 4. 通过UiAutomator API匹配元素 5. 返回元素的唯一标识符给客户端 支持的定位策略: - id: resource-id - accessibility_id: content-desc - xpath: XML布局路径 - class: 类名 - android_uiautomator: UiAutomator表达式 """
XCUITest工作原理:
┌─────────────────┐ HTTP ┌─────────────────┐
│ Appium Server │ ?─────────? │ WebDriverAgent │
│ (Node.js) │ │ (Runner App) │
└─────────────────┘ └─────────┬───────┘
│ XPC
▼
┌─────────────────┐
│ iOS System │
│ XCUITest │
│ Framework │
└─────────────────┘
WebDriverAgent (WDA) 工作流程:
注意:WDA需用开发者证书签名方可在真机上运行
// WebDriverAgent中的元素查找实现
- (NSArray<XCUIElement *> *)findElementsByXPath:(NSString *)xpath {
XCUIElementQuery *query = [self.application descendantsMatchingType:XCUIElementTypeAny];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"xpathLike == %@", xpath];
return [query matchingPredicate:predicate].allElementsBoundByIndex;
}
- (void)tapElement:(NSString *)elementId {
XCUIElement *element = [self elementForUUID:elementId];
[element tap];
}
Appium在标准WebDriver协议基础上进行了扩展:
Mobile JSON Wire Protocol (MJSONWP):
Appium定义的移动端扩展协议,在WebDriver协议基础上增加了移动设备特有的命令
# Python客户端代码
from appium import webdriver
desired_caps = {
'platformName': 'Android',
'platformVersion': '10',
'deviceName': 'emulator-5554',
'app': '/path/to/app.apk'
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 底层HTTP请求:
# POST http://localhost:4723/wd/hub/session
# {
# "desiredCapabilities": {...}
# }
Android点击操作流程:
文本输入流程:
手势操作实现:
底层使用TouchAction/MultiAction API模拟触摸事件序列
Android应用安装:
iOS应用安装:
Android应用启动:
driver.start_activity('com.package.name', '.MainActivity')
底层实现:
iOS应用启动:
driver.launch_app()
底层实现:
八、混合应用和WebView支持
- 上下文切换原理
混合应用自动化原理:
底层实现:
2. Chromedriver集成
Android WebView自动化:
要求:
九、Appium高级特性原理
- 图像识别原理
基于OpenCV的图像识别:
支持的功能:
2. 性能监控原理
性能数据收集:
Android:
iOS:
3. 日志收集原理
日志系统:
Android:
iOS:
Appium将设备日志实时转发到客户端
十、Appium 2.0架构变化
- 插件化架构
Appium 2.0核心变化:
安装驱动示例:
2. 新架构优势
Appium 2.0优势:
十一、常见问题原理分析
- Session创建失败
Session创建失败常见原因:
2. 元素查找超时
元素查找问题分析:
3. 手势操作不精确
手势操作精度问题:
总结
Appium的核心原理可以概括为:
理解Appium的底层原理有助于:
扫码加好友,拉您进群



收藏
