当UI自动化测试从传统代码转向自然语言时,如何处理循环、条件等编程逻辑,是衡量一个AI Agent能力的关键。
简单的自然语言指令(如“点击登录按钮”)很容易实现,但循环操作(如“将购物车里的所有商品都删除”)则需要更高级的抽象能力。
以下是目前主流AI Agent实现“循环操作”的几种方式,从最简单直观到最强大灵活:
方式一:利用“复数”和“量词”的隐式循环 (Implicit Loops)
这是最符合自然语言习惯的方式。AI Agent足够智能,能够理解指令中的复数名词或量词(如“所有”、“每个”、“前3个”),并自动将其转换为循环操作。
自然语言指令示例:
- Click all "Add to Cart" buttons on the page.
(点击页面上所有的“添加到购物车”按钮。)Verify that every product image is displayed.
(验证每个产品图片都已显示。)Delete the first 3 items from the wishlist.
(从心愿单中删除前3个商品。)For each search result, verify it contains the text "Laptop".
(对于每一个搜索结果,验证其包含文本“Laptop”。)
实现原理:
- 识别意图:AI Agent首先识别出这是一个针对多个元素的操作。元素定位:它会生成一个能匹配所有目标元素的定位器(如CSS Selector button.add-to-cart 或XPath)。迭代执行:AI Agent在后台自动生成一个for循环,遍历所有找到的元素,并对每个元素执行指定的操作(点击、验证等)。
优缺点:
- 优点:最直观、最“自然”的方式,几乎没有学习成本。缺点:对于复杂的循环逻辑(如嵌套循环、带条件的循环)可能表达不清,容易产生歧义。
方式二:数据驱动的循环 (Data-Driven Loops)
这是从传统测试中借鉴的经典模式,非常强大且结构清晰。你将需要迭代的数据(如用户名、商品名称)放在一个表格中,然后用一句自然语言指令来处理整个表格。
这种方式在 Gherkin 语言(用于Cucumber、Behave等BDD框架)中非常普遍,现代AI Agent也广泛支持。
自然语言指令示例:
场景1:使用不同的账户登录
Generated gherkin
Given I am on the login pageWhen I try to login with the following accounts: | username | password | | user_valid@test.com | Password123! | | user_invalid@test.com | wrongpassword | | | somepassword |Then I should see the corresponding result for each.
content_copydownload
Use code with caution.Gherkin
场景2:搜索多个商品并验证
Generated gherkin
When I search for the following products: | product_name | | MacBook Pro | | Dell XPS 15 | | Magic Mouse |Then each product should appear in the search results.
content_copydownload
Use code with caution.Gherkin
实现原理:
- 解析表格:AI测试框架会解析这个表格,将其视为一个数据列表。绑定步骤:When I try to login with the following accounts: 这一步的背后实现是一个循环结构。迭代执行:该循环会遍历表格的每一行,将行中的数据(如username和password)作为参数,重复执行登录操作。
优缺点:
- 优点:结构极其清晰,将测试逻辑和测试数据完美分离。非技术人员可以只通过修改表格来增加测试用例。缺点:需要遵循特定的格式(如Gherkin表格语法),不如纯自然语言自由。
方式三:使用“显式循环”关键词 (Explicit Loop Keywords)
这种方式是在自然语言中引入了类似编程的、明确的循环关键词,如 For each, Repeat, While。这让自然语言的表达能力大大增强,可以处理更复杂的逻辑。
自然语言指令示例:
- For-Each循环 (遍历元素集合)
For each "product card" in the "product list":
Click the "Add to Wishlist" icon
Verify the text "Added to Wishlist" appearsRepeat循环 (固定次数)
Repeat 5 times:
Click the "Next Page" button
Wait for the page to loadWhile循环 (条件循环)
While the "Loading..." spinner is visible:
Wait for 1 second
Verify the "Order Summary" section is now visible
实现原理:
AI Agent的解析器被专门训练来识别这些关键词。当它看到 For each...in...: 时,它知道需要:
- 定位父容器元素(如 "product list")。在父容器内定位所有子项元素(如 "product card")。生成一个for...of循环来遍历子项,并执行缩进块内的指令。
对于 While,它会生成一个while循环,其条件是检查某个元素是否可见。
优缺点:
- 优点:非常强大和灵活,能够精确地表达复杂的循环和条件逻辑。缺点:这已经是一种“领域特定语言”(DSL),用户需要学习这些特定的关键词和语法结构,偏离了纯粹的自然语言。
总结与选择
方式 | 核心思想 | 最佳使用场景 | 灵活度 | 学习成本 |
---|---|---|---|---|
隐式循环 | 利用复数和量词 | 简单的、针对同类元素的批量操作 | 低 | 极低 |
数据驱动 | 逻辑与数据分离 | 需要用多组不同数据重复同一流程的场景 | 中 | 低 |
显式循环 | 引入编程关键词 | 复杂的、需要精确控制的循环逻辑(如分页、轮询) | 高 | 中 |
如何选择?
- 对于简单任务,直接使用隐式循环(方式一)是最快、最自然的选择。现代AI测试工具(如Reflect, Mabl)对此支持得很好。对于需要覆盖大量测试数据的回归测试,数据驱动(方式二)是最佳实践,它能让你的测试用例集非常易于维护和扩展。对于需要处理动态加载、分页、轮询等复杂交互的场景,显式循环(方式三)提供了必要的控制能力,尽管它需要你学习一些特定的语法。