当前位置: 首页 > news >正文

Python自动化测试实战:用uiautomator2和weditor编写一个抖音自动点赞脚本

Python自动化测试实战:用uiautomator2和weditor编写一个抖音自动点赞脚本

最近在技术社区看到不少关于手机自动化测试的讨论,尤其是针对短视频平台的内容分析工具。作为一名长期从事自动化测试开发的工程师,我决定分享一个实战案例:如何用Python的uiautomator2库配合weditor工具,实现抖音短视频的自动点赞功能。这个项目不仅有趣,还能帮助理解移动端UI自动化的核心原理。

1. 环境准备与工具链搭建

工欲善其事,必先利其器。在开始编写自动点赞脚本前,我们需要配置好开发环境。这套工具链由三个核心组件构成:

  • uiautomator2:轻量级Android设备控制库
  • weditor:可视化元素定位工具
  • ADB工具:设备连接桥梁

1.1 基础环境安装

推荐使用Python 3.7+环境,避免某些库的兼容性问题。以下是必须的安装步骤:

# 安装核心测试库 pip install uiautomator2 # 安装元素查看工具(指定稳定版本) pip install weditor==0.6.4 # 配置环境编码(防止中文乱码) set PYTHONUTF8=1

注意:如果遇到UnicodeDecodeError错误,建议同时执行编码设置命令。Windows用户可能需要以管理员身份运行CMD。

1.2 设备连接验证

确保Android设备已开启开发者模式并授权USB调试。连接后执行:

adb devices

应该能看到类似输出:

List of devices attached emulator-5554 device

接着初始化uiautomator2服务:

uiautomator2 init

这个命令会在设备上安装必要的服务端组件,包括ATX代理等。

2. 抖音UI元素分析与定位

2.1 启动weditor进行元素侦查

在命令行执行weditor命令会自动打开浏览器界面。连接设备后,点击"Dump Hierarchy"按钮获取当前页面结构。针对抖音APP,我们需要重点关注几个关键元素:

  • 视频播放区域
  • 点赞按钮(通常为心形图标)
  • 用户昵称显示区域
  • 可能出现的弹窗遮挡

典型抖音元素特征表

元素类型常见属性特征定位策略
点赞按钮resourceId="com.ss.android.ugc.aweme:id/b00"优先使用resourceId定位
视频容器className="android.widget.FrameLayout"结合层级关系定位
弹窗关闭按钮text="我知道了"文本匹配

2.2 编写元素定位代码

基于weditor的分析结果,我们可以编写定位代码。这里展示一个典型的点赞按钮定位方案:

import uiautomator2 as u2 d = u2.connect() # 自动选择已连接设备 def locate_like_button(): # 方案1:直接使用resourceId定位 like_btn = d(resourceId="com.ss.android.ugc.aweme:id/b00") if like_btn.exists: return like_btn # 方案2:备用定位策略 like_btn = d(className="android.widget.ImageView", descriptionContains="点赞") return like_btn if like_btn.exists else None

提示:抖音的UI结构可能随版本更新而变化,建议准备2-3套备选定位方案。

3. 自动点赞核心逻辑实现

3.1 基础点赞功能实现

最简单的点赞操作只需要定位并点击按钮:

def auto_like(): btn = locate_like_button() if btn: btn.click() print("点赞成功") else: print("未找到点赞按钮")

但实际场景中需要考虑更多边界情况:

  1. 视频加载延迟
  2. 按钮状态检测(是否已点赞)
  3. 操作频率控制

3.2 增强型点赞逻辑

改进后的版本包含状态检查和异常处理:

def smart_like(max_retry=3): for _ in range(max_retry): btn = locate_like_button() if not btn: d.swipe(0.5, 0.8, 0.5, 0.2) # 上滑切换视频 continue # 检查按钮状态(通过selected属性判断是否已点赞) if btn.info.get('selected', False): print("当前视频已点赞") return False try: btn.click() print(f"点赞成功 at {time.strftime('%H:%M:%S')}") return True except Exception as e: print(f"点赞失败: {str(e)}") return False

3.3 连续自动点赞实现

结合滑动操作实现连续点赞:

def continuous_liking(count=10, interval=2): liked = 0 while liked < count: if smart_like(): liked += 1 time.sleep(interval) # 滑动到下一个视频 d.swipe(0.5, 0.8, 0.5, 0.2, duration=0.2)

4. 异常处理与优化策略

4.1 常见异常场景处理

在实际运行中,脚本可能遇到以下问题:

  1. 弹窗干扰:青少年模式提示、网络异常等
  2. 元素定位失效:UI结构变更或加载延迟
  3. 操作冲突:用户同时进行手动操作

改进后的异常处理模块:

def handle_popups(): popups = [ d(text="我知道了"), d(text="同意"), d(text="确定") ] for popup in popups: if popup.exists(timeout=1): popup.click() return True return False def robust_liking(): try: if handle_popups(): print("检测并关闭弹窗") return smart_like() except Exception as e: print(f"操作异常: {e}") # 尝试恢复状态 d.press("back") return False

4.2 性能优化技巧

  1. 元素等待策略:设置合理的超时时间
  2. 操作节流控制:避免频繁操作触发风控
  3. 缓存定位结果:对稳定元素减少重复定位

优化后的执行流程:

def optimized_runner(): # 预热设备连接 d.dump_hierarchy() # 主循环 while True: start_time = time.time() robust_liking() # 动态间隔控制 elapsed = time.time() - start_time sleep_time = max(1.5, 3 - elapsed) time.sleep(sleep_time) # 定时滑动 if random.random() > 0.7: d.swipe_ext("up", scale=0.7)

5. 工程化扩展思路

5.1 配置化管理

将定位策略和参数外置为配置文件:

# elements.yaml douyin: like_button: - strategy: id value: "com.ss.android.ugc.aweme:id/b00" - strategy: desc value: "点赞" popups: - text: "我知道了" - text: "同意"

对应的配置加载代码:

import yaml with open("elements.yaml") as f: config = yaml.safe_load(f) def get_element(name): for strategy in config['douyin'][name]: element = getattr(d, strategy['strategy'])(strategy['value']) if element.exists: return element return None

5.2 数据统计与监控

增加执行结果记录功能:

class StatsTracker: def __init__(self): self.total = 0 self.success = 0 def record(self, success): self.total += 1 if success: self.success += 1 @property def rate(self): return self.success / self.total if self.total else 0 # 使用示例 tracker = StatsTracker() tracker.record(robust_liking()) print(f"当前成功率: {tracker.rate:.2%}")

5.3 多设备并发方案

基于uiautomator2的多设备支持:

devices = ["emulator-5554", "192.168.1.100"] def device_task(serial): d = u2.connect(serial) while True: robust_liking(d) # 启动多线程 threads = [] for serial in devices: t = threading.Thread(target=device_task, args=(serial,)) t.start() threads.append(t)

6. 伦理考量与最佳实践

在开发这类自动化工具时,我们需要考虑几个关键原则:

  1. 频率控制:设置合理的操作间隔,避免对平台造成负担
  2. 用途限制:仅用于学习测试,不应用于刷量等违规场景
  3. 可终止设计:确保脚本可以随时安全停止

一个遵循最佳实践的完整示例:

class DouyinLiker: def __init__(self, max_likes=100): self.max_likes = max_likes self.stop_flag = False def run(self): try: for _ in range(self.max_likes): if self.stop_flag: break self.single_cycle() finally: self.cleanup() def single_cycle(self): handle_popups() smart_like() time.sleep(random.uniform(1, 3)) d.swipe_ext("up", scale=0.8) def cleanup(self): print("执行清理操作...") d.app_stop("com.ss.android.ugc.aweme")

在实际项目中,我发现最稳定的定位策略是组合使用resourceId和元素描述。例如抖音的点赞按钮虽然可能改变位置,但其核心属性通常保持稳定。通过将业务逻辑与元素定位解耦,可以大大提高脚本的维护性。

http://www.jsqmd.com/news/752832/

相关文章:

  • 当opencli遇见AI:借助快马平台智能生成具备自然语言交互能力的命令行工具
  • 从std::reflect到自定义reflexpr:C++27反射工具链的7层抽象模型,架构师必读的元编程演进图谱
  • 终极指南:如何快速搭建免费的Galgame社区平台
  • 3步搞定Hyper-V设备直通:告别虚拟机性能瓶颈,释放硬件真实实力!
  • 初创团队如何利用Taotoken统一管理多个AI模型API成本
  • coordinate-connector 架构设计
  • 终极指南:如何用Harepacker-resurrected轻松编辑冒险岛游戏资源
  • 如何优雅突破Cursor编辑器试用限制:技术解析与实战指南
  • 从攻击到防御:手把手教你用Kali测试并验证CC攻击防护策略是否真的有效
  • 从stress到stress-ng:一个Linux压测工具的‘进化史’与实战避坑指南(附常见报错解决)
  • 在自动化Agent工作流中集成Taotoken实现多模型调度
  • RCU内存回收机制详解:它和Java的GC到底有啥不一样?
  • 保姆级复盘:武大、华科、中科大、北大软微网安夏令营考核真题与评分细则全解析
  • 实战项目驱动:基于星火一号和RT-Thread的智能温湿度监测站(附完整源码)
  • Neovim集成Cursor AI:打造智能编程环境与实战配置指南
  • 深入CLIP的视觉编码器:ModifiedResNet和VisionTransformer到底怎么选?性能差多少?
  • 你写的「轻量级后台框架」,不过是给下一任挖的坑
  • 全志H616单板计算机Yuzuki Chameleon硬件解析与应用
  • 从‘鬼畜口型’到自然对嘴:Wav2Lip推理参数调优与问题排查全攻略
  • 让AI写提交信息:快马平台智能分析代码变更,自动生成规范git commit
  • 离网型风光储微电网系统容量优化配置飞轮储能【附代码】
  • 技术决策的七条原则——从〈权衡之境〉看系统设计
  • 手把手教你给YOLOv8换上BiFPN:从代码修改到配置文件调整的保姆级教程
  • ThinkPHP6 升级到 ThinkPHP8 中间件定义方式变化如何适配?
  • WindowResizer:3分钟掌握Windows窗口强制调整终极指南
  • 3步搞定B站缓存难题:m4s-converter无损转换终极指南
  • ReSID框架:语义ID在推荐系统中的实践与优化
  • GHelper终极指南:免费轻量级华硕笔记本性能控制神器
  • 物理感知强化学习在视频生成中的应用与优化
  • AI 模型部署流程