
在进行UI自动化测试时,我们经常会遇到内容被分割成多页显示的情况。传统的点击“下一页”按钮进行翻页的场景相对简单,但如果页面没有明确的翻页按钮,而是依赖于特定的键盘操作(如按下 Enter 键),并且分页结束的判断依据是页面上某个元素的消失或内容变化,那么就需要更灵活的策略来处理。Karate UI提供了强大的能力,特别是通过waitUntil函数结合自定义JavaScript逻辑,能够优雅地解决这类复杂的分页场景。
假设我们有一个UI界面,其内容分多页显示。每次翻页需要模拟按下 Enter 键,而判断是否到达最后一页的依据是某个特定的DOM元素(例如一个显示“更多数据”的提示信息)不再出现。我们的目标是遍历所有页面,提取每页的关键数据,并将它们合并起来进行最终的断言验证。
Karate的waitUntil函数是解决此问题的核心。它会重复执行一个JavaScript函数,直到该函数返回 true。这使得我们能够在一个循环中执行以下操作:
我们将通过一个具体的示例来演示如何实现这一过程。
首先,我们需要一个变量来存储从所有页面收集到的数据。在Karate中,可以使用 * def 关键字定义一个空数组:
* def allData = []
接下来,定义一个JavaScript函数,该函数将作为 waitUntil 的参数被重复执行。这个函数需要包含数据提取、条件判断和翻页逻辑。
* def loopContent =
"""
function() {
// 检查分页结束条件:如果特定的提示元素不存在,则认为已到达最后一页
// 假设 '.messageNumber' 是一个指示还有更多数据的元素
if (!exists('.messageNumber')) {
// 如果元素不存在,说明是最后一页,提取数据并返回 true 终止循环
let list = locateAll('form div', x => {
let id = x.attribute('id');
return id ? id.startsWith('line1_R') : false
});
let data = list.map(x => x.text.trim());
allData.push(data); // 将当前页数据添加到 allData 数组
return true; // 返回 true 告知 waitUntil 停止循环
}
// 如果 '.messageNumber' 元素仍然存在,说明还有下一页
// 提取当前页数据
let list = locateAll('form div', x => {
let id = x.attribute('id');
return id ? id.startsWith('line1_R') : false
});
let data = list.map(x => x.text.trim());
allData.push(data); // 将当前页数据添加到 allData 数组
// 模拟按下 Enter 键进行翻页
input('body', Key.ENTER);
return false; // 返回 false 告知 waitUntil 继续循环
}
"""函数解析:
定义好 loopContent 函数后,就可以使用 waitUntil 来执行它了:
* waitUntil(loopContent)
waitUntil 会持续调用 loopContent,直到它返回 true。
循环结束后,allData 变量将包含从所有页面收集到的数据。你可以打印它进行检查,或者直接用于后续的断言。
* print allData
在某些情况下,由于页面加载或数据提取的时机,allData 中可能会包含重复的数据。Karate提供了一个方便的内置函数 karate.distinct() 来去除数组中的重复项:
* def cleanedData = karate.distinct(allData) * print cleanedData
将上述步骤整合到一起,一个完整的Karate UI分页处理脚本如下:
Feature: Handle paginated UI content with conditional logic
Scenario: Collect all data from paginated UI
# 假设已经导航到目标页面
# 例如:* driver 'http://your-app-url/paginated-page'
* def allData = []
* def loopContent =
"""
function() {
// 检查分页结束条件:如果特定的提示元素(例如 .messageNumber)不存在,则认为已到达最后一页
// 注意:根据实际页面结构调整此选择器和判断逻辑
if (!exists('.messageNumber')) {
// 最后一页,提取数据并返回 true 终止循环
let list = locateAll('form div', x => {
let id = x.attribute('id');
return id ? id.startsWith('line1_R') : false
});
let data = list.map(x => x.text.trim());
allData.push(data); // 将当前页数据添加到 allData 数组
return true; // 返回 true 告知 waitUntil 停止循环
}
// 如果 '.messageNumber' 元素仍然存在,说明还有下一页
// 提取当前页数据
let list = locateAll('form div', x => {
let id = x.attribute('id');
return id ? id.startsWith('line1_R') : false
});
let data = list.map(x => x.text.trim());
allData.push(data); // 将当前页数据添加到 allData 数组
// 模拟按下 Enter 键进行翻页
input('body', Key.ENTER);
return false; // 返回 false 告知 waitUntil 继续循环
}
"""
* waitUntil(loopContent)
* print 'Collected all data:'
* print allData
# 对收集到的数据进行去重处理
* def cleanedData = karate.distinct(allData)
* print 'Cleaned (deduplicated) data:'
* print cleanedData
# 进行断言验证
* match cleanedData contains ['expected_data_from_page1', 'expected_data_from_page2']
# ... 其他断言通过上述方法,我们可以有效地在Karate UI自动化测试中处理复杂的、基于条件和键盘操作的分页场景,确保所有相关数据都能被准确地收集和验证。
以上就是Karate UI自动化:利用条件逻辑循环处理分页内容的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号