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

Geb Groovy测试中required属性不生效及模块方法复用问题

Geb公共Module可选元素方法复用解决方案

问题根因

你声明的second、third元素都设置了required: false,当对应元素不在当前模块渲染范围内时,获取到的是Geb的空Navigator对象,直接调用value()方法就会抛出你遇到的操作不支持错误。

解决方案

核心逻辑是操作元素前先判断两个条件:元素当前是否存在、传入的参数是否包含对应字段,满足条件才执行赋值/断言操作。

基础修复版本

直接修改原有的两个方法即可:

class TestModule extends Module {
  static content = {
    first{ $("input", id: "one") }
    second(required: false) { $("input", id: "two") }
    third(required: false) { $("input", id: "three") } 
  }
 
  def setNewValues(def newValues) {
    first.value(newValues.first)
    if (second.present && newValues.containsKey('second')) {
      second.value(newValues.second)
    }
    if (third.present && newValues.containsKey('third')) {
      third.value(newValues.third)
    }
  }
 
  def assertingValues(def values) { 
    assert first.value() == values.first 
    if (second.present && values.containsKey('second')) {
      assert second.value() == values.second
    }
    if (third.present && values.containsKey('third')) {
      assert third.value() == values.third  
    }
  }
}

通用扩展版本

如果后续会新增更多可选字段,建议用遍历逻辑简化代码,新增字段只需维护可选字段列表即可:

class TestModule extends Module {
  static content = {
    first{ $("input", id: "one") }
    second(required: false) { $("input", id: "two") }
    third(required: false) { $("input", id: "three") }
    // 后续新增可选字段直接在这里定义
  }

  // 维护所有可选字段列表
  private List<String> optionalFields = ['second', 'third']

  def setNewValues(def newValues) {
    first.value(newValues.first)
    optionalFields.each { field ->
      def element = this."$field"
      if (element.present && newValues.containsKey(field)) {
        element.value(newValues[field])
      }
    }
  }
 
  def assertingValues(def values) { 
    assert first.value() == values.first 
    optionalFields.each { field ->
      def element = this."$field"
      if (element.present && values.containsKey(field)) {
        assert element.value() == values[field]
      }
    }
  }
}

使用说明

调用两个方法时,传入的Map参数只需包含当前场景实际存在的字段即可,不存在的可选字段不需要传,方法会自动跳过对应操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:09:04