Testing cypress不执行“then”部分

Testing cypress不执行“then”部分,testing,automated-tests,cypress,e2e-testing,Testing,Automated Tests,Cypress,E2e Testing,我正在尝试编写一个自定义的cypress命令,但是我的then部分中的代码没有执行。任何帮助都将不胜感激,谢谢 我的命令与此类似: Cypress.Commands.addex,=>{ 常量链接=[] cy.get*[class='link post'].eachlink=>{ links.pushlink.href }.然后=>{ var i=0; whilelinks[i]{ 西·维斯特林 我++ } } } 这里有几件事我们应该处理 在每个块中,link.href将返回一个未定义的值,因此

我正在尝试编写一个自定义的cypress命令,但是我的then部分中的代码没有执行。任何帮助都将不胜感激,谢谢 我的命令与此类似:

Cypress.Commands.addex,=>{ 常量链接=[] cy.get*[class='link post'].eachlink=>{ links.pushlink.href }.然后=>{ var i=0; whilelinks[i]{ 西·维斯特林 我++ } } }
这里有几件事我们应该处理

在每个块中,link.href将返回一个未定义的值,因此当您使用then方法时,数组中没有可访问的链接。请尝试links.pushlinks.attr'href'来获取href属性的值,而不是links.pushlink.href

在then方法中,while循环不是在数组中循环的最有效方法,它很可能会在未定义值的情况下出错。您应该改为使用.forEach,如下所示:

links.forEach((link)=>{
  cy.visit(link)
)
如果不需要持久化链接数组,则整个命令可以大大简化:

Cypress.Commands.add("ex", () => {
  cy.get("*[class='link post']")
    .then((links) => {
      links.each((link)=>{
        cy.visit(link.attr('href'))
      })
    })
});

这里有几件事我们应该处理

在每个块中,link.href将返回一个未定义的值,因此当您使用then方法时,数组中没有可访问的链接。请尝试links.pushlinks.attr'href'来获取href属性的值,而不是links.pushlink.href

在then方法中,while循环不是在数组中循环的最有效方法,它很可能会在未定义值的情况下出错。您应该改为使用.forEach,如下所示:

links.forEach((link)=>{
  cy.visit(link)
)
如果不需要持久化链接数组,则整个命令可以大大简化:

Cypress.Commands.add("ex", () => {
  cy.get("*[class='link post']")
    .then((links) => {
      links.each((link)=>{
        cy.visit(link.attr('href'))
      })
    })
});

加上克里的回答

给定给.then回调的参数是一个jQuery对象,包含cy.get找到的一个或多个元素

要迭代元素,需要使用spread运算符对jQuery对象进行反结构

Cypress.Commands.addvisitLinks,=>{ cy.get*[class='link post'] .then$links=>{/$links是一个jQuery包装器 […$links].forEachlink=>{//link是原始元素 const url=link.getAttribute'href'//应用DOM方法 西西里 } } }; 或者,如果您想使用Cypress迭代器,则使用each代替。然后

Cypress.Commands.addvisitLinks,=>{ cy.get*[class='link post'] .each$link=>{//jQuery包装的元素 const href=$link.attr'href'//应用jQuery方法 西。西。西。西 } }; 然而

快坏了

cy.visit导航页面,这会更改页面中的DOM,因此在的第二次迭代中,Cypress会看到内容已更改,可能是分离元素错误导致崩溃

您应该将获取链接的查询与访问链接的操作分开

Cypress.Commands.addgetLinks,=>{ 发现常数=[]; cy.get*[class='link post'] .each$link=>{//jQuery包装的元素 const href=$link.attr'href'//应用jQuery方法 found.pushhref } .then=>found//等待迭代完成 //然后返回链接数组 }; 像这样使用它

cy.getLinks .thenlinks=>{ links.forEachlink=>cy.visitlink }
加上克里的回答

给定给.then回调的参数是一个jQuery对象,包含cy.get找到的一个或多个元素

要迭代元素,需要使用spread运算符对jQuery对象进行反结构

Cypress.Commands.addvisitLinks,=>{ cy.get*[class='link post'] .then$links=>{/$links是一个jQuery包装器 […$links].forEachlink=>{//link是原始元素 const url=link.getAttribute'href'//应用DOM方法 西西里 } } }; 或者,如果您想使用Cypress迭代器,则使用each代替。然后

Cypress.Commands.addvisitLinks,=>{ cy.get*[class='link post'] .each$link=>{//jQuery包装的元素 const href=$link.attr'href'//应用jQuery方法 西。西。西。西 } }; 然而

快坏了

cy.visit导航页面,这会更改页面中的DOM,因此在的第二次迭代中,Cypress会看到内容已更改,可能是分离元素错误导致崩溃

您应该将获取链接的查询与访问链接的操作分开

Cypress.Commands.addgetLinks,=>{ 发现常数=[]; cy.get*[class='link post'] .each$link=>{//jQuery包装的元素 const href=$link.attr'href'//应用jQuery方法 found.pushhref } .then=>found//等待迭代完成 //然后返回链接数组 }; 使用它 像这样

cy.getLinks .thenlinks=>{ links.forEachlink=>cy.visitlink }
请不要将代码作为图像放在这里:我们自己尝试它会变得很困难。我感谢您的反馈,但我在远程机器上,无法从中复制。对不起,那么会是这个吗?但必须是这样吗。然后,我不确定我以前是否真正使用过这个命令或这个库,但这似乎是最明显的,我必须说,你真的需要正确格式化你的代码,因为很难理解结尾处所有的大括号和圆括号,请不要将代码作为图像放在这里:我们自己尝试它会变得很困难。我感谢您的反馈,但我在远程机器上,无法从中复制。对不起,那么会是这个吗?但必须是这样吗。然后,我不确定我以前是否真正使用过这个命令或这个库,但这似乎是最明显的,我必须说,你真的需要正确格式化你的代码,因为很难在结尾处找到所有大括号和圆括号,所以cypress返回links.forEach不是function@Alien0w0答案已更新。请尝试使用links.each而不是links.forEach.replace.then with.each或使用[…links].forEachlink=>..对jQuey links对象进行解构。这不起作用cypress返回链接。forEach不是function@Alien0w0答案已更新。请尝试links.each而不是links.forEach.replace.then with.each或使用[…links].forEachlink=>..对jQuey links对象进行结构化。这是我答案的一个很棒的补充,应该标记为答案。谢谢你的细节和清晰!谢谢你的帮助这是我答案的一个很棒的附录,应该标记为答案。谢谢你的细节和清晰!谢谢你的帮助