1

我使用的是 1.3.2 版的守夜人。在我将 night-watch 更新到最新版本 1.3.4 之前,所有测试都运行良好。测试特别在页面对象中中断。我已经检查了 night-watch 1.3.4 的发行说明,它具有支持页面对象的新功能async/await - https://github.com/nightwatchjs/nightwatch/releases.

我相信我收到的错误消息指出要用异步等待包装页面对象。我想知道如何使用 async/await 更新我现有的页面对象。一个带有异步等待的 eg-page 对象将非常有帮助。我在下面列出了带有页面对象和错误消息的示例测试,在将 night-watch 更新到最新版本之前工作正常。任何想法或帮助将不胜感激。

Test
 it('Verify Login', async (browser)=> {
     await this.loginTest.loginSuccess(browser.globals.Username,browser.globals.Password);
     this.homepage.expect.element('@profile').to.be.visible;
  });
Page-Object

module.exports = {

    url:function () {
        return this.api.launchUrl;
    },
    elements:{
        btnSignInRegister:'#SignInRegister',
        btnSelectBusiness:'#business',
        body:'body',
        txtUsernameInput:'#login-username',
        txtPasswordInput:'#login-password',
        signInBtn:'#SignIn',
        pageBody:'body',
        myAccountBtn:'#myAccount',
     },
    commands:[{
        clickSignInRegister(){
            return this
                .click('@btnSignInRegister')
        },
        waitForBody(){
            return this
                .waitForElementVisible('@pageBody')
        },
        loginSuccess(username,pwd){
            return this
                .navigate()
                 .waitForBody()
                .click('@btnSignInRegister')
                .waitForElementVisible('@btnSelectBusiness',5000)
                .click('@btnSelectBusiness')
                .setValue('@txtUsernameInput',username)
                .setValue('@txtPasswordInput',pwd)
                .click('@signInBtn')
                .waitForBody()
        },
        logoutSuccess(){
            return this
                .waitForElementVisible('@btnProfile',5000)
                .click('@btnProfile')
                .waitForElementVisible('@btnLogout',5000)
                .click('@btnLogout')
        }
    }]
}

问题解决了我用异步等待包装函数

 async loginSuccess(username,pwd){
            await this.navigate()
            await this.waitForBody()
            await this.click('@btnSignInRegister')
            //await this.pause(7000);
            await this.waitForElementVisible('@btnSelectBusiness',5000)
            await this.click('@btnSelectBusiness')
            await this.waitForElementVisible('@txtUsernameInput',5000)
            await this.setValue('@txtUsernameInput',username)
            await this.setValue('@txtPasswordInput',pwd)
            await this.click('@signInBtn')
            await this.waitForBody()
        },
        async logoutSuccess(){
           await this.waitForElementVisible('@btnProfile',5000)
           await this.click('@btnProfile')
           await this.waitForElementVisible('@btnLogout',5000)
           await this.click('@btnLogout')
        },
4

2 回答 2

1

从这个相关的 GitHub 问题:https ://github.com/nightwatchjs/nightwatch/issues/2370

If async/await is being used, chaining is not possible anymore, 
because the commands will return a Promise. 
But in your testcase, there's no need to use await, 
since you're not using the result of the command.
于 2020-11-23T15:07:48.313 回答
1

我能够弄清楚这个问题。我通过将页面对象命令功能升级为带有等待的异步功能解决了这个问题。请在主帖中找到示例。

于 2020-04-16T22:38:37.053 回答