Appium 2.0:移动自动化测试的革新之旅

关注开源优测不迷路

大数据测试过程、策略及挑战

测试框架原理,构建成功的基石

在自动化测试工作之前,你应该知道的10条建议

在自动化测试中,重要的不是工具

在移动应用开发的领域中,Appium 作为一款强大的自动化测试工具,不断演进和发展,为开发者提供了更高效、更灵活的测试解决方案。Appium 2.0 相较于之前的版本,在多个方面进行了优化和改进,带来了全新的功能和体验。以下将从变化、核心特色以及与 Python 结合的基本使用过程三个方面来详细介绍 Appium 2.0。

一、Appium 2.0 相对 Appium 1.0 的变化

(一)架构层面

  • 驱动与服务器分离:在 Appium 1.0 中,平台驱动与 Appium Server 紧密耦合,导致更新和维护较为困难。而 Appium 2.0 实现了平台驱动与 Appium Server 的分离,驱动可以独立安装和升级,不再受 Appium Server 更新的限制。这大大提高了 Appium 的灵活性和可扩展性,使得开发者能够根据不同的平台和设备需求,单独安装和更新所需的驱动,更好地应对多样化的测试场景。

  • 插件系统引入:Appium 2.0 引入了插件生态系统,将一些非核心功能从核心代码中分离出来,转移到插件中。这不仅简化了 Appium 的核心功能,使其更加简洁和易于维护,还为开发者提供了更多的可能性,能够通过安装和使用插件来扩展 Appium 的功能,满足各种特定的测试需求。例如,官方的 images 插件支持图像识别定位元素,第三方插件 appium - device - farm 可集中管理测试设备。

(二)协议与标准遵循

  • 严格遵循 W3C 协议:Appium 2.0 严格遵循 W3C 协议,与 Selenium 4 的协议规范相似。这意味着在编写测试脚本时,需要按照 W3C 标准来填写 capabilities。在 Appium 1.0 中,可能存在一些非标准的协议和 capabilities,而在 2.0 中,这种情况得到了改善,所有的 capabilities 都需要遵循 W3C 标准,这使得 Appium 与其他遵循 W3C 协议的测试工具更加兼容,提高了测试的互操作性。

(三)安装与配置

  • 依赖环境变化:Appium 2.0 的安装和配置需要基于 Node.js 环境,并且对 Node.js 的版本有特定要求。在安装过程中,需要使用 appium@next 参数进行安装(正式发布后可使用 appium 参数)。这种变化要求开发者在使用 Appium 2.0 之前,需要确保系统中安装了符合要求的 Node.js 环境,这也增加了使用 Appium 2.0 的门槛,但同时也保证了 Appium 在不同环境中的稳定性和一致性。

  • 扩展安装模式:Appium 2.0 引入了 Appium Extension CLI 模式,用于更方便地扩展安装各种平台驱动和插件。这种模式使得开发者能够更轻松地管理和扩展 Appium 的功能,根据具体的测试需求,快速安装所需的驱动和插件,提高了测试的效率和灵活性。

(四)测试脚本相关

  • 服务器访问地址变更:Appium 2.0 中,Appium Server 的访问地址发生了变化,不再需要后缀 /wd/hub。这意味着在测试脚本中,需要相应地更新访问地址,以确保与 Appium Server 的正确连接。开发者需要使用新的地址格式来连接 Appium Server,这对于一些习惯了旧版本地址格式的开发者来说,可能需要进行一些调整和适应。

  • 驱动和插件配置调整:由于 Appium 2.0 引入了驱动和插件分离的概念,开发者在使用测试脚本时,需要根据具体的测试需求,安装和配置相应的驱动和插件。这需要开发者对 Appium 的架构和插件系统有更深入的了解,以便正确地配置和使用各种驱动和插件,确保测试的顺利进行。

  • Capabilities 格式更新:因为 Appium 2.0 严格遵循 W3C 协议,所以测试脚本中的 capabilities 格式也需要进行更新,以确保与 Appium Server 的兼容性。开发者需要按照 W3C 标准来填写 capabilities,这可能需要对现有测试脚本进行一些修改和调整,以适应 Appium 2.0 的新要求。

二、Appium 2.0 的核心特色

(一)跨平台兼容性

  • 统一测试框架:Appium 2.0 提供了一个统一的测试框架,能够在不同的操作系统和移动设备上运行相同的测试脚本。无论是 Android 还是 iOS 设备,开发者都可以使用相同的测试代码来进行自动化测试,大大提高了测试的效率和可移植性。

  • 一致的测试体验:在不同的平台上,Appium 2.0 能够提供一致的自动化测试体验。开发者可以使用相同的方法和接口来操作界面元素,进行各种测试操作,如点击、输入、滑动等。这种一致性使得测试脚本更加简洁和易于维护,同时也提高了测试的准确性和可靠性。

(二)强大的功能支持

  • 多种定位方式:Appium 2.0 支持多种元素定位方式,包括通过 ID、Name、XPath、Class Name 等常见方式,还支持通过图片定位、iOS 谓词定位、Android UIAutomator 定位等高级定位方式。这使得开发者能够根据不同的应用界面结构和需求,选择最合适的定位方式来定位界面元素,提高了测试的灵活性和准确性。

  • 丰富的操作模拟

    • 用户操作模拟:能够模拟用户的各种操作,如点击、输入、滑动、长按等。开发者可以使用相应的方法来实现这些操作,从而实现对应用的自动化测试。

    • 设备功能模拟:除了界面操作模拟,Appium 2.0 还支持对设备功能的模拟,如模拟键盘操作、手机通知栏操作等。这使得开发者能够更全面地测试应用在各种设备环境下的功能和表现。

(三)高度的可定制性

  • 配置灵活性:Appium 2.0 提供了丰富的配置选项,开发者可以根据自己的需求对 Appium 进行灵活配置。例如,可以设置测试环境、设备信息、测试参数等,以满足不同的测试场景和需求。

  • 插件扩展能力:如前所述,Appium 2.0 的插件生态系统使得开发者能够通过安装和使用插件来扩展 Appium 的功能。开发者可以根据自己的需求,选择合适的插件来满足特定的测试需求,从而实现 Appium 的高度可定制化。

三、Appium 2.0 + Python 基本使用过程

(一)环境搭建

  • 安装 Node.js

    • 下载与安装:首先,确保你的系统上安装了 Node.js。可以从 Node.js 官网下载并安装最新版本的 Node.js。在安装过程中,按照安装向导的指示进行操作,确保安装成功。

  • 安装 Appium

    • 使用 npm 安装:使用 npm 命令全局安装 Appium。打开命令行工具,输入以下命令:npm install -g appium。这将在系统中全局安装 Appium,并使其可以在命令行中直接使用。

  • 安装 Appium 客户端库

    • Python 客户端:如果使用 Python 作为开发语言,需要安装 Appium 的 Python 客户端库。可以使用 pip 命令进行安装:pip install Appium - Python - Client

  • 启动 Appium 服务器

    • 命令行启动:在命令行中输入appium命令启动 Appium 服务器。这将启动 Appium 服务器,并在后台运行。你可以在命令行中查看服务器的启动日志,以确保服务器启动成功。

    • Appium Desktop:此外,还可以使用 Appium Desktop 工具来启动和管理 Appium 服务器。Appium Desktop 是一个图形化工具,提供了更直观的界面来操作 Appium 服务器,同时还支持元素定位和调试等功能。

(二)基本使用步骤

  • 设置 Desired Capabilities

  • {"platformName": "Android","platformVersion": "10","deviceName": "emulator - 5554","app": "/path/to/your/app.apk","appPackage": "com.example.app","appActivity": ".MainActivity"
    }
    • 平台信息platformName指定了操作系统平台,如AndroidiOSplatformVersion指定了操作系统的版本。

    • 设备信息deviceName指定了设备的名称,这通常是在设备连接到计算机时自动识别的名称。

    • 应用信息app指定了要测试的应用的路径,appPackage指定了应用的包名,appActivity指定了应用的启动活动。

    • 参数说明

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

  • 初始化 Appium Driver

  • from appium import webdriverfrom 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', options=options)
    • 连接服务器:在代码中,通过webdriver.Remote方法连接到 Appium 服务器,并传递服务器地址和配置选项。这里的服务器地址是http://localhost:4723,这是 Appium 服务器的默认地址。如果服务器运行在其他地址或端口上,需要相应地修改地址。

    • 导入模块:使用 Python 的appium库来初始化 Appium Driver,并连接到 Appium 服务器。以下是一个示例代码:

  • 定位元素

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

    • ID 定位element = driver.find_element(by=AppiumBy.ID, value='ID'),通过指定元素的 ID 来定位元素。

    • Name 和 Accessibility ID 定位element = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='ACCESSIBILITY_ID'),通过元素的 Accessibility ID 来定位元素;element = driver.find_element(by=AppiumBy.NAME, value='NAME'),通过元素的 Name 来定位元素。

    • XPath 定位element = driver.find_element(by=AppiumBy.XPATH, value='//*[@text="xpath"]'),使用 XPath 表达式来定位元素。

    • Class Name 定位element = driver.find_element_by_css_selector("button[class='btn - class']"),使用 CSS 选择器语法通过元素的类名来定位元素。

    • 其他定位方式:除了上述常见的定位方式外,Appium 还支持通过图片定位、iOS 谓词定位、Android UIAutomator 定位等高级定位方式。例如,通过图片定位可以使用element = driver.find_element(by=AppiumBy.IMAGE, value=base64_image),其中base64_image是将图像文件转换为 base64 编码的字符串。

    • 多种定位方式

  • 模拟用户操作

    • 文本内容text = element.text用于获取元素的文本内容。

    • 位置信息location = element.location用于获取元素的位置,返回一个字典,包含元素的 x 和 y 坐标。

    • 大小信息size = element.size用于获取元素的大小,返回一个字典,包含元素的宽度和高度。

    • 属性值attribute = element.get_attribute("attribute_name")用于获取元素的指定属性值,其中"attribute_name"是要获取的属性名称。

    • 其他信息:还可以获取元素的 ID、父级元素、accessible_name 等信息,具体可查看 Appium 的官方文档。

    • 点击操作element.click()用于模拟点击操作,通过找到要点击的元素,并调用click方法来实现点击。driver.tap([(400, 400)], 1000)用于按坐标点击,其中(400, 400)是坐标点,1000是点击时长。

    • 输入操作element.clear()用于清空输入框的内容,element.send_keys("Hello World")用于向输入框中输入文本。

    • 基本操作

    • 获取元素信息:可以通过以下方法获取元素的各种信息:

  • 滑动页面

    • Appium 2.0 前:在 Appium 2.0 之前,使用TouchAction类来进行滑动操作,例如:

    • Appium 2.0 后:在 Appium 2.0 以后,TouchAction类已被弃用,推荐使用ActionChains类来进行滑动操作,例如:

    • 滑动方式变化

    • action = TouchAction(driver)action.press(x=100, y=150).move_to(x=100, y=500).release().perform()element = driver.find_element(by=AppiumBy.ID, value='ID')actions = ActionChains(driver)
      actions.move_to_element(element)
      actions.click(hidden_submenu)
      actions.perform()
  • 等待元素加载

    • 固定等待:使用time.sleep(10)来进行固定等待,即等待 10 秒。这种方式简单直接,但不够灵活,可能会导致测试时间过长或过短。

    • 显示等待:使用WebDriverWait类和expected_conditions模块来实现显示等待。以下是一个示例:

    • 隐式等待:使用driver.implicitly_wait(10)来设置隐式等待时间为 10 秒。在隐式等待期间,每次查找元素时,如果元素未找到,都会等待一段时间,直到超时。

    • 等待方式

      在上述代码中,WebDriverWait类接受两个参数:Driver 和超时时间。until方法用于等待条件满足,这里使用EC.visibility_of_element_located来等待指定元素可见。

    • from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10)
      element = wait.until(EC.visibility_of_element_located(("id", "your_element_id")))
  • 获取手机截图和网络状态

    • 获取网络状态network_connection = driver.network_connection用于获取当前的网络连接状态,返回一个整数值,表示不同的网络连接类型。

    • 设置网络状态driver.set_network_connection(1)用于设置网络连接为 WiFi 连接,其中 1 表示 WiFi 连接,其他值可能表示不同的网络连接类型,具体可查看 Appium 的文档。

    • 多种方式:Appium 提供了多种方式来获取手机截图,例如:

    • 文件保存driver.get_screenshot_as_file("screenshot.png")将截图保存为文件。

    • Base64 编码driver.get_screenshot_as_base64("screenshot.png")获取截图的 Base64 编码。

    • 其他方式:还有driver.get_screenshot_as_png("screenshot.png")driver.fullscreen_window("screenshot.png")等方式,可根据具体需求选择使用。

    • 获取手机截图

    • 获取网络状态

  • 模拟键盘操作和手机通知栏操作

    • 模拟键盘操作:使用driver.press_keycode()方法来模拟按下手机物理键,例如driver.press_keycode(4)可能表示按下返回键。

    • 手机通知栏操作:使用driver.open_notifications()方法来打开手机通知栏。

(三)示例代码

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

from appium import webdriverfrom 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', options=options)try:# 等待应用加载time.sleep(5)# 通过ID定位元素并点击element = driver.find_element(by=AppiumBy.ID, value='your_element_id')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()

在上述示例中,首先设置了 Appium 的配置选项,包括平台信息、设备信息、应用信息等。然后,初始化了 Appium Driver,并连接到 Appium 服务器。接下来,通过等待、定位元素、模拟操作等步骤,实现了对应用的基本自动化测试。最后,在测试完成后,关闭了 Appium Driver,释放资源。

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

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

相关文章

Mysql SQL 超实用的7个日期算术运算实例(10k)

文章目录 前言1. 加上或减去若干天、若干月或若干年基本语法使用场景注意事项运用实例分析说明2. 确定两个日期相差多少天基本语法使用场景注意事项运用实例分析说明3. 确定两个日期之间有多少个工作日基本语法使用场景注意事项运用实例分析说明4. 确定两个日期相隔多少个月或多…

VSCode设置ctrl或alt+mouse(left)跳转

总结: (1)VSCode初次远程连接服务器时,需要在服务器上下载 python 拓展,然后选择对应的环境 (2)VSCode设置ctrl或altmouse(left)跳转到定义

VBA 64位API声明语句第005讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…

可扩展性设计架构模式——事件驱动架构

事件驱动架构(Event-Driven Architecture, EDA)是一种可扩展性设计软件架构模式,它通过事件来触发和通信(以事件为核心),实现不同系统组件之间的解耦(促进应用程序或系统部件之间的松耦合通信&a…

covid-vaccine-availability-using-flask-server

使用烧瓶服务器获得 Covid 疫苗 原文:https://www . geesforgeks . org/co vid-疫苗-可用性-使用-烧瓶-服务器/ 在本文中,我们将使用 Flask Server 构建 Covid 疫苗可用性检查器。 我们都知道,整个世界都在遭受疫情病毒的折磨,唯一能帮助我们…

设计模式从入门到精通之(三)单例模式

单例模式:只留一份独特的存在 在现代软件设计中,有些对象是必须确保"独一无二"的,比如程序中的配置管理器、线程池、数据库连接等。如果允许这些对象被反复创建,不仅会浪费系统资源,还可能导致程序逻辑出错。…

WordPress Crypto 插件 身份认证绕过漏洞复现(CVE-2024-9989)

0x01 产品简介 WordPress Crypto插件是指那些能够为WordPress网站提供加密货币支付、信息显示或交易功能的插件。这些插件通常与WordPress电子商务插件(如WooCommerce)集成,使网站能够接受多种加密货币支付,或展示加密货币实时信息。支持多种加密货币支付,付款直接进入钱…

hashMap追问

HashMap 7/8区别 不同点: (1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死…

网络安全:路由技术

概述 路由技术到底研究什么内容 研究路由器寻找最佳路径的过程 路由器根据最佳路径转发数据包 知识点,重要OSRF,BGP1.静态路由原理 路由技术分类 静态路由和动态路由技术 静态路由:是第一代路由技术,由网络管理员手工静态写路由/路径告知路…

IIS设置IP+端口号外网无法访问的解决方案

在IIS将站点设置为IP端口访问,假设端口为8080,设好后,服务器上可以访问,外网无法访问。 通常是端口8080没有加入【入站规则】的缘故,将8080端口加入【入站规则】即可,操作如下: 一、ctrlr 输入 …

使用 apply 方法将其他列的值传入 DataFrame 或 Series 的函数,来进行更灵活的计算或操作

可以使用 apply 方法将其他列的值传入 DataFrame 或 Series 的函数,来进行更灵活的计算或操作。apply 方法允许你逐行或逐列地对 DataFrame 或 Series 的元素进行操作,而且你可以将其他列的值作为参数传递给函数。 示例:使用 apply 结合其他…

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

高速网络数据包处理中的内核旁路技术

该PPT详细介绍了Linux网络栈中数据包的传输路径、内核旁路技术的必要性以及具体的内核旁路技术,包括用户空间数据包处理和用户空间网络栈。主要内容概述: 数据包在Linux网络栈中的旅程:描述了数据包从发送到接收的完整路径,包括各…

el-form+el-date-picker组合使用时候的回显问题

背景 我有弹窗创建任务时间的需求,同时也可以修改任务时间,所以复用了弹窗和表单,但在表单里使用日期时间组件的时候,发现了问题 问题描述:在表单中使用form的属性绑定日期时间选择器的v-model,会出现的两…

分布式光伏规模界点为什么是6MW?

多省能源局规定大于6MW的电站必须按集中式管理,另外大于6MW(包含)要省级审批,小于则由市级审批,10kV线路单回接入容量也是6MW,很多电厂发电机装机容量也是以6MW为界点。这是什么原因呢? 配电网…

[2474].第04节:Activiti官方画流程图方式

我的后端学习大纲 Activiti大纲 1.安装位置: 2.启动:

Qt从入门到入土(七)-实现炫酷的登录注册界面(下)

前言 Qt从入门到入土(六)-实现炫酷的登录注册界面(上)主要讲了如何使用QSS样式表进行登录注册的界面设计,本篇文章将介绍如何对登录注册界面进行整体控件的布局,界面的切换以及实现登录、记住密码等功能。…

在 macOS 上,你可以使用系统自带的 终端(Terminal) 工具,通过 SSH 协议远程连接服务器

文章目录 1. 打开终端2. 使用 SSH 命令连接服务器3. 输入密码4. 连接成功5. 使用密钥登录(可选)6. 退出 SSH 连接7. 其他常用 SSH 选项8. 常见问题排查问题 1:连接超时问题 2:权限被拒绝(Permission denied&#xff09…

关于大一上的总结

大一上总结 前言 源于学长们都喜欢写总结,今晚也正好听见一首有点触动心灵的歌,深有感慨,故来此写下这篇总结 正文 1.暑假前的准备 暑假之前姑且还是学习了基本的C语法,大概是到了结构体的地方,进度很慢&#xff0…

Spring Cloud Gateway-自定义异常处理

参考 https://blog.csdn.net/suyuaidan/article/details/132663141,写法不同于注入方式不一样 ErrorWebFluxAutoConfiguration Configuration(proxyBeanMethods false) ConditionalOnWebApplication(type ConditionalOnWebApplication.Type.REACTIVE) Condition…