Javascript 柏树:有条件地结束链
我对cypress很陌生,但我想知道是否有某种方法可以有条件地结束命令链?我知道在cypress中应该避免条件测试,但我还是想尝试一下 我尝试过的 我试图通过将链传递给自定义命令来解决这个问题,但它似乎不起作用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.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')。然后(…)
不会对要进行有条件测试的元素进行重试。这种方法对我也适用。这种方法对我也适用。