fix(发布骨架): 补上缺失的第二个「下一步」(剪辑页 → 发布页)+ 发布页校验超时 25 秒

复查骨架时发现:抖音是 相册页 →(下一步)→ 剪辑页 →(下一步)→ 发布页,
而骨架里只画了一个「下一步」就直奔"点击标题框" —— 照它建出来的任务会在剪辑页上
去点标题框、一路空点到"发布",最后什么都没发出去(还不报错)。

· 补 `⑯ 点击「下一步」(剪辑页 → 发布页)`
· 把「发布页」校验挪到标题框**之前**(点下一步②之后就在发布页了),特征用
  `添加标题/添加作品描述`(25 秒:发布页要加载)
· 「发布按钮」校验留在点「发布」之前(20 秒)
· 标签重新编号 ⑧~㉔,读起来是一条完整链路

同步:doc/API.md 的骨架描述(步数)。
This commit is contained in:
2026-10-12 13:40:20 +08:00
parent 68c16a5fde
commit 12ac599a27
+15 -9
View File
@@ -601,25 +601,31 @@ def build_release_steps():
clk("video", "⑫ 点击第一个素材(刚推的排最前;抓一次就行)"), clk("video", "⑫ 点击第一个素材(刚推的排最前;抓一次就行)"),
build_expect_step("⑬ 校验:素材应已选中(看到「选择/预览」)", "xpath", build_expect_step("⑬ 校验:素材应已选中(看到「选择/预览」)", "xpath",
"//*[@content-desc='选择' or @content-desc='预览']", "素材已选中", timeout=10), "//*[@content-desc='选择' or @content-desc='预览']", "素材已选中", timeout=10),
clk("next", "⑭ 点击「下一步」"), clk("next", "⑭ 点击「下一步」(相册页 → 剪辑页)"),
# 剪辑页要等**视频导入完成**("正在导入"弹窗挡住工具栏):真机实测(2026-10-12 A06) # 剪辑页要等**视频导入完成**("正在导入"弹窗挡住工具栏):真机实测(2026-10-12 A06)
# 一条 25 秒的视频导入要 25 秒+,10~12 秒必然判"没到剪辑页"→ 这一条白发。给到 45 秒。 # 一条 25 秒的视频导入要 25 秒+,10~12 秒必然判"没到剪辑页"→ 这一条白发。给到 45 秒。
build_expect_step("⑮ 校验:应在剪辑页(看到「文字/话题」工具)", "xpath", build_expect_step("⑮ 校验:应在剪辑页(看到「文字/话题」工具)", "xpath",
"//*[@content-desc='文字' or @content-desc='话题']", "剪辑页", timeout=45), "//*[@content-desc='文字' or @content-desc='话题']", "剪辑页", timeout=45),
clk("input", "⑯ 点击标题框(抖音发布页的标题框:hint「添加标题」)"), # ⚠ 这里**必须**有第二个「下一步」:抖音是 相册页 →(下一步)→ 剪辑页 →(下一步)→ 发布页,
# 少了它就会在剪辑页上去点"标题框",然后一路空点到"发布"(2026-10-12 复查骨架时补上)
clk("next2", "⑯ 点击「下一步」(剪辑页 → 发布页)"),
build_expect_step("⑰ 校验:应在发布页(看到「添加标题/添加作品描述」)", "xpath",
"//*[contains(@text,'添加标题') or contains(@text,'添加作品描述')]",
"发布页(标题/描述框)", timeout=25),
clk("input", "⑱ 点击标题框(抖音发布页的标题框:hint「添加标题」)"),
{"id": sid("title"), "type": "input_text", {"id": sid("title"), "type": "input_text",
"label": "⑰ 填标题(自动取这一条计划的标题,会回读校验)", "label": "⑲ 填标题(自动取这一条计划的标题,会回读校验)",
"params": {"text_source": "release_title", "release_topics": "", "params": {"text_source": "release_title", "release_topics": "",
"clear_first": True, "mode": "random", "texts": "", "fixed_text": ""}}, "clear_first": True, "mode": "random", "texts": "", "fixed_text": ""}},
clk("body", "⑱ 点击正文框(发布页的描述框:hint「添加作品描述」)"), clk("body", "⑳ 点击正文框(发布页的描述框:hint「添加作品描述」)"),
{"id": sid("bodytxt"), "type": "input_text", {"id": sid("bodytxt"), "type": "input_text",
"label": "⑲ 填正文(自动取这一条计划的正文,会回读校验)", "label": "㉑ 填正文(自动取这一条计划的正文,会回读校验)",
"params": {"text_source": "release_body", "release_topics": "", "params": {"text_source": "release_body", "release_topics": "",
"clear_first": True, "mode": "random", "texts": "", "fixed_text": ""}}, "clear_first": True, "mode": "random", "texts": "", "fixed_text": ""}},
build_expect_step("⑳ 校验:应在发布页(看到「发布」按钮)", "xpath", build_expect_step("㉒ 校验:应在发布页(看到「发布」按钮)", "xpath",
"//*[@text='发布' or @content-desc='发布']", "发布页(发布按钮)", timeout=10), "//*[@text='发布' or @content-desc='发布']", "发布页(发布按钮)", timeout=20),
clk("publish", "㉑ 点击「发布」"), clk("publish", "㉓ 点击「发布」"),
dict(build_mark_step("㉒ 标记发布结果(成功走这里;失败分支再放一个 result=failed)")), dict(build_mark_step("㉔ 标记发布结果(成功走这里;失败分支再放一个 result=failed)")),
] ]
# 循环体:切号 → 读名字 → 校验 → 推送 → 发布 → 标记。 # 循环体:切号 → 读名字 → 校验 → 推送 → 发布 → 标记。
# `switch_account` 自己会先看"当前是不是已经是目标"(第一个号不用切), # `switch_account` 自己会先看"当前是不是已经是目标"(第一个号不用切),