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

Appium 与 Selenium 有什么区别?

2月21日 16:20

Appium 与 Selenium 是两个不同的自动化测试工具,虽然它们都基于 WebDriver 协议,但在应用场景、架构设计和功能特性上存在显著差异。以下是 Appium 与 Selenium 的详细对比:

基本概念

Selenium

Selenium 是一个用于 Web 应用程序自动化测试的工具集,主要用于:

  • 浏览器自动化测试
  • Web 应用功能测试
  • 跨浏览器测试

Appium

Appium 是一个用于移动应用程序自动化测试的工具,主要用于:

  • 移动应用自动化测试
  • 原生应用、混合应用和移动 Web 测试
  • 跨平台移动测试

主要区别

1. 应用场景

javascript
// Selenium - Web 浏览器测试 const { Builder, By, until } = require('selenium-webdriver'); const driver = await new Builder() .forBrowser('chrome') .build(); await driver.get('https://example.com'); const element = await driver.findElement(By.id('submit_button')); await element.click(); // Appium - 移动应用测试 const { Builder, By, until } = require('selenium-webdriver'); const capabilities = { platformName: 'Android', deviceName: 'Pixel 5', app: '/path/to/app.apk' }; const driver = await new Builder() .withCapabilities(capabilities) .build(); const element = await driver.findElement(By.id('submit_button')); await element.click();

区别

  • Selenium:专注于 Web 浏览器自动化
  • Appium:专注于移动应用自动化

2. 支持的平台

特性SeleniumAppium
Web 浏览器✅ 支持✅ 支持(移动 Web)
Android 原生应用❌ 不支持✅ 支持
iOS 原生应用❌ 不支持✅ 支持
Windows 桌面应用❌ 不支持✅ 支持
混合应用❌ 不支持✅ 支持

3. 架构设计

Selenium 架构

shell
Test Script → Selenium WebDriver → Browser Driver → Browser

Appium 架构

shell
Test Script → Appium Client → Appium Server → Automation Engine → Mobile Device

区别

  • Selenium:直接与浏览器驱动通信
  • Appium:通过 Appium Server 与设备通信

4. 自动化引擎

Selenium

  • 使用浏览器内置的自动化引擎
  • 每个浏览器有特定的驱动(ChromeDriver, GeckoDriver 等)
  • 直接与浏览器 API 交互

Appium

  • 使用平台特定的自动化引擎
  • Android:UiAutomator2, Espresso
  • iOS:XCUITest
  • Windows:WinAppDriver

5. 元素定位策略

Selenium

javascript
// Selenium 支持的定位策略 By.id('element_id') By.className('element_class') By.tagName('button') By.cssSelector('#submit-button') By.xpath('//button[@id="submit"]') By.name('element_name') By.linkText('Submit') By.partialLinkText('Sub')

Appium

javascript
// Appium 支持的定位策略(包含 Selenium 的所有策略) By.id('element_id') By.className('element_class') By.xpath('//android.widget.Button[@text="Submit"]') By.accessibilityId('submit_button') By.androidUIAutomator('new UiSelector().text("Submit")') By.iOSNsPredicateString('name == "Submit"') By.iOSClassChain('**/XCUIElementTypeButton[`name == "Submit"`]')

区别

  • Appium 继承了 Selenium 的所有定位策略
  • Appium 增加了移动应用特有的定位策略

6. 手势操作

Selenium

javascript
// Selenium 手势操作有限 await element.click(); await element.sendKeys('text'); await element.clear();

Appium

javascript
// Appium 支持丰富的手势操作 await element.click(); await element.sendKeys('text'); await element.clear(); // 触摸操作 await driver.touchActions([ { action: 'press', x: 100, y: 200 }, { action: 'moveTo', x: 100, y: 100 }, { action: 'release' } ]); // 多点触控 const actions = driver.actions({ async: true }); await actions.move({ origin: element1 }).press() .move({ origin: element2 }).press() .pause(100) .move({ origin: element1 }).release() .move({ origin: element2 }).release() .perform();

区别

  • Selenium:手势操作有限
  • Appium:支持丰富的手势和多点触控

7. 上下文切换

Selenium

javascript
// Selenium 不需要上下文切换 // 直接操作浏览器元素 const element = await driver.findElement(By.id('submit_button')); await element.click();

Appium

javascript
// Appium 需要处理上下文切换 // 获取所有上下文 const contexts = await driver.getContexts(); console.log('Available contexts:', contexts); // ['NATIVE_APP', 'WEBVIEW_com.example.app'] // 切换到 WebView await driver.context('WEBVIEW_com.example.app'); // 操作 WebView 元素 const element = await driver.findElement(By.id('submit_button')); await element.click(); // 切换回原生应用 await driver.context('NATIVE_APP');

区别

  • Selenium:不需要上下文切换
  • Appium:需要在原生应用和 WebView 之间切换

8. 设备能力

Selenium

javascript
// Selenium 设备能力有限 const capabilities = { browserName: 'chrome', platformName: 'Windows', version: 'latest' };

Appium

javascript
// Appium 支持丰富的设备能力 const capabilities = { platformName: 'Android', platformVersion: '11.0', deviceName: 'Pixel 5', udid: 'emulator-5554', app: '/path/to/app.apk', appPackage: 'com.example.app', appActivity: '.MainActivity', autoGrantPermissions: true, noReset: true, fullReset: false, automationName: 'UiAutomator2', language: 'zh-CN', locale: 'zh_CN' };

区别

  • Selenium:设备能力有限
  • Appium:支持丰富的设备配置

9. 测试框架集成

Selenium

javascript
// Selenium 与测试框架集成 const { describe, it, before, after } = require('mocha'); const { Builder, By, until } = require('selenium-webdriver'); describe('Web Application Test', () => { let driver; before(async () => { driver = await new Builder().forBrowser('chrome').build(); }); it('should submit form', async () => { await driver.get('https://example.com'); const element = await driver.findElement(By.id('submit_button')); await element.click(); }); after(async () => { await driver.quit(); }); });

Appium

javascript
// Appium 与测试框架集成 const { describe, it, before, after } = require('mocha'); const { Builder, By, until } = require('selenium-webdriver'); describe('Mobile Application Test', () => { let driver; before(async () => { const capabilities = { platformName: 'Android', deviceName: 'Pixel 5', app: '/path/to/app.apk' }; driver = await new Builder().withCapabilities(capabilities).build(); }); it('should submit form', async () => { const element = await driver.findElement(By.id('submit_button')); await element.click(); }); after(async () => { await driver.quit(); }); });

区别

  • 两者都可以与测试框架集成
  • Appium 需要配置移动设备能力

10. 性能考虑

Selenium

  • 运行在浏览器中
  • 性能主要取决于浏览器和网络
  • 相对稳定和可预测

Appium

  • 运行在移动设备上
  • 性能取决于设备性能和网络
  • 受设备状态和系统资源影响

选择建议

使用 Selenium 的场景

  1. Web 应用测试

    • 测试 Web 应用程序
    • 跨浏览器测试
    • 响应式设计测试
  2. 回归测试

    • Web 应用回归测试
    • 持续集成测试
  3. 性能测试

    • Web 应用性能测试
    • 页面加载时间测试

使用 Appium 的场景

  1. 移动应用测试

    • 原生应用测试
    • 混合应用测试
    • 移动 Web 测试
  2. 跨平台测试

    • Android 和 iOS 应用测试
    • 跨设备兼容性测试
  3. 功能测试

    • 移动应用功能测试
    • 用户体验测试

总结

特性SeleniumAppium
主要用途Web 应用测试移动应用测试
支持平台Web 浏览器Android, iOS, Windows
架构直接与浏览器驱动通信通过 Appium Server 与设备通信
自动化引擎浏览器内置引擎平台特定引擎
元素定位Web 元素定位移动应用元素定位
手势操作有限丰富
上下文切换不需要需要
设备能力有限丰富
学习曲线相对简单相对复杂

Selenium 和 Appium 都是强大的自动化测试工具,选择哪个取决于你的测试需求。如果需要测试 Web 应用,选择 Selenium;如果需要测试移动应用,选择 Appium。

标签:SeleniumAppium