App UI自动化测试教程:滑动验证码校验
滑动验证码是常见的反机器人机制,测试时需模拟用户滑动操作并验证是否通过。本教程从零开始,使用Python和Appium(主流跨平台工具),覆盖环境搭建、脚本编写到结果验证。步骤清晰,适合初学者。
1. 引言:滑动验证码测试概述
滑动验证码在app登录中用于防止自动化脚本攻击,通常要求用户拖动滑块到指定位置。自动化测试需模拟这一过程:
- 核心挑战:精确定位滑块元素、模拟真实滑动动作、验证校验结果。
- 工具选择:Appium(开源工具,支持iOS/Android) + Python(简单易用)。
- 测试目标:确保滑动操作后,app正确进入登录状态或显示成功提示。
2. 前置条件:环境准备
在开始前,确保您的系统满足以下要求:
- 操作系统:Windows/macOS/Linux(本教程以Windows为例)。
- 安装软件:
- Java JDK(版本8+):从Oracle官网下载安装。
- Android SDK 或 Xcode(iOS测试):Android Studio包含SDK,iOS需Xcode(仅macOS)。
- Appium Server:通过Node.js安装,命令:
npm install -g appium。 - Python(版本3.6+):从Python官网下载安装。
- Python库:安装Appium客户端,命令:
pip install Appium-Python-Client。
- 测试设备:真实手机或模拟器(如Android Emulator或iOS Simulator),确保USB调试模式开启。
3. 环境设置:配置Appium和测试设备
这一步确保Appium能连接设备:
- 启动Appium Server:
- 命令行运行:
appium,默认监听端口4723。 - 验证:浏览器访问
http://localhost:4723/wd/hub,应显示欢迎页面。
- 命令行运行:
- 配置设备:
- Android:打开手机开发者选项,启用USB调试。连接电脑。
- iOS(macOS):启动Xcode,设置Simulator。
- 获取设备信息:命令行运行
adb devices(Android)或xcrun simctl list(iOS),记录设备ID。
- 设置Desired Capabilities:定义测试参数,创建文件
config.json:{ "platformName": "Android", // 或 "iOS" "platformVersion": "11.0", // 设备系统版本 "deviceName": "emulator-5554", // 设备ID "appPackage": "com.example.app", // app包名 "appActivity": ".MainActivity", // app启动活动 "automationName": "UiAutomator2" // Android驱动 }- 替换为您的app信息(包名和活动名可通过
adb shell dumpsys window | find "mCurrentFocus"获取)。
- 替换为您的app信息(包名和活动名可通过
4. 测试脚本编写:滑动验证码自动化步骤
我们将分步编写Python脚本,实现滑动操作和校验。核心逻辑:
- 启动app并导航到登录页。
- 定位滑块和背景元素。
- 模拟滑动动作。
- 验证校验结果。
步骤1: 导入库和初始化Driver
创建文件slide_captcha_test.py:
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
import time
# 加载配置
desired_caps = {
"platformName": "Android",
"platformVersion": "11.0",
"deviceName": "emulator-5554",
"appPackage": "com.example.app", # 替换为您的app包名
"appActivity": ".LoginActivity", # 替换为登录活动名
"automationName": "UiAutomator2"
}
# 初始化Appium Driver
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(5) # 等待app启动
步骤2: 定位登录页元素
滑动验证码通常由滑块(可拖动元素)和背景(目标区域)组成:
# 定位滑块元素(常见ID如'slide_button')
slider = driver.find_element_by_id("com.example.app:id/slide_button")
# 定位背景元素(目标位置,ID如'target_area')
target = driver.find_element_by_id("com.example.app:id/target_area")
# 获取元素坐标
slider_location = slider.location
target_location = target.location
print(f"滑块位置: {slider_location}, 目标位置: {target_location}")
步骤3: 模拟滑动动作
使用TouchAction模拟用户滑动,确保动作平滑:
# 计算滑动距离(从滑块中心到目标中心)
start_x = slider_location['x'] + slider.size['width'] / 2
start_y = slider_location['y'] + slider.size['height'] / 2
end_x = target_location['x'] + target.size['width'] / 2
end_y = target_location['y'] + target.size['height'] / 2
# 模拟滑动
action = TouchAction(driver)
action.press(x=start_x, y=start_y).wait(500).move_to(x=end_x, y=end_y).release().perform()
time.sleep(2) # 等待校验完成
- 关键点:
wait(500)添加延迟模拟真人操作,避免被检测为机器人。
步骤4: 验证校验结果
检查滑动后app是否登录成功:
# 验证方式1: 检查登录成功元素(如欢迎文本)
try:
welcome = driver.find_element_by_id("com.example.app:id/welcome_text")
if welcome.text == "登录成功":
print("验证通过: 滑动校验成功")
else:
print("验证失败: 未显示成功提示")
except Exception as e:
print(f"验证失败: 元素未找到,错误: {e}")
# 验证方式2: 检查URL或页面变化(适用于Webview)
# 示例: if driver.current_activity == ".HomeActivity": print("成功")
# 关闭Driver
driver.quit()
5. 完整代码示例
整合以上步骤,完整脚本slide_captcha_test.py:
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
import time
desired_caps = {
"platformName": "Android",
"platformVersion": "11.0",
"deviceName": "emulator-5554",
"appPackage": "com.example.app", # 替换为实际包名
"appActivity": ".LoginActivity", # 替换为实际活动名
"automationName": "UiAutomator2"
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(5)
try:
slider = driver.find_element_by_id("com.example.app:id/slide_button")
target = driver.find_element_by_id("com.example.app:id/target_area")
start_x = slider.location['x'] + slider.size['width'] / 2
start_y = slider.location['y'] + slider.size['height'] / 2
end_x = target.location['x'] + target.size['width'] / 2
end_y = target.location['y'] + target.size['height'] / 2
action = TouchAction(driver)
action.press(x=start_x, y=start_y).wait(500).move_to(x=end_x, y=end_y).release().perform()
time.sleep(2)
welcome = driver.find_element_by_id("com.example.app:id/welcome_text")
if welcome.text == "登录成功":
print("测试通过: 滑动验证码校验成功")
else:
print("测试失败: 校验未通过")
except Exception as e:
print(f"测试异常: {e}")
finally:
driver.quit()
6. 运行测试和常见问题
- 运行脚本:命令行执行
python slide_captcha_test.py,查看输出日志。 - 常见问题:
- 元素定位失败:使用Appium Inspector(工具)检查元素ID,或改用XPath定位。
- 滑动不精确:调整坐标计算,添加随机偏移(如
end_x += 5)模拟真人抖动。 - 验证码动态变化:如果目标位置每次不同,需集成OCR(如Tesseract)识别背景图文本。
- 反自动化检测:在
Desired Capabilities中添加"noReset": true避免每次重置app。
- 最佳实践:
- 添加显式等待(如
WebDriverWait)处理元素加载延迟。 - 在真机测试,模拟器可能无法完全模拟传感器行为。
- 定期更新Appium和驱动版本。
- 添加显式等待(如
7. 结论
本教程从零开始,详细介绍了app登录滑动验证码的自动化测试流程。通过Appium和Python,您能高效模拟用户操作并验证校验逻辑。关键点在于精确定位和真实滑动模拟。练习时,建议从简单app入手,逐步处理复杂场景。如有疑问,欢迎进一步交流!
5158

被折叠的 条评论
为什么被折叠?



