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。打开命令行工具,输入以下命令:

    npm install -g appium
    

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

  3. 安装Appium客户端库

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

    pip install Appium-Python-Client
    
  4. 启动Appium服务器

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

    appium
    

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

基本使用方法

  1. 设置Desired Capabilities

    Desired Capabilities是一个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示例:

    from appium import webdriver
    from appium.options.common.base import AppiumOptionsoptions = 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等。以下是一些常用的定位方式:

    • 通过图片定位:

      # 将图像文件转换为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定位:

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

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

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

      element = driver.find_element_by_css_selector("button[class='btn-class']")
    • 汇总:

      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. 模拟用户操作

    • 点击操作:

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

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

      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以后已经被弃用了:

    # 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支持多种等待方式:

    • 固定等待:

      import time
      time.sleep(10)  # 等待10秒
      
    • 显示等待:

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

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

    • 获取手机截图:

      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")
      
    • 获取网络状态:

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

    • 模拟键盘操作:

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

      driver.open_notifications()  # 打开通知栏
      

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

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

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.textprint(f"输入框元素的文本信息是: {text}")finally:# 关闭驱动driver.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/500996.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPU 进阶笔记(一):高性能 GPU 服务器硬件拓扑与集群组网

记录一些平时接触到的 GPU 知识。由于是笔记而非教程,因此内容不求连贯,有基础的同学可作查漏补缺之用 1 术语与基础 1.1 PCIe 交换芯片1.2 NVLink 定义演进:1/2/3/4 代监控1.3 NVSwitch1.4 NVLink Switch1.5 HBM (High Bandwidth Memory) 由…

自由学习记录(31)

Java连接MySQL 找到那个关键jar包然后导入选中,就配置好MySQL的JDBC(Java Database Connectivity)了 菜单--文件--项目结构 项目设置--模块--选择要附着的项目--选择依赖--选中模块源--选中加号添加jar包 解压之后在里面可以看到这个最关键…

第十四届蓝桥杯Scratch省赛中级组—智能计价器

智能计价器 背景信息: A城市的出租车计价:3公里以内13元,基本单价每公里2.3元(超过3公里的部分,不满1公里按照1公里收费),燃油附加费每运次1元。 例如: 3.2公里的打车费用:132.3…

游戏引擎学习第69天

回顾碰撞响应时我们停留的位置 从昨天的讨论开始,我们正准备处理碰撞响应的复杂性。具体来说,我们讨论的是,当两个实体在屏幕上发生碰撞时,如何回应这种情况。碰撞本身并不复杂,但要处理其后的反应和规则则更具挑战性…

全新免押租赁系统助力商品流通高效安全

内容概要 全新免押租赁系统的推出,可以说是一场商品流通领域的小革命。想象一下,不再为押金烦恼,用户只需通过一个简单的信用评估,就能快速租到所需商品,这种体验简直令人惊喜!这个系统利用代扣支付技术&a…

【Python科研数据爬虫】基于国家标准查询平台和能源标准化信息平台的海上风电相关行业标准查询信息爬取及处理

基于国家标准查询平台和能源标准化信息平台的海上风电相关行业标准查询信息爬取及处理 1 背景2 标准检索平台2.1 能源标准化信息平台2.2 全国标准信息公共服务平台3 标准信息数据的爬取与处理3.1 能源标准化信息平台的信息爬取3.2 全国标准信息公共服务平台的信息爬取3.3 标准信…

ThinkPHP 8高效构建Web应用-控制器

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 控制器无须特…

2025-1-2-sklearn学习(30)模型选择与评估-验证曲线: 绘制分数以评估模型 真珠帘卷玉楼空,天淡银河垂地。

文章目录 sklearn学习(30) 模型选择与评估-验证曲线: 绘制分数以评估模型30.1. 验证曲线30.2. 学习曲线 sklearn学习(30) 模型选择与评估-验证曲线: 绘制分数以评估模型 文章参考网站: https://sklearn.apachecn.org/ 和 https://scikit-learn.org/stable/ 每种估…

DevOps工程技术价值流:Ansible自动化与Semaphore集成

在DevOps的浪潮中,自动化运维工具扮演着举足轻重的角色。Ansible,作为一款新兴的自动化运维工具,凭借其强大的功能和灵活性,在运维领域迅速崭露头角。本文将深入探讨Ansible的特点、架构、工作原理,以及其应用场景&…

MySQL 03 章——基本的SELECT语句

一、SQL概述 (1)SQL背景知识 SQL(Structured Query Language,结构化查询语言)是使用关系模型的数据库应用语言,与数据直接打交道不同的数据库管理系统生产厂商都支持SQL语句,但都有特有内容 …

《HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发

随着HarmonyOS NEXT发布,鸿蒙生态日益壮大,广大开发者对于系统化学习平台和课程的需求愈发强烈。近日,华为精心打造的《HarmonyOS第一课》全新上线,集“学、练、考”于一体,凭借多维融合的教学模式与系统课程设置&…

JS实现SVG的TEXT标签自动换行功能

首先定义了一个RectAndText组件&#xff0c;这个组件实现了在矩形中显示居中的文本&#xff08;矩形可以根据自己需求要或者不要&#xff09; <template><rect :x"x" :y"y" :width"width" :height"height" :stroke"str…

IDEA2023.1修改默认Maven配置

IDEA2023.1修改默认Maven配置 1. 默认路径&#xff1a;C:\Users\Administrator\.m2\repository 2.Maven安装路径&#xff1a;D:\Tools\apache-maven-3.8.1 3.修改为自己的安装路径&#xff0c;点击铅笔图标进行修改 以后新建的项目就会自动把Maven指向自己配置的目录。

Docker--Docker Container(容器) 之 操作实例

容器的基本操作 容器的操作步骤其实很简单&#xff0c;根据拉取的镜像&#xff0c;进行启动&#xff0c;后可以查看容器&#xff0c;不用时停止容器&#xff0c;删除容器。 下面简单演示操作步骤 1.创建并运行容器 例如&#xff0c;创建一个名为"my-nginx"的交互…

USB射频微波功率计的功能与优势-盛铂科技

USB射频功率计是一种用于测量射频信号&#xff08;RF&#xff09;功率的仪器&#xff0c;它通过USB接口与计算机或其他设备连接&#xff0c;以便于进行数据采集、处理和显示。 主要功能 功率测量&#xff1a;能够测量射频信号的功率&#xff0c;通常以毫瓦&#xff08;mW&…

GDPU 数据库原理 期末复习

文章目录 &#x1f468;‍&#x1f3eb; 必看&#xff1a;期末考点&#x1f342; 学习通&#x1f341; 章节小测一 绪论&#x1f353; 选择题 &#x1f341; 章节小测二 关系数据库&#x1f353; 简答题1. 写关系代数2. 写关系代数 &#x1f353; 选择题 &#x1f341; 章节小测…

Springboot:后端接收数组形式参数

1、接收端写法 PermissionAnnotation(permissionName "",isCheckToken true)PostMapping("/batchDeleteByIds")public ReturnBean webPageSelf( NotNull(message "请选择要删除的单据&#xff01;") Long[] ids) {for (Long string : ids) {l…

系统设计——大文件传输方案设计

摘要 大文件传输是指通过网络将体积较大的文件从一个位置发送到另一个位置的过程。这些文件可能包括高清视频、大型数据库、复杂的软件安装包等&#xff0c;它们的大小通常超过几百兆字节&#xff08;MB&#xff09;甚至达到几个吉字节&#xff08;GB&#xff09;或更大。大文…

国产编辑器EverEdit - 常用资源汇总

1 国产编辑器EverEdit-常用资源汇总 EverEdit是一款国产文本编辑器&#xff0c;历经超过15年的更新和维护&#xff0c;拥有不输业界顶级商业文本编辑器(EmEditor、UltraEdit)的实力&#xff0c;甚至在某些方面的功能更强(当然&#xff0c;各有千秋)&#xff0c;开发者对文本编辑…

Linux C/C++编程-获得套接字地址、主机名称和主机信息

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com…