把676个XPath定位器丢给Claude,让它转成iOS class chain,最好的那次跑到了转换器可用链数量的96.7%。听起来不错。但翻到另一栏:在任何一个定位器上,它都没有超过转换器。
![]()
这是Mikhail Yesipchuk做的一组对照测试。他此前写了一个XPath转class chain的转换器,在678个定位器上验证过,于是顺手问了一句:既然能把定位器粘给大模型,为什么还要写转换器?
测试用的定位器来自同一批:563个来自生产测试套件的真实定位器,加上115个手工构造的边界用例。实际参与对比的是676个,一个不是XPath,一个在运行时与另一个重复。
每次运行只发一个请求,整份列表放在一个文件里,打乱顺序,用中性id,模型分不清哪个是真实定位器、哪个是边界用例。环境是空文件夹里的Claude Code CLI,只开Read和Write工具,没有设置、没有联网,提示词里除了一条示例链之外没有任何参考。
打分用的是和转换器同一套裁判:一个从WebDriverAgent自身代码构建的WDA模拟器,在数百个生成的界面上跑每条链和它对应的XPath,比对两者找到的元素。完全一致的链得1分,有记录的近似得0.5分,跳过或错误链得0分。转换器的成绩是真实定位器96.0、边界用例93.6,这是这套评分下的上限。
真实定位器上,模型们贴得很近,R值在94到95之间,对96.0。大多数真实定位器本身简单,name、label、type、contains,每个模型都能转。差距全在边界用例上:S值64到82,对93.6。位置、字符串函数、嵌套谓词、转义,这些地方开始分叉。
更值得看的是错误链。每一次运行都产出了错误链,4到59条不等,而转换器是0条。4条错误链放在564条里听着不多,直到其中一条正好是你结账按钮的定位器。错误链比跳过更糟,因为它看起来像一条合法定位器:找到别的元素的链会点错按钮,而Appium驱动会把无效链报成"no such element",于是它表现得像一个不稳定的测试,而不是一个语法错误。
提高思考强度能救回来吗?Claude Code的effort档位从low到max。Opus在low和medium下答案完全一致,high多拿了1分S,代价是成本增加39%。Sonnet唯一实质性的台阶是low到medium,S从68.5升到77.6,成本不变;max再多拿3.6分,代价是4.6倍成本和36分钟。Haiku最佳档位是medium,在low下它用了零基索引,产出39条错误链,在max下则跳过了整份列表的四分之一。
在max档,79%到89%的输出token是思考,而这些思考没有改善答案。结论很直接:medium够了,对Opus来说low就够。
模型犯的错不是随机的,同样的五类错误反复出现。它们还会跳过本可以转换的东西:在普通请求下,Opus在每个档位都拒绝matches()、ends-with()和lower-case(),理由是"XPath 2.0函数",而WDA把它们注册为XPath扩展,在驱动上是合法定位器。
反方向也存在。早期运行中,模型为30个定位器找到了精确链,而当时的转换器只能跳过或近似。作者把这些形式用模拟器验证后加进了转换器,其中依赖XCTest谓词求值方式的部分还在模拟器和一台iPhone上验证过。也就是说,这轮大模型测试反过来让转换器变好了,此后没有任何模型在任何一个定位器上领先。
既然多数错误是关于WDA的知识而不是智力,作者把它们写成约90行的通用规则,塞进提示词再跑一遍。规则里没有针对特定定位器的答案。
加上规则后,R值几乎没动,真实定位器上模型本来就已经到位。S值分别涨了5、16和8,三个模型彼此靠得更近。Opus和Sonnet不再产出错误链,Haiku仍犯两类错误,其中一类重复了四次,所以它还需要人工检查。
Opus为什么停在转换器的96.7%?规则修好了12个定位器:4条错误链中的3条,以及9个对WDA支持特性的跳过。但模型同时变得更谨慎,多跳过了12个:其中7个确实没有精确链,跳过是对的;另外5个转换器能转。12进12出,第4条错误链变成了一次正确的跳过。
这套规则提示词改了三版,每版只动一条规则。第一版没有错误链,但因为一条关于@type的过度谨慎规则,跳过了76个可转换的真实定位器;收窄这条规则后问题消失。第三版修的是contains(@enabled,"false"),它必须变成enabled == false,因为在设备上对布尔值做CONTAINS会报错。规则来自转换器自身检查的发现,不是猜的。
所以实际怎么用?转换器优先。它免费、离线、几秒钟出结果、每次答案一致,而且没有产出过错误链。模型只用来处理转换器跳过的部分,且只用最新一代:Opus 5.5或Sonnet 5.5,low或medium档,提示词里带上规则。Haiku 5.5便宜六倍,但即使有规则它仍会产出错误链。多数跳过项根本没有精确链,所以期待模型解释原因,而不是期待它完成转换。
模型写出的每一条链,在替换XPath之前都要在屏幕上验证一遍。不要为max档付钱,它贵好几倍、耗时最多六倍,换来的S值提升最多几分。
测试本身也有边界:每个模型每个档位只跑一次,运行间波动只是顺带测到的,大约3分S;只测了Claude模型;裁判是WDA模拟器,转换器的链在模拟器和iPhone上验证过,而只有模型写出的那些形式大多没有;边界用例是刻意构造的非常规情况,在典型测试套件上,模型与转换器的差距就是R那一栏,大约1分。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.