测试代码中保存了一项页面引用,并不总表示已经把当时那个DOM元素固定下来。Playwright的Handles文档对Locator与ElementHandle作了直接区分:前者保存怎样取得元素的逻辑,后者指向某个特定元素。[2] 读懂这一点,有助于解释页面重新渲染之后,资料中的两种引用为什么仍有不同含义。
Locators文档先把Locator描述为随时在页面中查找元素的方式,再说明每次将它用于动作时,都会定位当前的DOM元素。[1] 官方教学例先悬停、再点击同一个Locator,底层元素会分别定位两次。若两次动作之间页面因重渲染而改变,就会使用与该Locator相符的新元素。这里转述的是文档示例,没有对任何网站执行悬停或点击。
这不是说第一次创建Locator时,就已经保存了一个永远不会变化的页面节点。所保留的是检索逻辑;它何时被用于动作,才按当时页面查找对应元素。同一份Locator对象可以在两个时点用于查找,而两次实际查到的元素不必是同一节点。这样描述,才能保留文档强调的时间关系。
ElementHandle的例子从另一边解释。它指着页面中的特定DOM元素;即使该元素改变文字,或被React用于呈现完全不同的组件,handle仍指向那个元素。[2] 不能只因为变量名称一直叫“提交按钮”,就把它所指的实际对象认定为始终符合当前的业务含义。变量的名称与对象身份分别提供信息,文档所述区别不会被同一个名称消除。
重新定位也没有取消匹配条件。Locators的Strictness节说明,针对单一目标元素的操作若匹配多个元素,会抛出异常;而count这类多元素操作可以面对多个匹配。[1] 因此,“会重新找”不等于“会自动替测试选择正确的一个”。要解释一次动作的对象,仍应保留它是单目标操作还是多元素操作,以及定位逻辑实际限定了什么。
对测试资料审阅,这两条关系需要合起来看:Locator解决的是每次使用时如何按逻辑取得当前元素,严格性决定单目标操作能否接受多个匹配。一份描述只写“定位器已创建”,还没有说明后续时点匹配了什么。本文的分析用于读清文档中的对象与时点,没有观察真实DOM、运行测试或证明某个页面可以自动修复。
本篇采用官方Locators的定义、两次动作例及Strictness完整段,同时采用Handles中的Locator vs ElementHandle及必要邻接;发布日期未确认,也未据动态页面补造具体安装版本。不提供绕过严格性的索引选取、页面脚本或浏览器操作步骤,不把文档机制当成项目测试已通过或覆盖完整的证据。
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。