Cucumber中能否通过正则表达式定义自定义参数以实现指定字符串转驼峰格式?
当然可以实现!不过你当前的配置有几个小细节没处理对,导致参数没被正确转换,我来帮你捋清楚:
首先,你的需求是把包含button、checkbox、radiobutton的字符串转成驼峰格式,比如把"Create campaign button"转换成createCampaignButton,这个通过自定义参数类型配合正则是完全能做到的。
问题出在哪?
你写的defineParameterType里的正则表达式有逻辑问题:
regexp: new RegExp(/^[^"]*\sbutton|checkbox|radiobutton$/)
这个正则的|优先级很低,实际会被解析成两种匹配情况:要么是^[^"]*\sbutton(以空格+button结尾的字符串),要么是单独的checkbox或radiobutton。这会导致部分符合要求的字符串匹配不到,或者匹配不完整,进而触发不了transformer转换。
另外,虽然你设置了preferForRegexpMatch: true,但正则匹配逻辑的问题让这个配置没发挥作用。
修正后的解决方案
1. 修复自定义参数类型的配置
调整正则表达式,确保能完整匹配所有包含目标关键词的参数字符串,同时保留转驼峰的逻辑:
defineParameterType({ name: 'toCamelCase', // 匹配包含button/checkbox/radiobutton的完整字符串(不带引号) regexp: /^.*(button|checkbox|radiobutton)$/, transformer: function(match) { // 如果你已经给String原型注入了toCamelCase方法,直接调用即可 return match.toCamelCase(); // 要是不想依赖原型方法,也可以手动实现转驼峰: // return match.toLowerCase().replace(/(?:^\w|\s+\w)/g, m => m.trim().toUpperCase()).replace(/\s+/g, ''); }, preferForRegexpMatch: true, useForSnippets: false });
这里的正则/^.*(button|checkbox|radiobutton)$/会匹配所有以button、checkbox或radiobutton结尾的字符串,完全覆盖你的需求场景。
2. 保留原有的Step定义
你的Step定义不需要修改,因为preferForRegexpMatch: true会让Cucumber自动用这个自定义参数类型去处理正则捕获到的第一个参数:
When(/I click on "([^"]*)" on "([^"]*)"/, async (element: string, page: string) => { // 现在element会被转换成驼峰格式,比如"Create campaign button" → createCampaignButton });
验证一下
当你运行测试时,Cucumber会识别到第一个捕获组的字符串符合toCamelCase参数类型的正则,自动调用transformer把字符串转成驼峰格式,这样你就能在Step定义里拿到预期的createCampaignButton了。
备注:内容来源于stack exchange,提问作者jkalandarov




