关注开源优测不迷路
大数据测试过程、策略及挑战
测试框架原理,构建成功的基石
在自动化测试工作之前,你应该知道的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
指定了操作系统平台,如Android
或iOS
;platformVersion
指定了操作系统的版本。设备信息:
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,释放资源。