Javascript io如何在前钩子中获得数组的长度,并在以后重用它? 我的任务是进入页面,获取数组长度(a标签的长度) 并将其存储起来,以便在下一步中使用。我需要它一次,所以我在胡克之前先这样做 向前,我需要获取“a”标记,并检查它们是否具有“title”属性。这 案例将循环如此多次,因为许多“a”标记位于 网页这就是我需要数组长度的原因。

Javascript io如何在前钩子中获得数组的长度,并在以后重用它? 我的任务是进入页面,获取数组长度(a标签的长度) 并将其存储起来,以便在下一步中使用。我需要它一次,所以我在胡克之前先这样做 向前,我需要获取“a”标记,并检查它们是否具有“title”属性。这 案例将循环如此多次,因为许多“a”标记位于 网页这就是我需要数组长度的原因。,javascript,testing,automated-tests,cypress,Javascript,Testing,Automated Tests,Cypress,这是我的代码,根据“这不是一个好的实践”,文档称之为“代码做backflip”,但它应该可以工作: let sizeVar; before(() => { cy.visit("https://web-page"); cy.get("a").not("[href='']").not("[href='#']").its("length").then((size) =&g

这是我的代码,根据“这不是一个好的实践”,文档称之为“代码做backflip”,但它应该可以工作:

    let sizeVar;

before(() => {
    cy.visit("https://web-page");
    cy.get("a").not("[href='']").not("[href='#']").its("length").then((size) => {
        sizeVar = Cypress.$(size);
        return sizeVar;
    });
})

for (let i = 0; i < sizeVar; i++) {
    it(`tag <a> index ${i}`, () => {
        cy.get("a").not("[href='']").not("[href='#']").eq(i).should("have.attr", "title");
    })
}
let sizeVar;
之前(()=>{
访问(”https://web-page");
cy.get(“a”)。不是(“[href=”)”)。不是(“[href=”#“])。它的(“长度”)。然后((大小)=>{
sizeVar=柏树。$(尺寸);
返回sizeVar;
});
})
for(设i=0;i别名

before(() => {
    cy.visit("https://web-page");
    cy.get("a").not("[href='']").not("[href='#']").its("length").as("size");
})

for (let i = 0; i < this.size; i++) {
    it(`tag <a> index ${i}`, () => {
        cy.get("a").not("[href='']").not("[href='#']").eq(i).should("have.attr", "title");
    })
}
之前(()=>{
访问(”https://web-page");
cy.get(“a”)。不是(“[href=”)”)。不是(“[href=”#“])。它的(“长度”)。作为(“大小”);
})
for(设i=0;i{
cy.get(“a”).not(“[href=”)”).not(“[href=”#“]).eq(i).应该(“have.attr”,“title”);
})
}
同样,我没有工作,这次我得到了“无法读取未定义的属性'size'”。我哪里出错了?请帮助

===============================更新===============================

我正在考虑使用纯JS,但这也不起作用…我在代码中没有看到任何错误逻辑…但Cypress不想传递此变量:(

描述(“测试”,()=>{
让links=document.queryselectoral(“a”);
让linksLength=links.length;
之前(()=>{
访问(”https://web-page");
})
for(设i=0;i{
cy.get(“a”).not(“[href=”)”).not(“[href=”#“]).eq(i).应该(“have.attr”,“title”);
})
}
})

问题在于,在任何测试开始之前都会对for循环进行评估。您可以将其视为一个两次通过的过程,第一次通过加载命令队列,第二次通过运行命令

我能找到的最好方法是使用两个连续的
.then()
子句来拆分日志记录和测试

测试

it('finds external links', () => {

  cy.visit("https://web-page");

  cy.get("a").not("[href='']").not("[href='#']") 
    .then($list => {

      // Get the titles 
      const titles = [...$list].map((el) => Cypress.$(el).attr('title') )

      // Log all their values
      titles.forEach((value, index) => {
        cy.log(`tag <a> index ${index} - title is ${value}`)
      })

      // Pass on to next then()
      return cy.wrap(titles)
    })
    .then(titles => {

      // Test the titles
      expect(titles.every(title => title)).to.equal(true, 'All titles are defined')

    })
})
log tag <a> index 0 - title is 1
log tag <a> index 1 - title is undefined
log tag <a> index 2 - title is 3

AssertionError  All titles are defined: expected false to equal true
it('查找外部链接',()=>{
访问(”https://web-page");
cy.get(“a”)。不(“[href=”)”)。不(“[href=”#“]))
。然后($list=>{
//获得头衔
常量titles=[…$list].map((el)=>Cypress.$(el).attr('title'))
//记录它们的所有值
titles.forEach((值、索引)=>{
cy.log(`tag//ok
//失败
//嗯
//忽略
//忽略

您好,谢谢您的回复,但每个()都不是我的解决方案。这样,我将创建一个测试用例,它将在第一次失败时停止运行。如果我将循环该测试用例()我将对我感兴趣的每个元素进行排序。这在使用带有静态数字的for循环时效果很好。问题是将循环的大小放入一个变量中。事实上,您认为
.each()是正确的
在第一个未定义的标记上失败。但是我认为for循环是不可能的,因为您希望筛选刮取测试的数量。有一种方法可以使用chained
拆分日志记录和期望值。然后()
,请参阅修订。因此,cypress似乎有一些我们目前无法通过的限制,但您的解决方案是迄今为止最好的方法。感谢您的帮助!一般最佳做法是进行不需要屏幕刮取的测试(即数据已知)。什么场景需要您动态查找元素的数量?一种方法是将大小存储到cypress env变量中,然后可以在当前测试中访问它。
cy.get(“a”)。不是([href=”)。不是([href=”)。它的(“长度”)。然后((size)=>{cypress.env('arraysize',“size”)}
。然后您可以使用
cypress.env('arraysize')
用于循环。您好,谢谢您的帮助。我尝试了您的解决方案,但得到了与我的“sizeVar”变量相同的结果:“在您的文件中找不到任何测试。我们无法在上面的文件中检测到任何测试。请编写一些测试并重新运行。”什么是“代码执行backflip”?不要问我:)在这里输入ctrl+f“backflip”并自行查看:)
it('finds external links', () => {

  cy.visit("https://web-page");

  cy.get("a").not("[href='']").not("[href='#']") 
    .then($list => {

      // Get the titles 
      const titles = [...$list].map((el) => Cypress.$(el).attr('title') )

      // Log all their values
      titles.forEach((value, index) => {
        cy.log(`tag <a> index ${index} - title is ${value}`)
      })

      // Pass on to next then()
      return cy.wrap(titles)
    })
    .then(titles => {

      // Test the titles
      expect(titles.every(title => title)).to.equal(true, 'All titles are defined')

    })
})
log tag <a> index 0 - title is 1
log tag <a> index 1 - title is undefined
log tag <a> index 2 - title is 3

AssertionError  All titles are defined: expected false to equal true
<div>
  <a href="link1" title="1">1</a>   // ok
  <a href="link2">2</a>             // fails
  <a href="link4" title="3">3</a>   // ok
  <a href="">4</a>                  // ignored
  <a href="#">5</a>                 // ignored
</div>