赛普拉斯看不到自定义 cy。命令

A. *_*ich 10 typescript cypress

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

命令.js

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

支持/index.js

import './commands'
Run Code Online (Sandbox Code Playgroud)

测试规范

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

context('Actions', () => {
    beforeEach(() => {})
  })
    it('Main test', () => {
        cy.generateToken('XXXX');
    })
Run Code Online (Sandbox Code Playgroud)

在 test.spec.ts 中, generateToken() 一直带有下划线,并且出现错误:

Property 'generateToken' does not exist on type 'cy'.
Run Code Online (Sandbox Code Playgroud)

index.js 和 commands.js 没有从原始目录中移动。cypress.json 文件为空。

小智 14

由于您的规范是一个打字稿文件,您是否为support/index.js?

他们的文档似乎在这里很好地概述了它。但与他们的示例唯一不同的是,您没有从中返回任何内容,generateToken因此我认为您无法将其放入全局Chainable接口中。

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

declare namespace Cypress {
  interface Chainable {
    generateToken({secret}: {secret: string}): void
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 11

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

这是一个工作示例:

赛普拉斯/支持/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);
Run Code Online (Sandbox Code Playgroud)

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

cy.generateToken("Example");
Run Code Online (Sandbox Code Playgroud)

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


loc*_*hrt 11

2021年全面投入工作。

对于support/index.ts文件

import './commands'
Run Code Online (Sandbox Code Playgroud)

对于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于test.spec.ts文件

cy.login("somebody@domain.com", "something");
cy.generateToken("Example");
Run Code Online (Sandbox Code Playgroud)

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

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


Hav*_*uit 7

以下是我如何通过 TypeScript 查看自定义命令:

命令.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);
Run Code Online (Sandbox Code Playgroud)

测试规格

cy.generateToken(secret);
Run Code Online (Sandbox Code Playgroud)