提问人:Fah 提问时间:8/5/2022 最后编辑:Fah 更新时间:8/6/2022 访问量:791
Cypress 循环到 td 值并获取特定的 tr 求和(TR 长度将是动态的)
Cypress to loop to td values and get a specific tr to sum (TR length will be dynamic)
问:
我知道循环和使用条件测试不是一个很好的选择。然而,这是我设法做到这一点的唯一方法。
我的问题是正确循环所有行并在可用时将值包装在第 10 列中。
我有一个动态表,有时和另一个时间根据索引tr。就像在图像中一样
当 td = 12 时,第 10 列将有一个 valeu(我需要换行和求和的值td=12
td=4
)
我编写了一个部分有效的测试,我不确定为什么当 td 长度 =12 时它没有得到第 10 列的值,当行的长度 = 4 时,我需要它循环到下一行,直到它找到有 10 列的行。
function textAmountToNumber(textValue) {
const text = textValue.replace(/[£,]/g, '').trim()
return Number(text)
}
let haselemente = true
let index = 0
let sum = 0
const amountCol = 10
cy.get('tbody')
.find('tr')
.then((e) => {
while (haselemente) {
const length = e.length - 1
if (index < length) {
cy.get('tbody')
.find('tr')
.eq(index)
.then(($td) => {
if ($td.find('td').length < amountCol) {
} else {
cy.get('tbody')
.find('tr')
.eq(index)
.find('td')
.eq(amountCol)
.each(($el, index, $list) => {
cy.wrap($el).then((element) => {
sum += textAmountToNumber(element.text())
cy.log(sum)
})
})
}
})
index++
} else {
haselemente = false
}
}
})
由于 td = 4,它在第二行中断。
它确实循环了所有行,但是当列 <= 10 时,它仍然从 listl 的第一行 index = 0 中获取值。
将其相加的原因是将总值与另一个元素进行比较。
<table data-testid="section-list-card" class="table table-sm table-nowrap card-table table-hover linked-transactions-table"><thead><tr><!----> <th class="sortable"><div class="sortable">
COLUMN 1
<i class="uil uil-sort" style="font-size: 12px;"></i></div></th><th class="sortable"><div class="sortable">
COLUMN 2
<i class="uil uil-sort" style="font-size: 12px;"></i></div></th><th class="sortable" style="width: 9%;"><div class="sortable">
COLUMN 3
<i class="uil uil-sort" style="font-size: 12px;"></i></div></th><th class="">
COLUMN 4
</th><th class="sortable" style="width: 100px;"><div class="sortable">
COLUMN 5
<i class="uil uil-sort" style="font-size: 12px;"></i></div></th><th class="" style="width: 10%; text-align: right;">
COLUMN 6
</th><th class="" style="width: 10%;">
COLUMN 7
</th><th class="" style="width: 10%;">
COLUMN 8
</th><th class="" style="width: 10%;">
COLUMN 9
</th><th class="" style="width: 10%;">
COLUMN 10
</th> <th style="width: 5%;"></th></tr></thead> <tbody class="list"><tr role="row"><!----> <td><button type="button" class="btn row-collapse-expand-btn btn-link btn-sm"><i class="uil uil-angle-down" style="font-size: 20px;"></i></button> <a href="/quotes/96f37a8b-20b3-4b7c-ba1b-129db2c09bcb/show" class="">
00001
</a> <!----> <!----> <!----></td><td><a href="/clients/96f37a8a-8e46-4789-8440-5f07dcd18586/show" class=""><span>
S Smith
</span></a> <!----> <!----> <!----></td><td> <!---->
2022-10-17
</td><td><div class="d-flex align-items-center"><div>
Amount
</div></div> <!----> <!----></td><td> <!----> <!----></td><td><div class="text-right">
£ 4,000.56
</div> <!----> <!----></td><td><span>
£ 0.00
</span> <!----> <!----></td><td><span>
£ 0.00
</span> <!----> <!----></td><td><span>
£ 0.00
</span> <!----> <!----></td><td><span>
£ 4,000.56
</span> <!----> <!----></td> <td class="text-right"></td></tr> <tr class="row-tight" style=""><td colspan="3"></td> <td colspan="2"><div class="d-flex align-items-center"><i class="mr-2 uil uil-corner-down-right" style="font-size: 12px;"></i>
Gross Premium (premium)
<!----> <div class="ml-1 con-separator-left"><a href="/entities/91d519ef-c04f-48c5-9902-2a5dd0227e59/show" class="">
MuS
</a></div></div> </td> <td class="text-right"><span class="balance-text text-success">
£ 5,064.00
</span> </td> <td colspan="4"></td></tr><tr class="row-tight" style=""><td colspan="3"></td> <td colspan="2"><div class="d-flex align-items-center"><i class="mr-2 uil uil-corner-down-right" style="font-size: 12px;"></i>
Fee
<!----> <div class="ml-1 con-separator-left"><a href="/entities/2316df55-9aa6-4777-9587-ec77939fa1db/show" class="">
M Smith
</a></div></div> </td> <td class="text-right"><span class="balance-text text-danger">
£ -354.48
</span> </td> <td colspan="4"></td></tr><tr class="row-tight" style=""><td colspan="3"></td> <td colspan="2"><div class="d-flex align-items-center"><i class="mr-2 uil uil-corner-down-right" style="font-size: 12px;"></i>
Commision
<!----> <div class="ml-1 con-separator-left"><a href="/entities/d935c1b4-e733-4c22-bc40-638d25160796/show" class="">
KKK
</a></div></div> </td> <td class="text-right"><span class="balance-text text-danger">
£ -708.96
</span> </td> <td colspan="4"></td></tr><tr role="row"><!----> <td><button type="button" class="btn row-collapse-expand-btn btn-link btn-sm"><i class="uil uil-angle-down" style="font-size: 20px;"></i></button> <a href="/quotes/96f37a8b-20b3-4b7c-ba1b-129db2c09bcb/show" class="">
00001
</a> <!----> <!----> <!----></td><td><a href="/clients/96f37a8a-8e46-4789-8440-5f07dcd18586/show" class=""><span>
S Smith
</span></a> <!----> <!----> <!----></td><td> <!---->
2022-10-17
</td><td><div class="d-flex align-items-center"><div>
Amount
</div></div> <!----> <!----></td><td> <!----> <!----></td><td><div class="text-right">
£ 1,591.85
</div> <!----> <!----></td><td><span>
£ 0.00
</span> <!----> <!----></td><td><span>
£ 0.00
</span> <!----> <!----></td><td><span>
£ 0.00
</span> <!----> <!----></td><td><span>
£ 1,591.85
</span> <!----> <!----></td> <td class="text-right"></td></tr> <tr class="row-tight" style=""><td colspan="3"></td> <td colspan="2"><div class="d-flex align-items-center"><i class="mr-2 uil uil-corner-down-right" style="font-size: 12px;"></i>
Gross
<!----> <div class="ml-1 con-separator-left"><a href="/entities/91d519ef-c04f-48c5-9902-2a5dd0227e59/show" class="">
MuS
</a></div></div> </td> <td class="text-right"><span class="balance-text text-success">
£ 2,015.00
</span> </td> <td colspan="4"></td></tr><tr class="row-tight" style=""><td colspan="3"></td> <td colspan="2"><div class="d-flex align-items-center"><i class="mr-2 uil uil-corner-down-right" style="font-size: 12px;"></i>
Fee
<!----> <div class="ml-1 con-separator-left"><a href="/entities/2316df55-9aa6-4777-9587-ec77939fa1db/show" class="">
S Smith
</a></div></div> </td> <td class="text-right"><span class="balance-text text-danger">
£ -141.05
</span> </td> <td colspan="4"></td></tr><tr class="row-tight" style=""><td colspan="3"></td> <td colspan="2"><div class="d-flex align-items-center"><i class="mr-2 uil uil-corner-down-right" style="font-size: 12px;"></i>
Commision
<!----> <div class="ml-1 con-separator-left"><a href="/entities/d935c1b4-e733-4c22-bc40-638d25160796/show" class="">
KKK
</a></div></div> </td> <td class="text-right"><span class="balance-text text-danger">
£ -282.10
</span> </td> <td colspan="4"></td></tr><tr role="row"><!----> <td><button type="button" class="btn row-collapse-expand-btn btn-link btn-sm"><i class="uil uil-angle-down" style="font-size: 20px;"></i></button> <a href="/quotes/96f37a8b-20b3-4b7c-ba1b-129db2c09bcb/show" class="">
00001
</a> <!----> <!----> <!----></td><td><a href="/clients/96f37a8a-8e46-4789-8440-5f07dcd18586/show" class=""><span>
S Smith
</span></a> <!----> <!----> <!----></td><td> <!---->
2022-10-17
</td><td><div class="d-flex align-items-center"><div>
Amount
</div></div> <!----> <!----></td><td><a href="/invoices/96f37a8d-a552-4db2-ba10-377810f2f78a/show" class="">
00001
</a> <!----> <!----></td><td><div class="text-right">
£ 5,000.70
</div> <!----> <!----></td><td><span>
£ 0.00
</span> <!----> <!----></td><td><span>
£ 0.00
</span> <!----> <!----></td><td><span>
£ 0.00
</span> <!----> <!----></td><td><span>
£ 5,000.70
</span> <!----> <!----></td> <td class="text-right"></td></tr> <tr class="row-tight" style=""><td colspan="3"></td> <td colspan="2"><div class="d-flex align-items-center"><i class="mr-2 uil uil-corner-down-right" style="font-size: 12px;"></i>
Gross Premium (premium)
<!----> <div class="ml-1 con-separator-left"><a href="/entities/91d519ef-c04f-48c5-9902-2a5dd0227e59/show" class="">
MuS
</a></div></div> </td> <td class="text-right"><span class="balance-text text-success">
£ 6,330.00
</span> </td> <td colspan="4"></td></tr><tr class="row-tight" style=""><td colspan="3"></td> <td colspan="2"><div class="d-flex align-items-center"><i class="mr-2 uil uil-corner-down-right" style="font-size: 12px;"></i>
Fee
<!----> <div class="ml-1 con-separator-left"><a href="/entities/2316df55-9aa6-4777-9587-ec77939fa1db/show" class="">
S Smith
</a></div></div> </td> <td class="text-right"><span class="balance-text text-danger">
£ -443.10
</span> </td> <td colspan="4"></td></tr><tr class="row-tight" style=""><td colspan="3"></td> <td colspan="2"><div class="d-flex align-items-center"><i class="mr-2 uil uil-corner-down-right" style="font-size: 12px;"></i>
Agent Commision (agent_commission 14.00%)
<!----> <div class="ml-1 con-separator-left"><a href="/entities/d935c1b4-e733-4c22-bc40-638d25160796/show" class="">
KKK
</a></div></div> </td> <td class="text-right"><span class="balance-text text-danger">
£ -886.20
</span> </td> <td colspan="4"></td></tr></tbody> <tfoot></tfoot></table>
```
答:
0赞
agoff
8/5/2022
#1
假设有总元素,其中 th 是总和,我们可以连续检查新的总和值。x
td
x-1
let sum = 0;
...
cy.get('td')
.each(($el, index, $list) => {
if (index < $list.length - 1) {
sum += textAmountToNumber($el)
}
})
.last()
.invoke('text')
.then(textAmountToNumber)
.should(...) // whatever assertion to compare the `sum` variable to the actual sum `td` field.
需要注意的是:这需要将您的函数从接受字符串(例如)更改为接受 JQuery 元素(并添加到元素中)。例如:textAmountToNumber
$el.text()
.text()
const foo = (value: string) => {
return +value
}
// vs.
const foo = (value: JQuery<HTMLElement>) => {
return +value.text()
}
我对你想要达到的结果并不肯定,所以如果我错过了目标,请告诉我。
评论
0赞
Fah
8/5/2022
我在包装我更新图像的值时遇到问题。如何在图像中看到。有值为 com 的行(我需要包装并求和这个值)。当行上没有值时,它需要循环到下一行,直到找到 上的值。这是我需要求和的价值吗?column 10 when
td length = 12
td=10
td=10
column 10
0赞
Fah
8/5/2022
我尝试,它只是用索引 0 包装行中的值cy.get('td') .each(($el, index, $list) => { if (index < $list.length - 1) { sum += textAmountToNumber($el) } })
0赞
jjhelguero
8/5/2022
#2
使用 的另一种方法是使用 jQuery :contains
获取 td,然后解析出值并转换为数字进行汇总。.each()
它看起来像这样:
cy.get("td:contains(£)")
// check if there will always be at least one row with price
.should("have.length.greaterThan", 0)
.then(($prices) => {
// we get the innerText to get the float value of the text before we sum them
const priceText = Cypress._.map($prices, (el) => el.innerText);
const removeAllNonNumeric = (str) => str.replace(/[^0-9.]/g, "");
const prices = priceText.map(removeAllNonNumeric).map(parseFloat);
// sum up the prices and return the value
const sum = prices.reduce((partialSum, a) => partialSum + a, 0);
return sum;
})
// now we are working with the sum of prices and assert it equals the total you expect
.should("eq", *expectedSumTotal*);
这是一个简单的例子。
评论
0赞
Fah
8/5/2022
它总共有 12 列,其中 5 列有货币货币 - 所以不可能使用 cy.get(“td:contains(£)”),td 长度将是 4 或 12,当长度为 = 12 时,我需要 cypress 来扭曲值。我需要第 10 列的值,当该行的长度 = 4 时,我需要它循环到下一行,直到它找到有 10 列的行
0赞
jjhelguero
8/5/2022
有趣的是看到屏幕截图。如果您可以显示表格的一些 HTML 结构,那将很有帮助。否则,这可能是黑暗中的另一次射击。
0赞
Fah
8/5/2022
将更新,但问题是循环所有行并在有值时仅获取/包装第 10 列的值
1赞
Fody
8/5/2022
#3
也许尝试过滤掉少于 10 行的行<td>
let sum = 0;
const amountCol = 10
cy.get('tbody')
.find('tr')
.filter(function() {
return Cypress.$(this).find('td').length >= amountCol; // only rows enough <td>
})
.each($tr => {
const amountColumn = $tr.find('td').eq(amountCol);
sum += textAmountToNumber(amountColumn.text())
// cy.log(sum) // won't work, always shows initial value of 0
console.log(sum) // show total as incremented
})
cy.then(() => {
cy.log(sum);
expect(sum).to.eq(...)
})
或
let sum = 0;
const amountCol = 10
cy.get('tbody')
.find('tr')
.filter(':not(.row-tight)')
.each($tr => {
...
})
使用实弹进行全面测试(实际 HTML)
it('sums the 5th column', () => {
let sum = 0;
const amountCol = 5
cy.get('tbody')
.find('tr')
.filter(':not(.row-tight)')
.each($tr => {
const amountColumn = $tr.find('td').eq(amountCol);
console.log($tr.find('td')) // take a look at the cols
sum += textAmountToNumber(amountColumn.text())
cy.log(sum) // this does show the incremental total
})
cy.then(() => {
cy.log(sum);
expect(sum).to.eq(10593.11) // ✅ passes
})
});
评论
0赞
Fah
8/5/2022
小计在卡片表的另一个表中,因此在赛普拉斯将第 10 列的值相加后,我会将此值与另一个卡片表中的总值进行比较。
0赞
Fah
8/5/2022
它只是获取值 = 0,它确实过滤并显示 3 行(具有第 10 列的行的长度),但始终将值换行 0
0赞
Fody
8/5/2022
你像我一样使用吗?cy.then(() => cy.log(sum))
0赞
Fah
8/5/2022
是的,我正在做你所做的。顺便说一句,它确实循环到所有行、过滤器,但不包装任何值get tbody 187 find tr 12 188 get tbody 189 find tr 12 190 filter 3 191 get tbody 192 find tr 12 193 filter 3 194 get tbody 195 find tr 12 filter 3
0赞
Fody
8/5/2022
让我试试吧,也许我错过了什么。
评论