Javascript io如何在前钩子中获得数组的长度,并在以后重用它? 我的任务是进入页面,获取数组长度(a标签的长度) 并将其存储起来,以便在下一步中使用。我需要它一次,所以我在胡克之前先这样做 向前,我需要获取“a”标记,并检查它们是否具有“title”属性。这 案例将循环如此多次,因为许多“a”标记位于 网页这就是我需要数组长度的原因。
这是我的代码,根据“这不是一个好的实践”,文档称之为“代码做backflip”,但它应该可以工作: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
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>