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的值,或者超时- 可以调整第二个参数(超时时间,单位毫秒),根据页面性能设置合理值
之前尝试的错误点
scriptAll用法错误:scriptAll的第一个参数需要是定位器表达式字符串,而非变量名;且你的逻辑是查找所有文本不等于0的元素,这不符合需求,我们只需要检查目标单元格的文本是否变为期望值- 未针对目标值做精确匹配:仅仅判断不等于
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
相关产品推荐
相关产品推荐

