测试期间无法识别TS中的Cypress自定义命令(“ TypeError:cy.a不是函数”)

时间:2019-11-13 17:11:24

标签: typescript cypress

我有一个非常简单的赛普拉斯测试规范,如下:

// 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,也无法识别该命令。我在配置中进行了许多调整,无法记住我尝试过的所有内容,但我认为现在一切正常,应该可以正常工作。但这显然不是。

2 个答案:

答案 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