Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 柏树:有条件地结束链_Javascript_Testing_Cypress - Fatal编程技术网

Javascript 柏树:有条件地结束链

Javascript 柏树:有条件地结束链,javascript,testing,cypress,Javascript,Testing,Cypress,我对cypress很陌生,但我想知道是否有某种方法可以有条件地结束命令链?我知道在cypress中应该避免条件测试,但我还是想尝试一下 我尝试过的 我试图通过将链传递给自定义命令来解决这个问题,但它似乎不起作用 Cypress.Commands.add('ifExists', { prevSubject: true }, (subject: object, element: string) => { cy.get('body').then(($body) => {

我对cypress很陌生,但我想知道是否有某种方法可以有条件地结束命令链?我知道在cypress中应该避免条件测试,但我还是想尝试一下

我尝试过的

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

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();
        }
    })
})
Cypress.Commands.add('ifExists',{prevSubject:true},(subject:JQuery,element:string)=>{
cy.wrap(主题)。然后($body)=>{
if($body.find(element.length){
返回cy.wrap(主题);
}否则{
返回cy.wrap(subject.end();
}
})
})
我只是想澄清一下我想从这个命令中得到什么。我希望能够将其添加到如下链中:

cy.get('body>#specialThing').ifExists()。然后((thing)=>…)

或者这个:

cy.ifExists('body>#specialThing')。然后((thing)=>…)


感谢所有的帮助和建议

我会查看关于条件测试的Cypress文档,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}`)
  })

我会查看关于条件测试的Cypress文档,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}`)
  })

您可以调整此处显示的jQuery或运算符

您不能使用
cy.get('body>#specialThing').ifExists()…
调用它,因为如果元素不在那里,cy.get()将失败,因此这意味着您的自定义命令必须是(no prevSubject)

Cypress.Commands.add('ifExists',{prevSubject:false},(选择器:字符串)=>{
const或selector=`${selector},body`;//注意逗号,如果“selector”返回body失败
返回Cypress.$(或选举人);
})
如果存在(“#特殊化”)。那么((事物)=>…)
您可能会发现返回
null
比返回
body
更有用,这样可以更轻松地测试结果

Cypress.Commands.add('ifExists', { prevSubject: false }, (selector: string) => {

  const result = Cypress.$(selector);
  return result.length ? cy.wrap(result) : null;

})

cy.ifExists('#specialThing').then((thing) => if (thing) ... else ... )
警告这将不可避免地导致测试不可靠。此命令中没有重试

您不能在DOM上执行条件测试,除非您:

  • 没有异步JavaScript的服务器端呈现
  • 使用只进行同步渲染的客户端JavaScript
了解应用程序的工作原理至关重要,否则您将编写不可靠的测试


使用
cy.get('body')。然后(…)
不会对要进行有条件测试的元素进行重试。

您可以调整此处显示的jQuery或运算符

您不能使用
cy.get('body>#specialThing').ifExists()…
调用它,因为如果元素不在那里,cy.get()将失败,因此这意味着您的自定义命令必须是(no prevSubject)

Cypress.Commands.add('ifExists',{prevSubject:false},(选择器:字符串)=>{
const或selector=`${selector},body`;//注意逗号,如果“selector”返回body失败
返回Cypress.$(或选举人);
})
如果存在(“#特殊化”)。那么((事物)=>…)
您可能会发现返回
null
比返回
body
更有用,这样可以更轻松地测试结果

Cypress.Commands.add('ifExists', { prevSubject: false }, (selector: string) => {

  const result = Cypress.$(selector);
  return result.length ? cy.wrap(result) : null;

})

cy.ifExists('#specialThing').then((thing) => if (thing) ... else ... )
警告这将不可避免地导致测试不可靠。此命令中没有重试

您不能在DOM上执行条件测试,除非您:

  • 没有异步JavaScript的服务器端呈现
  • 使用只进行同步渲染的客户端JavaScript
了解应用程序的工作原理至关重要,否则您将编写不可靠的测试


使用
cy.get('body')。然后(…)
不会对要进行有条件测试的元素进行重试。

这种方法对我也适用。这种方法对我也适用。