如何访问黄瓜“步骤”对象的 json 的所有“文本”属性并将它们记录到控制台?

问题描述

我正在尝试将黄瓜“步骤”对象的步骤描述的字符串/正则表达式记录到控制台。这是一个示例步骤

Given Alice is hungry

...这是步骤定义的第一行

Given( /^Alice is hungry$/,() => {

我正在尝试使用作为参数提供的“step”对象的字符串表示,在 webdriverio 的特定于黄瓜的钩子的上下文中将“Given Alice is Hung”记录到控制台。运行

beforeStep: function ({ uri,feature,step },context) {
    console.log(`Running "${JSON.stringify(step,null,4)}"`);
}

...产生这个输出

[0-0] Running "{
    "uri": "featureFiles\\dev\\my-first-feature-file.feature","feature": {
        "type": "Feature","tags": [],"location": {
            "line": 8,"column": 1
        },"language": "en","keyword": "Functionality","name": "Eating too many cucumbers is not good for you","children": [
            {
                "type": "Scenario","tags": [
                    {
                        "type": "Tag","location": {
                            "line": 10,"column": 3
                        },"name": "@Szenario-Eating-all-the-cucumbers"
                    }
                ],"location": {
                    "line": 11,"column": 3
                },"keyword": "Szenario","name": "Eating a few is no problem","steps": [
                    {
                        "type": "Hook","location": {
                            "line": 187,"column": 0,"uri": "node_modules\\@wdio\\cucumber-framework\\build\\index
.js"
                        },"keyword": "Hook","text": ""
                    },{
                        "type": "Step","location": {
                            "line": 12,"keyword": "Given","text": "Alice is hungry"
                    },"location": {
                            "line": 13,"column": 5
                        },"keyword": "When ","text": "she eats 3 cucumbers'"
                    },"location": {
                            "line": 14,"keyword": "Then ","text": "she will be full"
                    },

但是,当我使用

beforeStep: function ({ uri,context) {
    // eslint-disable-next-line no-undef
    console.log(\`Running step "${step.text}"`);
}

...我得到的是

 [0-0] Running "undefined"
 [0-0] Running "undefined"

我已经尝试了这两个选项:

console.log(`Running "${step.feature.children.steps.text}"`);
console.log(`Running "${feature.children.steps.text}"`);

在这两种情况下,这都会产生以下结果:

[0-0] Error in "BeforeStep Hook"
Cannot read property 'text' of undefined

我做错了什么?

解决方法

让我们以这个例子为例:

${step.feature.children.steps.text}

children 是一个数组,所以你不能只输入 .steps。您需要先访问某个元素,例如 [0].steps

和steps类似,steps也是一个数组:

"steps": [ ... ]

${step.text} 不起作用,因为 step 没有属性文本。它有以下键:

uri
feature
,

我接受了 pavelsman 的答案作为问题的解决方案。

对于想要在执行时将黄瓜步骤记录到控制台的任何人,只需将其添加到 wdio-configuration 文件中即可:

let scenarioIndex = 0;
let stepIndex = 0;

beforeStep: function ({uri,feature,step},context) {
    if(typeof step.feature.children[scenarioIndex] !== "undefined") {
        let keyword = step.feature.children[scenarioIndex].steps[stepIndex].keyword;
        let stepText = step.feature.children[scenarioIndex].steps[stepIndex].text;
        if (stepText !== "") {
            console.log(keyword + stepText);
        }
        stepIndex++;
    }
},afterScenario: function () {
    scenarioIndex++;
    stepIndex = 0;
},

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...