Selenium Java测试中HTML元素动态属性变化原因咨询
Angular 13 + .NET 技术栈下Selenium测试时HTML元素属性动态变动的核心原因
- Angular框架内置渲染逻辑生成动态属性
Angular 13默认启用Ivy渲染引擎,不管是开发环境热更新还是生产环境构建,都会自动给DOM元素追加带哈希后缀的_ngcontent-*、_nghost-*样式作用域属性,哈希值会随每次应用重新构建、服务端渲染缓存刷新重新生成,和测试工具本身无关。同时*ngFor、*ngIf等结构指令在执行列表重排、条件区块显隐逻辑时,会给元素追加临时追踪标识,触发对应交互后这类属性值就会变动。另外Angular变更检测运行时,会根据表单、组件状态实时更新元素上的ng-touched、ng-dirty、动态class/style等属性,只要触发页面交互就可能出现属性变化。 - .NET服务端侧注入动态属性
基于ASP.NET Core的后端服务在返回页面内容时,默认会注入防CSRF的动态令牌属性、Razor组件/官方UI库的运行时唯一标识属性,这类属性值和用户会话强绑定,每次打开新的页面会话都会重新生成。部分使用ABP、Blazor混合托管的项目,还会额外追加组件通信相关的临时data-*属性,页面加载完成即生成新值。 - 测试运行过程的额外属性注入
Selenium 4.1.2在执行元素点击、输入等交互时,部分场景下会给操作过的元素注入临时标记属性;如果测试用的浏览器实例加载了扩展、开启了自动填充/DevTools调试模式,也会给DOM元素追加运行时属性,每次测试启动的浏览器环境差异会导致这类属性无规则变动。
定位元素时不要依赖上述动态生成的属性,优先使用开发团队提前预埋的固定
data-testid属性、业务侧固定的id/name属性、元素稳定文本内容做定位依据,可从根源规避属性变动导致的定位失败问题。
内容的提问来源于stack exchange,提问作者kevin halili
相关产品推荐
相关产品推荐

