简介
Airtest 是一个开源的移动端自动化测试框架,支持 Android 和 iOS 应用的自动化测试。它提供了丰富的 API 和用户友好的界面,使得自动化测试变得简单和高效。在本教程中,我们将学习如何使用 Airtest 对 Android 应用进行自动化测试。
环境准备
- 安装 Python 环境。
- 安装 Airtest。在命令行中运行
pip install airtest
。 - 安装 Android SDK 并配置环境变量。
- 安装 ADB 并配置环境变量。
- 将 Android 设备连接到电脑。
编写自动化测试脚本
- 创建一个新的 Python 文件,例如
test_weather_app.py
。 - 导入 Airtest 的 API 和其他必要的库。
from airtest.core.api import * | |
from airtest.cli.parser import cli_setup | |
import os | |
import subprocess |
python复制代码
- 检查 ADB 设备是否连接。
def check_adb_devices(): | |
try: | |
output = subprocess.check_output(["adb", "devices"]) | |
if b"List of devices attached" in output and b"device" in output: | |
print("ADB devices found.") | |
return True | |
else: | |
print("No ADB devices found.") | |
return False | |
except subprocess.CalledProcessError: | |
print("ADB command failed.") | |
return False |
python复制代码
- 连接 Android 设备。
if __name__ == "__main__": | |
if not check_adb_devices(): | |
print("No ADB devices detected. Please check your device connection.") | |
exit(1) | |
device = connect_device("Android:///") |
python复制代码
- 编写自动化测试步骤。
# 获取当前脚本所在目录 | |
script_dir = os.path.dirname(os.path.abspath(__file__)) | |
template_path = os.path.join(script_dir, "weather_icon.png") | |
# 确认模板文件存在 | |
if not os.path.exists(template_path): | |
print(f"Template file {template_path} does not exist.") | |
exit(1) | |
# 截图并保存为 weather_screenshot.png | |
snapshot(filename="weather_screenshot.png") | |
# 使用模板匹配点击“天气”图标 | |
print(f"Trying to find and click the template: {template_path}") | |
match_pos = exists(Template(template_path)) | |
if match_pos: | |
print(f"Matched position: {match_pos}") | |
click(match_pos) | |
# 等待一段时间,让应用加载 | |
time.sleep(5) | |
# 假设 "weather_condition_icon.png" 是天气页面上的天气状况图标 | |
weather_condition_icon_path = os.path.join( | |
script_dir, "weather_condition_icon.png" | |
) | |
# 确认天气状况图标的模板文件存在 | |
if not os.path.exists(weather_condition_icon_path): | |
print( | |
f"Weather condition icon template file {weather_condition_icon_path} does not exist." | |
) | |
exit(1) | |
# 等待天气状况图标出现 | |
assert_exists( | |
Template(weather_condition_icon_path), | |
"Weather condition icon not found on screen.", | |
) | |
print("Successfully entered the weather page.") | |
else: | |
print("Template not found.") |
python复制代码
- 关闭设备连接。
device.disconnect()
python复制代码
运行自动化测试脚本
from airtest.core.api import *
from airtest.cli.parser import cli_setup
import os
import subprocess
# 确保 Airtest 已经设置好
if not cli_setup():
auto_setup(__file__, logdir=True, devices=["Android:///"])
# 连接设备
def check_adb_devices():
try:
output = subprocess.check_output(["adb", "devices"])
if b"List of devices attached" in output and b"device" in output:
print("ADB devices found.")
return True
else:
print("No ADB devices found.")
return False
except subprocess.CalledProcessError:
print("ADB command failed.")
return False
# 主程序
if __name__ == "__main__":
# 检查 ADB 设备
if not check_adb_devices():
print("No ADB devices detected. Please check your device connection.")
exit(1)
# 连接设备
device = connect_device("Android:///")
# 获取当前脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))
template_path = os.path.join(script_dir, "weather_icon.png")
# 确认模板文件存在
if not os.path.exists(template_path):
print(f"Template file {template_path} does not exist.")
exit(1)
# 截图并保存为 weather_screenshot.png
snapshot(filename="weather_screenshot.png")
# 使用模板匹配点击“天气”图标
print(f"Trying to find and click the template: {template_path}")
match_pos = exists(Template(template_path))
if match_pos:
print(f"Matched position: {match_pos}")
click(match_pos)
# 等待一段时间,让应用加载
time.sleep(5)
# 假设 "weather_condition_icon.png" 是天气页面上的天气状况图标
weather_condition_icon_path = os.path.join(
script_dir, "weather_condition_icon.png"
)
# 确认天气状况图标的模板文件存在
if not os.path.exists(weather_condition_icon_path):
print(
f"Weather condition icon template file {weather_condition_icon_path} does not exist."
)
exit(1)
# 等待天气状况图标出现
assert_exists(
Template(weather_condition_icon_path),
"Weather condition icon not found on screen.",
)
print("Successfully entered the weather page.")
else:
print("Template not found.")
# 关闭设备连接
device.disconnect()
- 在命令行中运行
python test_weather_app.py
。 - 观察脚本运行结果和日志输出。
- 会在
test_weather_app.py根目录下创建一个log文件夹,运行会自动截图手机
通过本教程,您已经学会了如何使用 Airtest 对 Android 应用进行自动化测试。您可以根据实际需求编写更复杂的自动化测试脚本,以提高您的应用程序的质量和稳定性。
这个小图片必须从大图片那里截图下来的,在test_weather_app.py
手动创建在根目录下名字
weather_icon.png
Airtest主要是基于图像识别技术来定位和交互元素的。它使用预定义的模板图像来匹配屏幕上的目标元素,并确定其位置。当找到匹配的目标时,就可以执行相应的操作,如点击、滑动等。
然而,在你的问题中提到的代码片段似乎没有达到预期的效果,原因可能有以下几个:
- 图标模板不准确:如果你使用的图标模板与实际屏幕上的图标不完全匹配,Airtest可能无法找到正确的匹配点。确保模板图像清晰无误,并且尽可能覆盖整个图标。
图标模板不准确:如果你使用的图标模板与实际屏幕上的图标不完全匹配,Airtest可能无法找到正确的匹配点。确保模板图像清晰无误,并且尽可能覆盖整个图标。
-
屏幕分辨率差异:如果设备的屏幕分辨率与模板图像的创建分辨率不同,可能导致匹配失败。尽量使用与目标设备相同分辨率的设备来创建模板图像。
-
元素不可见或不可点击:如果目标元素在屏幕外或者被其他元素遮挡,Airtest可能无法点击到它。检查元素是否可见并且可交互。
-
点击坐标偏移:有时候,即使找到了正确的图标,点击操作也可能因为坐标偏移而失败。尝试调整点击坐标的相对位置,或者使用'swipe()
swipe()
方法代替'click()click()
来确保点击到正确的位置 -
应用界面变动:如果应用的界面发生了改变,原来的图标可能不再出现在相同的位置,导致匹配失败。重新录制或创建新的模板图像。
-
系统级限制:某些系统级别的设置或权限可能阻止Airtest对某些元素的操作。确保你的应用有足够的权限,并且没有受到系统安全策略的影响。
针对这些问题,你可以采取以下措施来解决:
- 更新模板图像:确保模板图像与实际屏幕上的图标一致。
- 调整坐标:尝试稍微调整点击坐标,或者使用'swipe()
swipe()
方法来确保点击到正 - 重试录制:如果应用界面发生改变,考虑重新录制或创建新的模板图像。
- 检查权限:确保应用具有足够的权限,并且没有受到系统安全策略的影