Merge branch 'dev'——修复去重条件的校验误报 + 补身份一致性检测

This commit is contained in:
2026-09-24 13:35:41 +08:00
2 changed files with 20 additions and 13 deletions
+17 -12
View File
@@ -922,25 +922,28 @@ var _stepEditor={
warnings.push(name+' "'+label+'": 录制手势还没有轨迹,执行时会被跳过。'); warnings.push(name+' "'+label+'": 录制手势还没有轨迹,执行时会被跳过。');
} }
}else if(s.type==='if_el'){ }else if(s.type==='if_el'){
if(!s.params.selector_value){ // 「去重」「屏幕状态」这两类条件**不用文本比对**(面板里那块是隐藏的)。
// 所以:① 留着旧 cmp_op/cmp_value 不该报警告(用户看不到、也清不掉,
// 只会每次保存都被打扰);② 也别报"会被忽略"——那是设计如此。
var cmpUsed=(s.params.selector_type!=='screen'&&s.params.selector_type!=='dedup');
if(s.params.selector_type!=='dedup'&&!s.params.selector_value){
warnings.push(name+' "'+label+'": 条件判断的选择器为空,会直接走"未找到"分支。'); warnings.push(name+' "'+label+'": 条件判断的选择器为空,会直接走"未找到"分支。');
} }
if(s.params.cmp_op&&!String(s.params.cmp_value||'').trim()){ if(cmpUsed&&s.params.cmp_op&&!String(s.params.cmp_value||'').trim()){
warnings.push(name+' "'+label+'": 选了"文本比对('+s.params.cmp_op+')"但没填比对的值,' warnings.push(name+' "'+label+'": 选了"文本比对('+s.params.cmp_op+')"但没填比对的值,'
+'执行时永远不命中(相当于每次都走"未找到时"分支)。'); +'执行时永远不命中(相当于每次都走"未找到时"分支)。');
} }
if(s.params.cmp_op&&s.params.selector_type==='screen'){
warnings.push(name+' "'+label+'": 屏幕状态没有文本可比,文本比对的设置会被忽略。');
}
if(s.params.selector_type==='dedup'){ if(s.params.selector_type==='dedup'){
hasDedupCheck=true; hasDedupCheck=true;
var iv=(s.params.ident_value||'').trim(); // 空值也收进来:一边填了、另一边没填 = 两处身份不一致(去重会对不上),
if(iv)dedupIdents.push({where:name,type:s.params.ident_type||'text',value:iv}); // 必须报出来 —— 只收非空的话,这种最常见的不一致反而检测不到
dedupIdents.push({where:name,type:s.params.ident_type||'text',
value:(s.params.ident_value||'').trim()});
} }
}else if(s.type==='mark_done'){ }else if(s.type==='mark_done'){
hasMarkDone=true; hasMarkDone=true;
var mv=(s.params.selector_value||'').trim(); dedupIdents.push({where:name,type:s.params.selector_type||'text',
if(mv)dedupIdents.push({where:name,type:s.params.selector_type||'text',value:mv}); value:(s.params.selector_value||'').trim()});
} }
_childArrs(s).forEach(function(a){ _childArrs(s).forEach(function(a){
if(a.length)check(a,name+' 子步骤'); if(a.length)check(a,name+' 子步骤');
@@ -959,11 +962,13 @@ var _stepEditor={
} }
if(dedupIdents.length>1){ if(dedupIdents.length>1){
var first=dedupIdents[0]; var first=dedupIdents[0];
var showId=function(x){ return x.value?('「'+x.value+'」'):'(留空 → 用设备当身份)'; };
dedupIdents.slice(1).forEach(function(d){ dedupIdents.slice(1).forEach(function(d){
if(d.value!==first.value||d.type!==first.type){ if(d.value!==first.value||d.type!==first.type){
warnings.push('去重的身份元素不一致:'+first.where+'用的是「'+first.value warnings.push('去重两处的身份不一致:'+first.where+' 是 '+showId(first)
+'」,而'+d.where+'用的是「'+d.value+'」——两边不一致会算出不同的 key,' +',而 '+d.where+' 是 '+showId(d)
+'去重会静默失效。请改成同一个元素。'); +' —— 身份不一致会算出两个不同的 key,去重会失效'
+'(检查查不到记账 / 或者反过来,结果就是重复或漏做)。请把两处填成同一个身份元素。');
} }
}); });
} }
+3 -1
View File
@@ -772,7 +772,9 @@ class GenericStepsWorker(BaseWorker):
detail = (f"采集到 '{got}' {cmp_op} {n_val} 个候选值 → " detail = (f"采集到 '{got}' {cmp_op} {n_val} 个候选值 → "
f"{'符合' if hit else '不符合'}{extra}") f"{'符合' if hit else '不符合'}{extra}")
found = hit found = hit
elif cmp_op and sel_type in ("screen", "dedup"): elif cmp_op and str(cmp_val or "").strip() and sel_type in ("screen", "dedup"):
# 只在**真的配了比对的值**时才提醒:从元素类切到「去重/屏幕状态」时
# 界面上那块是隐藏的,旧值会留在 params 里,那种残留每轮都刷警告没意义
_log.warning(f"[{self.serial}] {sel_type} 没有文本可比,已忽略文本比对设置") _log.warning(f"[{self.serial}] {sel_type} 没有文本可比,已忽略文本比对设置")
if dynamic: if dynamic: