Appium2.0:发生了哪些重大变化?

Appium2.0发生了哪些变化

1. 平台驱动独立

在Appium 2.0中,平台驱动(driver)与Appium Server实现了分离。这意味着驱动可以独立安装和升级,不再依赖于Appium Server的更新。例如,Android平台的UIAutomator和iOS平台的XCUITest等驱动,都可以根据需要单独进行安装和更新。这一变化提高了Appium的灵活性和可扩展性,使得开发者能够更容易地应对不同平台和设备的测试需求。

2. 插件生态系统的引入

Appium 2.0引入了插件生态系统,将一些非核心组件功能转移到了插件中。这不仅简化了Appium的核心功能,还使得开发者能够通过插件扩展更多的新功能。例如,通过官方的images插件,开发者可以使用图像识别来定位元素;而使用第三方插件appium-device-farm,则可以集中管理测试设备。插件生态系统的引入为Appium带来了更多的可能性和灵活性。

3. 严格遵循W3C协议

Appium 2.0严格遵循W3C协议,与Selenium 4类似。这意味着在编写测试脚本时,需要遵循W3C标准来填写capabilities。例如,在Appium 2.0中,非标准的W3C协议中的capabilities需要添加appium:前缀。这一变化使得Appium更加符合国际标准,提高了与其他测试工具的兼容性。

4. 安装与配置的变化

Appium 2.0的安装和配置也发生了一些变化。首先,Appium 2.0需要基于Node.js环境进行安装,并对Node.js的版本有特定要求。其次,在安装Appium 2.0时,需要使用appium@next参数进行安装(在正式发布后可使用appium参数)。此外,Appium 2.0还引入了Appium Extension CLI模式,用于扩展安装各种平台驱动和插件。

5. 测试脚本的编写与运行

在Appium 2.0中,测试脚本的编写与运行也发生了一些变化。首先,由于Appium Server的访问地址发生了变化(不再需要后缀/wd/hub),因此需要更新测试脚本中的访问地址。其次,由于Appium 2.0引入了插件和驱动分离的概念,因此需要根据需要安装和配置相应的驱动和插件。最后,由于Appium 2.0严格遵循W3C协议,因此需要更新测试脚本中的capabilities格式,以确保与Appium Server的兼容性。

环境搭建

  1. 安装Node.js

    首先,确保你的系统上安装了Node.js。可以从Node.js官网下载并安装最新版本的Node.js。

  2. 安装Appium

    使用npm安装Appium。打开命令行工具,输入以下命令:

    bash 复制代码
    npm install -g appium

    这将全局安装Appium,使其可以在命令行中直接使用。

  3. 安装Appium客户端库

    根据你选择的编程语言,安装相应的Appium客户端库。例如,如果你使用Python,可以安装Appium-Python-Client:

    bash 复制代码
    pip install Appium-Python-Client
  4. 启动Appium服务器

    在命令行中输入以下命令启动Appium服务器:

    bash 复制代码
    appium

    或者,你也可以使用Appium Desktop,一个图形化工具,用于启动和管理Appium服务器,以及进行元素定位和调试。

基本使用方法

  1. 设置Desired Capabilities

    Desired Capabilities是一个JSON对象,用于描述测试会话的配置信息,如平台名称、设备名称、应用路径等。以下是一个示例:

    json 复制代码
    {
      "platformName": "Android",
      "platformVersion": "10",
      "deviceName": "emulator-5554",
      "app": "/path/to/your/app.apk",
      "appPackage": "com.example.app",
      "appActivity": ".MainActivity"
    }
  2. 初始化Appium Driver

    使用Appium客户端库初始化Appium Driver,并连接到Appium服务器。以下是一个Python示例:

    python 复制代码
    from appium import webdriver
    from appium.options.common.base import AppiumOptions
    
    options = AppiumOptions()
    options.load_capabilities({
      'platformName': 'Android',
      'platformVersion': '10',
      'deviceName': 'emulator-5554',
      'app': '/path/to/your/app.apk',
      'appPackage': 'com.example.app',
      'appActivity': '.MainActivity'
    })
     
    driver = webdriver.Remote('http://localhost:4723/wd/hub', options=options)
  3. 定位元素

    Appium支持多种元素定位方式,如通过ID、Name、XPath、Class Name等。以下是一些常用的定位方式:

    • 通过图片定位:

      python 复制代码
      # 将图像文件转换为base64编码的字符串
      def image_to_base64(image_path, format='.png'):
          with open(image_path, "rb") as image_file:
              encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
          return format.format(**{'base64': encoded_string})
       
      # 图像文件的路径
      image_path = 'path/to/your/image.png'
       
      # 转换为base64字符串
      base64_image = image_to_base64(image_path)
      
      element = driver.find_element(by=AppiumBy.IMAGE, value=base64_image)
    • 通过ID定位:

      python 复制代码
      element = driver.find_element(by=AppiumBy.ID, value='ID')
    • 通过Name和Accessibility ID定位:

      python 复制代码
      element = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='ACCESSIBILITY_ID')
      element = driver.find_element(by=AppiumBy.NAME, value='NAME')
    • 通过XPath定位:

      python 复制代码
      element = driver.find_element(by=AppiumBy.XPATH, value='//*[@text="xpath"]')
    • 通过Class Name定位(注意:这里使用的是CSS选择器语法):

      python 复制代码
      element = driver.find_element_by_css_selector("button[class='btn-class']")
    • 汇总:

      python 复制代码
      ID = "id"
      XPATH = "xpath"
      LINK_TEXT = "link text"
      PARTIAL_LINK_TEXT = "partial link text"
      NAME = "name"
      TAG_NAME = "tag name"
      CLASS_NAME = "class name"
      CSS_SELECTOR = "css selector"
      IOS_PREDICATE = '-ios predicate string'
      IOS_CLASS_CHAIN = '-ios class chain'
      ANDROID_UIAUTOMATOR = '-android uiautomator'
      ANDROID_VIEWTAG = '-android viewtag'
      ANDROID_DATA_MATCHER = '-android datamatcher'
      ANDROID_VIEW_MATCHER = '-android viewmatcher'
      ACCESSIBILITY_ID = 'accessibility id'
      IMAGE = '-image'
      CUSTOM = '-custom'
      
      # For Flutter integration usage https://github.com/AppiumTestDistribution/appium-flutter-integration-driver/tree/main
      FLUTTER_INTEGRATION_SEMANTICS_LABEL = '-flutter semantics label'
      FLUTTER_INTEGRATION_TYPE = '-flutter type'
      FLUTTER_INTEGRATION_KEY = '-flutter key'
      FLUTTER_INTEGRATION_TEXT = '-flutter text'
      FLUTTER_INTEGRATION_TEXT_CONTAINING = '-flutter text containing'
  4. 模拟用户操作

    • 点击操作:

      python 复制代码
      element.click()
      dirver.tap([(400, 400)], 1000) #按坐标点击,(400,400)是坐标点,1000是点击时长
    • 输入操作:

      python 复制代码
      element.clear()  # 清空输入框
      element.send_keys("Hello World")  # 输入文本
    • 获取元素信息:

      python 复制代码
      text = element.text  # 获取元素的文本内容
      location = element.location  # 获取元素的位置
      size = element.size  # 获取元素的大小
      attribute = element.get_attribute("attribute_name")  # 获取元素的属性值
      id = element.id # 获取元素id
      parent = element.parent # 获取父级元素
      accessible_name = element.accessible_name # 获取元素accessible_name
      # 其他信息可查看源码
  5. 滑动页面

    TouchAction在Appium2.0以后已经被弃用了:

    python 复制代码
    # appium2.0前
    action = TouchAction(driver)
    action.press(x=100, y=150).move_to(x=100, y=500).release().perform()
    
    # appium2.0后
    element = driver.find_element(by=AppiumBy.ID, value='ID')
    actions = ActionChains(driver)
    actions.move_to_element(element)
    actions.click(hidden_submenu)
    actions.perform()
  6. 等待元素加载

    在自动化测试中,经常需要等待某个元素加载出来后再进行操作。Appium支持多种等待方式:

    • 固定等待:

      python 复制代码
      import time
      time.sleep(10)  # 等待10秒
    • 显示等待:

      python 复制代码
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
       
      wait = WebDriverWait(driver, 10)
      element = wait.until(EC.visibility_of_element_located(("id", "your_element_id")))
    • 隐式等待:

      python 复制代码
      driver.implicitly_wait(10)  # 设置隐式等待时间为10秒
  7. 获取手机截图和网络状态

    • 获取手机截图:

      python 复制代码
      driver.get_screenshot_as_file("screenshot.png")
      driver.get_screenshot_as_base64("screenshot.png")
      driver.get_screenshot_as_png("screenshot.png")
      driver.fullscreen_window("screenshot.png")
      driver.get_screenshot_as_file("screenshot.png")
      element.screenshot("screenshot.png")
    • 获取网络状态:

      python 复制代码
      network_connection = driver.network_connection
      print(f"Current network connection: {network_connection}")
       
      # 设置网络状态
      driver.set_network_connection(1)  # 设置为WiFi连接
  8. 模拟键盘操作和手机通知栏操作

    • 模拟键盘操作:

      python 复制代码
      driver.press_keycode()  # 按下手机物理键
    • 手机通知栏操作:

      python 复制代码
      driver.open_notifications()  # 打开通知栏

示例代码:启动Android模拟器并进行基本测试

以下是一个完整的Python示例代码,用于启动一个Android模拟器并进行基本的自动化测试:

python 复制代码
from appium import webdriver
from appium.options.common.base import AppiumOptions
from appium.webdriver.common.appiumby import AppiumBy
import time
 
# 设置options
options = AppiumOptions()
options.load_capabilities({
  'platformName': 'Android',
  'platformVersion': '10',
  'deviceName': 'emulator-5554',
  'app': '/path/to/your/app.apk',
  'appPackage': 'com.example.app',
  'appActivity': '.MainActivity',
  'resetKeyboard': True,  # 重置设备的输入键盘
  'unicodeKeyboard': True  # 采用unicode编码输入
})
 
# 初始化Appium Driver
driver = webdriver.Remote('http://localhost:4723/wd/hub', options=options)
 
try:
  # 等待应用加载
  time.sleep(5)
 
  # 通过ID定位元素并点击
  element = driver.find_element(by=AppiumBy.XPATH, value='//*[@text="xpath"]')
  element.click()
 
  # 通过XPath定位元素并输入文本
  input_element = driver.find_element(by=AppiumBy.XPATH, value='//*[@text="xpath"]')
  input_element.clear()
  input_element.send_keys("Hello World")
 
  # 获取元素的文本内容并打印
  text = input_element.text
  print(f"输入框元素的文本信息是: {text}")
 
finally:
  # 关闭驱动
  driver.quit()
相关推荐
m0_7Ella2 小时前
Jmeter-性能测试工具的安装教程
测试工具·jmeter·性能测试
xwj_8655743325 小时前
Appium(二)--- ADB命令操作
adb·appium
xwj_8655743328 小时前
Appium(一)--- 环境搭建
appium
Swift社区8 小时前
基于 GitHub Actions 的流程自动化实践
运维·自动化·github
后端转全栈_小伵8 小时前
小程序发版后,强制更新为最新版本
前端·微信小程序·小程序·自动化·uniapp
金牛IT9 小时前
MySQL 3主集群搭建
linux·运维·自动化·监控
weixin_6158965611 小时前
每日一学——自动化工具(Jenkins)
运维·自动化·jenkins
伊织code15 小时前
Huginn - 构建代理、执行自动化任务
自动化·agent·代理·工作流·huginn
bug管理者16 小时前
2025软件测试自动化面试题(含答案)
软件测试·面试·职场和发展·自动化
禁默16 小时前
2025年电气、自动化与人工智能(ICEAAI 2025)
人工智能·自动化·电气