fix(切号): 等面板/等回读改成轮询(固定 sleep 会把"没加载出来"误判成"本机没登这个号")+ 实测选择器入档

A01(抖音 40.6.0)实测:
· 冷启动后按固定 sleep(1.2s) 找账号列表行 → 列表还没渲染 → 判成"本机没登这个号" → **漏发且不报错**;
  现在两处都轮询到 deadline:等面板出目标行、等回读变成目标名。
· 实测选择器(写进 doc/research/U2_ELEMENT_SELECTORS.md §七 与 .env.example):
  昵称 `resourceId=com.ss.android.ugc.aweme:id/tk+`、切换入口 `descriptionContains=切换账号`、
  切号按名字点行 `textContains=<名字>`(行 TextView 不可点但 u2 按中心坐标点,行容器接住)、
  「我」页签 `descriptionContains=我`(desc 是「我,按钮」)。
· 并记下"为什么不要用 (…b7w)[N]":序号型会随列表行数/顺序错位 → 点错号 = 发到别人号上。
· 冷启动切号 17.2s 成功、热态 12.9s;A01 最终已切回原账号。
This commit is contained in:
2026-10-12 09:12:23 +08:00
parent beda0f3779
commit 1e8b97e386
6 changed files with 112 additions and 33 deletions
+6 -5
View File
@@ -545,10 +545,11 @@ def build_release_steps():
因为那些是混淆 id / 结构 xpath,写死了改版就废 —— 执行时会明确提示
"selector_value 为空,请抓取元素",不会静默跳过。
预填了选择器的只有底部「+」入口(`descriptionContains=拍摄`)与
「我」(`descriptionContains=我`),因为这两条在真机上实测过、
且是按描述定位、跨版本相对稳。**「我」页面上的昵称控件留空待抓**
(`read_account_name` 与守卫都用它,抓一次两处都填)。
预填了选择器的:底部「+」入口(`descriptionContains=拍摄`)、
「我」(`descriptionContains=我`)、以及**昵称控件与「切换账号」入口**(后者来自 `.env`,
`config.DOUYIN_NAME_SELECTOR_VALUE` / `DOUYIN_SWITCH_SELECTOR_VALUE`)——
这些都在真机上实测过(40.6.0,见 doc/research/U2_ELEMENT_SELECTORS.md §七)。
`.env` 没填时骨架里那两处就是空的,执行时会明确提示"请抓取元素",不会静默跳过。
"""
def sid(name):
return f"step_rel_{name}_{uuid.uuid4().hex[:6]}"
@@ -588,7 +589,7 @@ def build_release_steps():
# 也会处理"本机没登这个号"(直接跳过、不重试)。
loop_body = [
dict(build_switch_step("③ 切换账号(切到本次要发的那个名字;已在该号则直接过)")),
dict(build_read_name_step("④ 读取本机当前账号名字(昵称控件选择器待抓)")),
dict(build_read_name_step("④ 读取本机当前账号名字")),
{"id": sid("check"), "type": "if_el",
"label": "⑤ 校验账号:当前登的是不是这次要发的那个名字",
"params": {"selector_type": "xpath",