首页 > 解决方案 > 赛普拉斯:有条件地结束链

问题描述

我对赛普拉斯很陌生,但我想知道是否有某种方法可以有条件地结束命令链?我知道在柏树中应该避免条件测试,但我还是想试试这个。

我试过的

我试图通过将链传递给自定义命令来解决它,但它似乎不起作用。

Cypress.Commands.add('ifExists', { prevSubject: true }, (subject: object, element: string) => {
    cy.get('body').then(($body) => {
        if ($body.find(element).length) {
            cy.wrap(object).end();
        } else {
            // something else
        }
    })
})

并且

Cypress.Commands.add('ifExists', { prevSubject: true }, (subject: JQuery<HTMLBodyElement>, element: string) => {
    cy.wrap(subject).then(($body) => {
        if ($body.find(element).length) {
            return cy.wrap(subject);
        } else {
            return cy.wrap(subject).end();
        }
    })
})

只是澄清我想从这个命令中得到什么。我希望能够将它添加到这样的链中:

cy.get('body > #specialThing').ifExists().then((thing) => ...)

或这个:

cy.ifExists('body > #specialThing').then((thing) => ...)

感谢所有帮助和建议!

标签: javascripttestingcypress

解决方案


我会查看关于条件测试的赛普拉斯文档,特别是关于元素存在的部分。tl;dr 是你只需要搜索一个更通用的元素,它会产生一些你可以断言的东西。

y.get('body')
  .then(($body) => {
    // synchronously query from body
    // to find which element was created
    if ($body.find('#specialThing').length) {
      // input was found, do something else here
      return 'input'
    }

    // else assume it was textarea
    return 'textarea'
  })
  .then((selector) => {
    // selector is a string that represents
    // the selector we could use to find it
    cy.get(selector).type(`found the element by selector ${selector}`)
  })

推荐阅读