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
相关产品推荐
相关产品推荐

