我有一个非常简单的赛普拉斯测试规范,如下:
// integration/connection.ts
describe("First page displayed", function() {
before(() => {
cy.visit("/")
})
it("Is an error page when no token is given", function() {
cy.getByDataAttribute("error-page")
)}
})
现在getByDataAttribute
是一个自定义命令,如下所示:
// support/commands.ts
declare namespace Cypress {
interface Chainable<Subject> {
getByDataAttribute: typeof getByDataAttribute
}
}
/**
* Get a DOM element by targeting its data-cy attribute value
* @param data_target data-cy attribute value to target
*/
function getByDataAttribute(data_target: string) {
return cy.get("[data-cy=" + data_target + "]")
}
Cypress.Commands.add("getByDataAttribute", getByDataAttribute)
如您所见,所有内容都是用TypeScript编写的,并且可以正常编译(我甚至为自己的自定义命令提供了IntelliSense。)我还有support/index.ts
,它仅导入命令:
import './commands'
我不知道出了什么问题,但是在运行测试时,赛普拉斯会抛出以下错误:
TypeError:cy.getByDataAttribute不是函数
我的自定义命令以前有效,并且当我尝试添加IntelliSense时开始出现问题。现在,即使我恢复为原始JS,也无法识别该命令。我在配置中进行了许多调整,无法记住我尝试过的所有内容,但我认为现在一切正常,应该可以正常工作。但这显然不是。
答案 0 :(得分:0)
对于IntelliSense,我们在JS中使用以下代码:
///<reference types="cypress"/>
答案 1 :(得分:0)
1)您的示例是否偶然从您的实际自定义命令中删除了?进口什么?
我按照一些在线指南遇到了这个问题,但是我的自定义命令使用了从另一个模块导入的对象。在这种情况下,您必须使用全局名称空间声明。无论哪种方式,值得一试的是看看全局名称空间是否适合您
2)您已经将命令添加到Chainable<Subject>
界面中,该界面用于链接诸如cy.get("#something").myCommand()
之类的东西,但是您的命令直接用于cy
之外,因此应该在Chainable
界面上。
// support/commands.ts
import { someObject } from "someModule";
declare global { // < SEE HERE FOR 1)
namespace Cypress {
interface Chainable { // < SEE HERE FOR 2)
getByDataAttribute: typeof getByDataAttribute
}
}
}
/**
* Get a DOM element by targeting its data-cy attribute value
* @param data_target data-cy attribute value to target
*/
function getByDataAttribute(data_target: string) {
// do something with someObject here
return cy.get("[data-cy=" + data_target + "]")
}
Cypress.Commands.add("getByDataAttribute", getByDataAttribute)
export {}; // < Don't forget this!
有关更多信息,请参见此处:
https://github.com/cypress-io/cypress/issues/1065#issuecomment-410324355