跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 自动化购物脚本实现:基于 Airtest 与 Poco 的 UI 操作实践

综述由AI生成详细阐述了利用 Python 结合 Airtest 与 Poco 框架实现移动端自动化购物的技术方案。内容涵盖环境搭建、ADB 配置、图像裁剪算法、模板匹配策略及订单信息获取方法。文章提供了完整的代码示例,包括商品搜索、详情页浏览、下单流程及截图保存等关键步骤,并补充了常见问题排查与安全合规建议,旨在为开发者提供一套严谨的 UI 自动化实战指南。

moshang发布于 2025/2/6更新于 2026/6/326 浏览
Python 自动化购物脚本实现:基于 Airtest 与 Poco 的 UI 操作实践

Python 自动化购物脚本实现:基于 Airtest 与 Poco 的 UI 操作实践

前言

在移动应用测试与自动化运维领域,Python 凭借其丰富的库支持和简洁的语法,成为了首选语言。本文旨在探讨如何利用 Python 结合 Airtest 和 Poco 框架,实现移动端应用的自动化交互流程。通过图像识别、控件定位及系统命令调用,我们可以模拟用户行为完成商品搜索、匹配、浏览及下单等复杂操作。本教程侧重于技术原理的实现与代码结构的优化,适用于自动化测试工程师及移动端开发人员进行技术参考。

注意:本文内容仅供技术交流与学习使用。自动化脚本的使用应遵守相关法律法规及应用平台的服务条款,严禁用于恶意刷单、薅羊毛或破坏系统公平性的行为。

准备工作

在编写代码之前,需要确保开发环境配置完整,主要包括 Android ADB 调试环境、Python 虚拟环境以及必要的依赖库。

1. 配置 Android ADB 开发环境

ADB (Android Debug Bridge) 是连接电脑与 Android 设备的桥梁。请确保已安装 Android SDK Platform Tools,并将 adb 可执行文件添加到系统环境变量中。

  • 检查 ADB 状态:在终端输入 adb devices,确认设备已连接且显示为 device 状态。
  • 开启 USB 调试:在手机的开发者选项中开启 USB 调试模式。

2. Python 虚拟环境与依赖安装

建议使用 venv 创建隔离的 Python 环境,避免依赖冲突。

python -m venv automation_env
source automation_env/bin/activate  # Windows: automation_env\Scripts\activate
pip install airtest poco opencv-python numpy
  • airtest: 提供基础的设备连接与图像识别能力。
  • poco: 基于 Google Accessibility 或 Unity 引擎的控件树获取工具,比纯图像识别更稳定。
  • opencv-python: 用于图像处理,如裁剪、颜色分析等。

3. 操作剪切板的应用准备

由于部分订单号无法直接通过 UI 元素获取,需借助系统剪贴板功能。需提前安装支持 ADB 调用的剪贴板读取工具(如 Clipper),并确保其服务处于运行状态。

核心逻辑实现

我们将整个自动化流程拆分为 7 个关键步骤,涵盖从启动应用到获取订单截图的全过程。

第 1 步:初始化与启动目标应用

首先清理之前的缓存文件,防止旧数据干扰本次测试。然后停止并重新启动目标应用。

import os
from airtest.core.api import *
from poco.drivers.android.poco import AndroidPoco

def __pre(self):
    """
    准备工作
    :return:
    """
    # 删除缓存文件,避免路径冲突
    cache_files = ['./part.jpg', './screenshot.png', './uidump.xml']
    for f in cache_files:
        if os.path.exists(f):
            os.remove(f)

    home()
    stop_app('com.example.target')  # 替换为目标包名
    start_my_app('com.example.target', 'Home Activity')  # 替换为目标 Activity

第 2 步:关键字搜索商品列表

利用 Poco 控件定位输入框,输入关键字并触发搜索。考虑到网络延迟,需增加等待机制确保列表加载完成。

def __search_good_by_key(self, key):
    """
    通过关键字搜索商品
    :param key: 搜索关键词
    :return:
    """
    self.poco(id='id_page_main_button_search').wait(5).click()
    
    # 输入文本
    perform_view_input(self.poco, id='id_page_search_edittext_search', text=key)

    # 点击搜索按钮,处理可能的重复点击需求
    search_btn = self.poco(id='id_page_search_button_search')
    search_btn.wait_for_appearance()
    while search_btn.exists():
        print('点击一次搜索')
        perform_view_id_click(self.poco, id='id_page_search_button_search')

    # 等待商品列表容器出现
    goods_rv = self.poco(id='id_page_goods_rv')
    goods_rv.wait_for_appearance(timeout=10)

第 3 步:图片预处理与主图裁剪

为了进行精准的商品匹配,需要从截图中提取出商品的主图区域。通过遍历像素点判断背景色(通常为白色),计算有效区域的坐标边界。

import cv2
import numpy as np

def crop_main_img(img_path):
    """
    获取商品主图
    :param img_path: 原图路径
    :return: 裁剪后的主图路径
    """
    img = cv2.imread(img_path)
    size = img.shape
    img_height, img_width, channels = size[0], size[1], size[2]

    color_white = np.array([255, 255, 255])
    arr_x = []
    arr_y = []

    # 遍历宽,检测 X 轴非白区域
    for x in range(img_width):
        is_black = True
        for y in range(img_height):
            color_position = img[y, x]
            # 判断是否为纯白背景
            if not np.array_equal(color_position, color_white):
                is_black = False
        arr_x.append(is_black)

    # 遍历高,检测 Y 轴非白区域
    for y in range(img_height):
        is_black = True
        for x in range(img_width):
            color_position = img[y, x]
            if not np.array_equal(color_position, color_white):
                is_black = False
        arr_y.append(is_black)

    # 获取第一个非白像素的索引
    position_x = [i for i, val in enumerate(arr_x) if not val]
    position_y = [i for i, val in enumerate(arr_y) if not val]

    if not position_x or not position_y:
        return None

    main_img_path = "./head_img.jpeg"
    cropped = img[position_y[0]:position_y[-1]+1, position_x[0]:position_x[-1]+1]
    cv2.imwrite(main_img_path, cropped)
    return main_img_path

第 4 步:商品模板匹配

利用 OpenCV 或 Airtest 的模板匹配功能,在当前页面查找与主图相似的元素。若未找到,则执行滑动操作继续查找。

from airtest.core.api import TemplateMatch

def __search_good_from_list(self):
    """
    从列表中匹配商品
    :return:
    """
    screen_size = self.poco.get_screen_size()
    
    while True:
        try:
            # 使用模板匹配,阈值设为 0.95 以保证精度
            pos = loop_find(Template(self.main_img_path), timeout=10, threshold=0.95)
            print('找到了')
            break
        except TargetNotFoundError:
            print('滑动一页')
            self.__swipe(True)

    # 将绝对坐标转换为相对坐标以便 Poco 点击
    position_click = (pos[0] / screen_size[0], pos[1] / screen_size[1])
    self.poco.click(position_click)

第 5 步:商品详情浏览与收藏

进入详情页后,执行收藏操作,并在指定时间内模拟人工浏览行为(休眠 + 滑动),以增加账号活跃度。

import datetime
import random

def __browser_good_detail(self):
    """
    浏览商品
    :return:
    """
    # 切换到详情 Tab
    self.poco(text='详情').click()

    browser_start = datetime.datetime.now()
    browser_end = browser_start
    target_time = 60  # 浏览时长秒数

    while (browser_end - browser_start).seconds < target_time:
        time.sleep(random.randint(2, 5))
        self.__swipe(True)
        browser_end = datetime.datetime.now()

    print('详情页面查看完毕')

第 6 步:购买流程模拟

点击购买按钮,选择属性并提交订单。出于安全考虑,支付环节建议保留手动操作,脚本仅负责到提交订单前。

def __buy_good(self):
    """
    购买商品
    :return:
    """
    # 立即购买
    self.poco(text='立即购买').click()
    sleep(10)

    # 确定购买
    self.poco(text='确定').parent().click()

    # 提交订单
    self.poco(text='提交订单').click()
    sleep(10)
    # 此处暂停,等待用户手动输入密码或指纹

第 7 步:获取订单号与截图

订单号通常位于弹窗或特定布局中,难以直接通过 ID 获取。可通过模拟点击'复制'按钮,利用 ADB 命令读取系统剪贴板内容。

import re

def __get_order_no(self):
    """
    获取订单编号
    :return:
    """
    copy_element = None
    while True:
        try:
            copy_element = self.poco(text='复制')
            break
        except Exception:
            print('没有找到元素,往下滑动一页')
            self.__swipe(True)

    copy_element.click()

    # 调用外部工具获取剪贴板内容
    result = exec_cmd('adb shell am broadcast -a clipper.get')[1]

    # 正则匹配订单号
    match = re.findall(r'data="(.*)"', result)
    order_no = match[0] if match else ''
    print(order_no)
    return order_no

def get_order_pic(self):
    """
    拿到订单截图界面
    :return:
    """
    screenshot_pic_result = './order_screenshot.png'
    exec_cmd('adb shell /system/bin/screencap -p /sdcard/screenshot.png')
    exec_cmd('adb pull /sdcard/screenshot.png %s' % screenshot_pic_result)
    return screenshot_pic_result

常见问题排查

  1. 分辨率适配问题:不同手机屏幕分辨率会导致图片匹配误差。建议在代码中加入图片缩放逻辑,根据当前屏幕尺寸动态调整模板大小。
  2. 控件稳定性:UI 元素 ID 可能随版本更新变化。建议同时采用多种定位策略(ID、Text、Image)作为兜底方案。
  3. 反爬虫机制:部分电商平台会检测自动化特征。建议增加随机延时、模拟人类鼠标轨迹等行为,降低被封禁风险。

结论与安全规范

通过上述步骤,我们构建了一套完整的移动端 UI 自动化脚本,实现了从搜索到下单的全流程模拟。该方案展示了 Python 在跨平台自动化领域的强大能力,结合了计算机视觉与控件树技术的优势。

重要提示:

  • 自动化脚本应主要用于软件测试、回归验证及辅助性工作效率提升。
  • 请勿利用此类脚本进行商业欺诈、恶意刷单或侵犯他人权益的行为。
  • 在使用前请务必阅读相关平台的用户协议,遵守法律法规。

希望本文能为从事移动端自动化测试的技术人员提供有价值的参考。

目录

  1. Python 自动化购物脚本实现:基于 Airtest 与 Poco 的 UI 操作实践
  2. 前言
  3. 准备工作
  4. 1. 配置 Android ADB 开发环境
  5. 2. Python 虚拟环境与依赖安装
  6. 3. 操作剪切板的应用准备
  7. 核心逻辑实现
  8. 第 1 步:初始化与启动目标应用
  9. 第 2 步:关键字搜索商品列表
  10. 第 3 步:图片预处理与主图裁剪
  11. 第 4 步:商品模板匹配
  12. 第 5 步:商品详情浏览与收藏
  13. 第 6 步:购买流程模拟
  14. 第 7 步:获取订单号与截图
  15. 常见问题排查
  16. 结论与安全规范
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • CTFShow Web 入门命令执行 29-124 通关详解
  • Discord 机器人创建与配置流程
  • 绿联 NAS 配置 WebDAV 公网访问并使用 RaiDrive 挂载
  • 无监督学习降维详解:PCA与t-SNE的关键概念与核心原理
  • OpenClaw 橙皮书与蓝皮书核心内容解析
  • 基于 Uniapp 与 SSM 的鞋类清洗管理 App 金融功能设计
  • 2026 年 3 月 23 日 AI 产业早报:脑机接口落地与算力竞赛
  • Python 基础入门:数据存储与运算详解
  • Spring AI 引入 Agent Skills:模块化智能体能力新范式
  • 基于 Docker 部署 PDFMathTranslate 实现数学文档翻译
  • Python 异步爬虫结合 K8S 弹性伸缩构建高并发采集引擎
  • 前端 Ajax 技术:原理、封装与实战避坑指南
  • Dreamify 免费 AI 绘画工具的功能与实现
  • 大模型前沿:8 篇必读论文
  • WhisperLiveKit 本地部署实时语音转文字与说话人识别方案
  • C++ 递归实战:合并两个有序链表与反转链表
  • React Router 页面跳转的三种实现方式
  • Python DXF 处理实战:ezdxf 库全面解析与高效应用
  • Anaconda 与 Conda 详解:安装、环境管理与包使用指南
  • C++ string 类详解:初始化、遍历与常用函数

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online