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

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

在移动应用测试与自动化运维领域,Python 凭借其丰富的库支持和简洁的语法,成为了首选语言。本文旨在探讨如何利用 Python 结合 Airtest 和 Poco 框架,实现移动端应用的自动化交互流程。通过图像识别、控件定位及系统命令调用,我们可以模拟用户行为完成商品搜索、匹配、浏览及下单等复杂操作。本教程侧重于技术原理的实现与代码结构的优化,适用于自动化测试工程师及移动端开发人员进行技术参考。
注意:本文内容仅供技术交流与学习使用。自动化脚本的使用应遵守相关法律法规及应用平台的服务条款,严禁用于恶意刷单、薅羊毛或破坏系统公平性的行为。
在编写代码之前,需要确保开发环境配置完整,主要包括 Android ADB 调试环境、Python 虚拟环境以及必要的依赖库。
ADB (Android Debug Bridge) 是连接电脑与 Android 设备的桥梁。请确保已安装 Android SDK Platform Tools,并将 adb 可执行文件添加到系统环境变量中。
adb devices,确认设备已连接且显示为 device 状态。建议使用 venv 创建隔离的 Python 环境,避免依赖冲突。
python -m venv automation_env
source automation_env/bin/activate # Windows: automation_env\Scripts\activate
pip install airtest poco opencv-python numpy
由于部分订单号无法直接通过 UI 元素获取,需借助系统剪贴板功能。需提前安装支持 ADB 调用的剪贴板读取工具(如 Clipper),并确保其服务处于运行状态。
我们将整个自动化流程拆分为 7 个关键步骤,涵盖从启动应用到获取订单截图的全过程。
首先清理之前的缓存文件,防止旧数据干扰本次测试。然后停止并重新启动目标应用。
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
利用 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)
为了进行精准的商品匹配,需要从截图中提取出商品的主图区域。通过遍历像素点判断背景色(通常为白色),计算有效区域的坐标边界。
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) val]
position_x position_y:
main_img_path =
cropped = img[position_y[]:position_y[-]+, position_x[]:position_x[-]+]
cv2.imwrite(main_img_path, cropped)
main_img_path
利用 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)
进入详情页后,执行收藏操作,并在指定时间内模拟人工浏览行为(休眠 + 滑动),以增加账号活跃度。
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('详情页面查看完毕')
点击购买按钮,选择属性并提交订单。出于安全考虑,支付环节建议保留手动操作,脚本仅负责到提交订单前。
def __buy_good(self):
"""
购买商品
:return:
"""
# 立即购买
self.poco(text='立即购买').click()
sleep(10)
# 确定购买
self.poco(text='确定').parent().click()
# 提交订单
self.poco(text='提交订单').click()
sleep(10)
# 此处暂停,等待用户手动输入密码或指纹
订单号通常位于弹窗或特定布局中,难以直接通过 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
通过上述步骤,我们构建了一套完整的移动端 UI 自动化脚本,实现了从搜索到下单的全流程模拟。该方案展示了 Python 在跨平台自动化领域的强大能力,结合了计算机视觉与控件树技术的优势。
重要提示:
希望本文能为从事移动端自动化测试的技术人员提供有价值的参考。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online