如何在执行下一步之前使钩子(afterStep)运行并完成?

时间:2019-07-16 20:44:16

标签: node.js cucumber hook webdriver-io

使用wdio v4 +黄瓜我使用了一些afterSteps,并且知道我正在尝试在v5 +黄瓜中使用它,但似乎没有按顺序运行。 在我的afterStep上,我进行了某些验证,即,如果result.status ===失败,那么我将截取屏幕截图并执行一些额外的步骤,问题是我能够截取屏幕截图,但是我无法执行额外的步骤,因为当执行afterStep后,跑步者已经在执行另一个测试用例。

有时它会成功获取错误页面的屏幕截图,但其他步骤从未完成,因为到达该位置时,跑步者已经在执行另一个测试用例。.

这是我在AfterStep上为v5(从v4更新)使用的代码:

afterStep: function (uri, feature, scenario, step, result) {
        if (result.status === 'failed') {
            const path =  './errorShots/'+Date.now()+'.png';
            browser.saveScreenshot(path);
            const allitems = $('.slds-icon-waffle');
            const logoutBut = $('button[title="Logout"]');
            const adminMenu = $('.oneAppLauncherItemList a[title="Parsable Admin"]');
            const sfProfilelogo = $('.profileTrigger');
            const sflogOut = $('.profile-link-label.logout.uiOutputURL');
            this.allitems.waitForDisplayed();
            this.allitems.click();
            this.adminMenu.waitForVisible();
            this.adminMenu.click();
            browser.pause(2000)
            if (this.logoutBut.isVisible()) {   
                this.logoutBut.click();
            }
            this.sfProfilelogo.waitForVisible();
            this.sfProfilelogo.click();
            this.sflogOut.waitForVisible();
            this.sflogOut.click();
        } 
        console.log(step.text + ' is ' + result.status)
    },

** WebdriverIO版本:v5.11.2 **模式:硒独立 **如果是WDIO Testrunner,则运行同步/异步:同步 ** Node.js版本:v10.16.0 ** NPM版本:v6.9.0 **浏览器名称和版本:Chrome **平台名称和版本:MacOS

我如何确保在执行下一步之前完全完成afterStep? 我已经尝试过使用Promise,但是我不确定自己是否执行得很好,有帮助吗?

1 个答案:

答案 0 :(得分:0)

v4(带有黄瓜)存在与钩子相关的问题。(不确定是否已解决)

参考:https://github.com/webdriverio-boneyard/wdio-cucumber-framework/issues/151

我们在项目中执行以下操作来解决该问题:将以下代码添加为stepDefinition文件的一部分。

// Added this hook to make failed step screenshot feature work.
// NOTE: Since the after hook is placed here there cannot be AFTER hooks in runner file.
After((scenario)=>{
    if(Status.FAILED === scenario.result.status){
        browser.screenshot();
        console.log('Scenario Failed. Screenshot taken!!');
    }
});