143 lines
4.6 KiB
Python
143 lines
4.6 KiB
Python
"""实验脚本:手动跑通"打开商品页 → 进规格面板 → 选颜色尺码"的流程。
|
||||
|
|
|
|||
|
|
**这是实验脚本,正式流程不得导入本文件。**
|
|||
|
|
|
|||
|
|
里面的东西都是为了手动调试方便才这么写的,一样都不能带进正式服务:
|
|||
|
|
|
|||
|
|
- 硬编码的商品号、设备地址、商品标题类名;
|
|||
|
|
- `print` 输出(正式代码用日志,见 `docs/client/06-quality-security.md` §6);
|
|||
|
|
- 写到当前目录的 xml/png(正式代码写 `data/artifacts/`,
|
|||
|
|
见 `docs/client/03-data-model.md` §2.1);
|
|||
|
|
- 出错就 `return`、不区分原因(正式代码要返回结构化错误,
|
|||
|
|
不能把所有失败都变成 `False` 或 `None`,见 `docs/client/02-architecture.md` §9)。
|
|||
|
|
|
|||
|
|
要把这里的逻辑正式化,迁到 PDD 适配层,接口见 `02-architecture.md` §9。
|
|||
|
|
|
|||
|
|
运行前提:手机已连接、已登录拼多多。本脚本**不会下单**——
|
|||
|
|
最后的 `device.click(*coord)` 是注释掉的,不要随手放开。
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import time
|
|||
|
|
|
|||
|
|
import uiautomator2 as u2
|
|||
|
|
from util.loaded_pdd import wait_goods_page
|
|||
|
|
from util.get_size_panle_coord import get_size_panel_coord
|
|||
|
|
from util.select_color_size import select_color_size
|
|||
|
|
from util.get_order_button import get_order_button
|
|||
|
|
|
|||
|
|
package_name='com.xunmeng.pinduoduo'
|
|||
|
|
goods_id="737116531267"
|
|||
|
|
goods_url=f"https://mobile.yangkeduo.com/goods.html?goods_id={goods_id}"
|
|||
|
|
goods_title_node_class="androidx.viewpager.widget.ViewPager"
|
|||
|
|
goods_color="抹茶绿长款"
|
|||
|
|
goods_size="L(80-115斤)"
|
|||
|
|
def main():
|
|||
|
|
# 连接设备
|
|||
|
|
device = u2.connect("192.168.0.173:5555")
|
|||
|
|
|
|||
|
|
#获取当前应用包名
|
|||
|
|
current_package_name=device.app_current()["package"]
|
|||
|
|
|
|||
|
|
#如果不是拼多多则启动
|
|||
|
|
if current_package_name!=package_name:
|
|||
|
|
device.app_start(package_name)
|
|||
|
|
|
|||
|
|
# 等待拼多多启动
|
|||
|
|
device.app_wait(package_name)
|
|||
|
|
|
|||
|
|
# 等待拼多多首页加载完成
|
|||
|
|
device.idle_delay=10
|
|||
|
|
device.implicitly_wait(5)
|
|||
|
|
|
|||
|
|
# 打开商品链接
|
|||
|
|
device.open_url(goods_url)
|
|||
|
|
if wait_goods_page(device):
|
|||
|
|
print("商品页面加载完成")
|
|||
|
|
else:
|
|||
|
|
print("商品页面加载超时")
|
|||
|
|
print(device.app_current())
|
|||
|
|
device.screenshot("load_timeout.png")
|
|||
|
|
# 等待页面跳转完成
|
|||
|
|
# device.implicitly_wait(15)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 获取只能直接获取 Android 无障碍控件树,用来给llm分析改点击哪个
|
|||
|
|
goods_home_xml = device.dump_hierarchy(pretty=True)
|
|||
|
|
with open(f"{goods_id}_home.xml","w",encoding='utf-8') as f:
|
|||
|
|
f.write(goods_home_xml)
|
|||
|
|
|
|||
|
|
#判断商品标题node是否存在
|
|||
|
|
goods_title_node=device(className=goods_title_node_class)
|
|||
|
|
if goods_title_node.exists==False:
|
|||
|
|
print("在规格面板")
|
|||
|
|
return
|
|||
|
|
print("在商品详情页")
|
|||
|
|
device.screenshot(f"{goods_id}_home.png")
|
|||
|
|
|
|||
|
|
# 获取规格面板坐标
|
|||
|
|
coord=get_size_panel_coord(goods_home_xml)
|
|||
|
|
if coord is None:
|
|||
|
|
print("解析失败")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
# 点击进入规格面板
|
|||
|
|
device.click(*coord)
|
|||
|
|
time.sleep(1)
|
|||
|
|
|
|||
|
|
print("等待规格面板加载完成")
|
|||
|
|
|
|||
|
|
color_size_xml = device.dump_hierarchy(pretty=True)
|
|||
|
|
with open(f"{goods_id}_size.xml","w",encoding='utf-8') as f:
|
|||
|
|
f.write(color_size_xml)
|
|||
|
|
device.screenshot(f"{goods_id}_size.png")
|
|||
|
|
|
|||
|
|
# #尝试滑倒面板下面选择尺码
|
|||
|
|
# size_panle_scroller = device(scrollable=True)
|
|||
|
|
# if size_panle_scroller.exists==False:
|
|||
|
|
# print("没有找到可滚动的规格面板")
|
|||
|
|
# return
|
|||
|
|
|
|||
|
|
# #尝试滑动到底部
|
|||
|
|
# size_panle_scroller.scroll.toEnd(max_swipes=20, steps=50)
|
|||
|
|
# time.sleep(1)
|
|||
|
|
# size_panle_xml = device.dump_hierarchy(pretty=True)
|
|||
|
|
# with open(f"{goods_id}_size.xml","w",encoding='utf-8') as f:
|
|||
|
|
# f.write(size_panle_xml)
|
|||
|
|
# device.screenshot(f"{goods_id}_size.png")
|
|||
|
|
|
|||
|
|
# #选中颜色分类
|
|||
|
|
# color_node=device(text=goods_color)
|
|||
|
|
# if color_node.exists==False:
|
|||
|
|
# print("颜色分类不存在")
|
|||
|
|
# return
|
|||
|
|
# color_node.click()
|
|||
|
|
# time.sleep(1)
|
|||
|
|
|
|||
|
|
# #选中尺码
|
|||
|
|
# size_node=device(text=goods_size)
|
|||
|
|
# if size_node.exists==False:
|
|||
|
|
# print("尺码不存在")
|
|||
|
|
# return
|
|||
|
|
# size_node.click()
|
|||
|
|
# time.sleep(1)
|
|||
|
|
|
|||
|
|
success = select_color_size(
|
|||
|
|
device=device,
|
|||
|
|
xml_data=color_size_xml,
|
|||
|
|
target_color=goods_color,
|
|||
|
|
target_size=goods_size,
|
|||
|
|
)
|
|||
|
|
if success:
|
|||
|
|
print("颜色和尺码选择完成")
|
|||
|
|
else:
|
|||
|
|
print("没有找到指定颜色或尺码")
|
|||
|
|
|
|||
|
|
order_xml = device.dump_hierarchy(pretty=True)
|
|||
|
|
coord=get_order_button(order_xml)
|
|||
|
|
print(coord)
|
|||
|
|
# device.click(*coord)
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
import sys,os
|
|||
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|||
|
|
main()
|