赛普拉斯没有看到自定义的cy。命令

时间:2019-10-10 14:16:24

标签: typescript cypress

赛普拉斯无法导入自定义命令

commands.js

Cypress.Commands.add('generateToken', ({secret}) => {
    const totp = require('totp-generator');
    const token = totp(secret); 
    });

support / index.js

import './commands'

test.spec.ts

/// <reference types="Cypress" />

context('Actions', () => {
    beforeEach(() => {})
  })
    it('Main test', () => {
        cy.generateToken('XXXX');
    })

在test.spec.ts中始终对generateToken()加上下划线,并显示错误:

Property 'generateToken' does not exist on type 'cy'.

index.js和commands.js并未从原始目录中移出。 cypress.json文件为空。

8 个答案:

答案 0 :(得分:1)

由于sepc是打字稿文件,您是否为support/index.js添加了新的类型定义?

他们的文档似乎很好地概括了here。唯一与他们的示例不同的是,您没有从generateToken返回任何内容,因此我认为您不能将其放入全局Chainable界面中。

您可以尝试将其添加到support/index.d.ts文件中,看看它是否对您大吼大叫

declare namespace Cypress {
  interface Chainable {
    generateToken({secret}: {secret: string}): void
  }
}

答案 1 :(得分:1)

2021 年全面工作。

对于 support/index.ts 文件

import './commands'

对于 support/commands.ts 文件

Cypress.Commands.add('generateToken', generateToken);
function generateToken({secret}): void {
    const totp = require('totp-generator');
    const token = totp(secret); 
}

// this is another example.
Cypress.Commands.add('login', login);
function login(username: string, password: string): void {
    // steps for login 
}

declare namespace Cypress {
    interface Chainable<Subject> {
       generateToken({secret}): void;

       /**
        * This will log user in
        * @param email string
        * @param password string
        */
       login(email: string, password: string): void;
    }
}

对于 test.spec.ts 文件

cy.login("somebody@domain.com", "something");
cy.generateToken("Example");

其他答案都不适合我。我想在 VS Code 中提供类型支持,并且不想面对 cypress Property does not exist on type 'cy & EventEmitter' 运行时错误。

我添加了另一个支持 JSDoc 的登录示例。

答案 2 :(得分:0)

尝试致电Cypress.generateToken('XXXX');可以吗?

此外,尝试在添加命令时删除不必要的括号。试试这个:

Cypress.Commands.add('generateToken', secret => {
    const totp = require('totp-generator');
    const token = totp(secret); 
});

答案 3 :(得分:0)

在support / command.js中做类似的事情

Cypress.Commands.add('generateToken', (secret) => {

       const totp = require('totp-generator');
       const token = totp(secret);
  };
  cy.request(options)

});

然后在您的js代码中

    /// <reference types="Cypress" />

context('Actions', () => {
    beforeEach(() => {})
  })
    it('Main test', () => {
        const token ='XXXX'
        cy.generateToken(token);
    })

编辑1

您可以添加此代码吗,并且可以根据您的测试添加更多的迭代等待时间

describe('check the tokens', function() 
{
// on 30 seconds 
it('first token ',()=> {
    cy.wait(30000).then(()=>{
        const token = getToken();   // You're waiting here for 30 sec before you get token
        console.log('first token: ' + token);
    })
})
// on 60 seconds 
it('second token', ()=>{
    cy.wait(60000).then(()=>{
        const token = getToken();
        console.log('second token: '+ token);
    });
})
})

function getToken () {
    const totp = require('totp-generator');
    const token = totp('ABCD');
    return token;
  }

答案 4 :(得分:0)

尝试下面的方法,看看是否可行。

Cypress.Commands.add('generateToken',{prevSubject:false},({secret})=> {

//您的代码。

});

答案 5 :(得分:0)

这是我获取TypeScript来查看自定义命令的方法:

commands.ts

declare namespace Cypress {
  interface Chainable<Subject> {
    generateToken(secret: any): Cypres.Chainable<void>;
  }
}

function generateToken(secret: any): void {
  // Generate token
}

Cypress.Commands.add('generateToken', generateToken);

test.spec.ts

cy.generateToken(secret);

答案 6 :(得分:0)

tsconfig.json

中添加路径
{
  "include": [
    "integration/*.ts",
    "support/*.ts"
  ]
}

答案 7 :(得分:0)

由于 nshirley 提出的答案对我不起作用,我找到了 this 评论。 它非常相似,但在顶部添加了 declare global,以在全局范围内声明这些自定义命令。

这是一个工作示例:

cypress/support/commands.ts

declare global {
  namespace Cypress {
    interface Chainable<Subject> {
      /**
       * Provides a working example
       */
      generateToken(secret: any): Cypress.Chainable<Element>;
    }
  }
}

const generateToken = (secret: any) => {
  // Your Code
};

Cypress.Commands.add("generateToken", generateToken);

在你的测试中你可以直接使用它:

cy.generateToken("Example");

如您所见,您甚至可以为您的方法提供一些文档,但这完全是可选的。