WebdriverIO+CucumberJS框架如何按标签触发指定afterScenario逻辑
问题解决:WebdriverIO + CucumberJS afterScenario钩子按场景标签执行逻辑
原有代码不生效原因
- 循环逻辑错误:使用forEach循环遍历标签时每次覆盖
isLastTag的值,仅当场景最后一个标签匹配@settings时才会返回true,无法识别其他位置的目标标签 - 标签取值错误:Cucumber返回的
scenario.pickle.tags数组中每个标签对象的取值属性为name,无需调用不存在的equals()方法 - 类型调用错误:最终对布尔类型的
isLastTag调用contains()方法,会直接抛出类型错误,逻辑无法正常执行
正确实现代码
/** * Runs after a Cucumber scenario */ afterScenario: function (uri, feature, scenario, result, sourceLocation, context) { // 判断当前场景是否带有@settings标签 const hasSettingsTag = scenario.pickle.tags.some(tag => tag.name === '@settings'); if (hasSettingsTag) { // 此处放置仅针对@settings标签场景执行的自定义代码 console.log('Setting key worked'); } // 原有通用逻辑保留 if (commonHelper.elements.userMenuLink.isDisplayed()) { commonHelper.clickLogout(); } browser.deleteAllCookies(); },
逻辑说明
- 用
Array.some()方法遍历标签,只要存在任意一个匹配的目标标签就返回true,不会遗漏多标签场景的匹配需求 - 直接读取标签对象的
name属性和目标标签字符串做全等匹配,逻辑更稳定 - 如果需要匹配多个标签,只需修改
some方法内的判断条件即可,比如需要同时匹配@settings和@test可以写tag.name === '@settings' || tag.name === '@test'
内容的提问来源于stack exchange,提问作者Purva
相关产品推荐
相关产品推荐

