移动互联网时代,短视频平台如抖音已成为人们日常娱乐的重要载体。作为开发者或测试工程师,掌握移动端自动化测试技术不仅能提升工作效率,还能探索更多创新应用场景。本文将带你从零开始,使用Python生态中的uiautomator2和weditor工具,构建一个能模拟真实用户行为的抖音自动点赞脚本。
在开始编写自动化脚本前,需要确保开发环境满足以下要求:
安装核心工具包(建议使用虚拟环境):
bash复制pip install uiautomator2 weditor==0.6.4
注意:weditor 0.6.5+版本可能存在编码问题,推荐固定安装0.6.4版本
通过USB连接设备后,执行初始化命令:
python复制import uiautomator2 as u2
# 自动检测设备
d = u2.connect()
print(d.info)
若需WiFi连接,需先通过USB初始化atx-agent服务:
bash复制adb devices
uiautomator2 init
成功连接后,设备信息示例如下:
| 属性 | 值 | 说明 |
|---|---|---|
| currentPackageName | com.ss.android.ugc.aweme | 当前运行包名 |
| displayWidth | 1080 | 屏幕宽度 |
| displayHeight | 2400 | 屏幕高度 |
| screenOn | True | 屏幕状态 |
启动weditor可视化工具:
bash复制weditor
在浏览器中连接设备后,重点分析以下抖音核心元素:
like或aweme典型抖音点赞按钮特征:
python复制{
"resourceId": "com.ss.android.ugc.aweme:id/b1c",
"text": "",
"className": "android.widget.ImageView",
"package": "com.ss.android.ugc.aweme"
}
抖音采用动态加载技术,需要特殊处理:
python复制def wait_like_button(timeout=10):
btn = d(resourceId="com.ss.android.ugc.aweme:id/b1c")
return btn.wait(timeout=timeout)
完整点赞操作流程:
代码实现:
python复制def auto_like_video():
# 启动抖音
d.app_start("com.ss.android.ugc.aweme")
try:
# 等待界面稳定
d(resourceId="com.ss.android.ugc.aweme:id/root_view").wait(8)
# 定位点赞按钮
like_btn = d(resourceId="com.ss.android.ugc.aweme:id/b1c")
if like_btn.exists:
# 获取按钮状态
is_liked = "like_selected" in like_btn.info.get("resourceName", "")
if not is_liked:
like_btn.click()
print("点赞成功")
return True
else:
print("已点赞")
return False
except Exception as e:
print(f"操作失败: {str(e)}")
return False
实现自然浏览行为的滑动逻辑:
python复制import random
import time
def smart_swipe():
# 获取屏幕尺寸
width, height = d.window_size()
# 计算滑动参数
start_x = width * 0.5
start_y = height * 0.8
end_y = height * 0.2
# 随机化滑动参数
duration = random.uniform(0.2, 0.5)
steps = random.randint(20, 30)
# 执行滑动
d.swipe(start_x, start_y, start_x, end_y, duration=duration, steps=steps)
# 随机等待
time.sleep(random.uniform(1.5, 3.0))
将各模块组合成完整自动化流程:
python复制def run_auto_like(cycle=50):
success_count = 0
for i in range(cycle):
print(f"开始第{i+1}次操作")
# 执行点赞
if auto_like_video():
success_count += 1
# 滑动到下一视频
smart_swipe()
# 随机间隔
time.sleep(random.uniform(2, 4))
print(f"任务完成,成功点赞{success_count}次")
提升脚本执行效率的关键方法:
优化后的元素定位方案:
python复制def smart_locate(element_type):
selectors = [
{"resourceId": "com.ss.android.ugc.aweme:id/b1c"},
{"className": "ImageView", "description": "点赞"},
{"xpath": "//*[contains(@resource-id, 'like')]"}
]
for selector in selectors:
el = d(**selector)
if el.exists:
return el
return None
典型异常场景处理方案:
| 异常类型 | 触发场景 | 解决方案 |
|---|---|---|
| ElementNotFound | 界面未加载完成 | 增加等待时间/重试机制 |
| UiObjectNotFound | 元素属性变更 | 多选择器备用方案 |
| SessionNotCreated | 设备断开连接 | 自动重连机制 |
| StaleObjectException | 元素状态过期 | 重新获取元素引用 |
健壮性增强代码示例:
python复制from retrying import retry
@retry(stop_max_attempt_number=3, wait_fixed=2000)
def robust_click(element):
if element.exists:
element.click()
return True
raise Exception("元素不存在")
使自动化行为更接近真人操作:
python复制def human_like_click(x, y):
# 生成随机移动轨迹
points = generate_curve(start=(x, y), end=(x, y), n_points=5)
# 模拟真实触摸轨迹
for point in points:
d.touch.down(*point)
time.sleep(random.uniform(0.01, 0.05))
# 最后执行点击
d.click(x, y)
添加操作记录功能:
python复制import csv
from datetime import datetime
class DataLogger:
def __init__(self):
self.filename = f"log_{datetime.now().strftime('%Y%m%d')}.csv"
def record(self, action, success):
with open(self.filename, 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([
datetime.now().isoformat(),
action,
'成功' if success else '失败'
])
使用APScheduler实现定时执行:
python复制from apscheduler.schedulers.blocking import BlockingScheduler
def job():
run_auto_like(cycle=30)
scheduler = BlockingScheduler()
scheduler.add_job(job, 'interval', hours=2)
scheduler.start()
在实际项目中应注意:
python复制def safe_operation():
# 获取当前时间
current_hour = datetime.now().hour
# 避开高峰时段
if 9 <= current_hour <= 23:
print("非推荐操作时段")
return False
return True