赛普拉斯无法导入自定义命令
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文件为空。
答案 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");
如您所见,您甚至可以为您的方法提供一些文档,但这完全是可选的。