You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UI测试:能否避免使用delay()方法获取Angular表格动态值?

解决Angular UI测试中表格异步更新的等待问题

问题分析

Angular的数据绑定更新是异步的,输入值并点击失焦后,页面需要等待Angular完成变更检测和DOM更新,直接取值会拿到初始的0。delay()是不可靠的硬等待,必须改用基于条件的等待逻辑。

正确解决方案

使用Karate的waitUntil函数,直接等待表格单元格的文本变为输入的目标值18.00,代码如下:

When waitFor(inputLocator.pathInputLocator).input("18.00")
And mouse().move(100, 200).go().click(); // 点击外部触发输入框失焦,触发Angular模型更新
* def expectedValue = "18.00"
* def getShippingCost =
  """
  function() {
    var element = karate.find(tableLocator.pathTableLocator);
    var currentText = element.textContent.trim();
    return currentText === expectedValue ? currentText : null;
  }
  """
* def shippingCost = waitUntil(getShippingCost, 5000) // 最多等待5秒,可调整超时时间
* print shippingCost // 此时会输出正确的18.00

代码说明

  • karate.find():直接通过定位器获取目标表格单元格元素
  • 检查元素文本并去除空格(避免DOM中存在空白字符导致匹配失败)
  • waitUntil会反复执行传入的函数,直到返回非null/非false的值,或者超时
  • 可以调整第二个参数(超时时间,单位毫秒),根据页面性能设置合理值

之前尝试的错误点

  1. scriptAll用法错误:scriptAll的第一个参数需要是定位器表达式字符串,而非变量名;且你的逻辑是查找所有文本不等于0的元素,这不符合需求,我们只需要检查目标单元格的文本是否变为期望值
  2. 未针对目标值做精确匹配:仅仅判断不等于0可能会匹配到中间状态的值,应该直接等待文本等于输入的18.00

替代方案:使用Karate的断言重试

也可以利用Karate的断言自动重试特性,简化代码:

When waitFor(inputLocator.pathInputLocator).input("18.00")
And mouse().move(100, 200).go().click();
* retry().wait(500).until(text(tableLocator.pathTableLocator) == "18.00")
* def shippingCost = text(tableLocator.pathTableLocator)
* print shippingCost

retry()会自动重试后续的断言,直到条件满足或超时,wait(500)是每次重试的间隔时间。

内容的提问来源于stack exchange,提问作者Olivier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:40:16