量角器-如何从一列获取所有单元格并在表格的row-Columns的id =“ 0-0”时对它们进行求和

时间:2018-08-06 06:44:06

标签: javascript jasmine protractor

我正在验证我正在测试的门户中的向下钻取过程,为此,我的脚本正在执行以下操作: 从表的第一行读取值,然后单击该值(某些单元格具有执行向下钻取到详细信息页面的链接) 要单击此特定单元格,请使用其ID:

<table id="transHistTable" class="table table-hover  table-bordered table-striped dataTable no-footer" style="width: 100%" role="grid" aria-describedby="transHistTable_info">
<thead>
<tbody>
<tr role="row" class="odd">
<td id="0-0" class="ng-scope">31 Jul 2018</td>
<td id="0-1" class="ng-scope">RandomText0</td>
<td id="0-2" class="ng-scope">RandomText1</td>
<td id="0-3" class="ng-scope">EmptyValue</td>
<td id="0-4" class="ng-scope">Value I Click And Save it</td>

因此对于此表,我直接单击第0行第4列,因为我的数据和过滤器将始终仅带来一行,但是随之而来的是我的问题。 当执行向下钻取时,我永远不知道会有多少行,因为这取决于用户操作。 我需要进行验证,以将钻取后显示的表中的所有值的总和与从“ transHistTable”表的第0行第4列中捕获的值进行比较。

这是执行“向下钻取”后得到的值:

<table id="transHistDetailTable" class="table table-hover  table-bordered table-striped dataTable no-footer" style="width: 100%" role="grid" aria-describedby="transHistDetailTable_info">
<thead>
</thead>
<tbody><tr role="row" class="odd">
<td id="0-0" class="ng-scope">Site</td>
<td id="0-1" class="ng-scope">Date</td>
<td id="0-2" class="ng-scope">Time</td>
<td id="0-3" class="ng-scope">I</td>
<td id="0-4" class="ng-scope">value 1</td>
<td id="0-5" class="ng-scope">value 2</td>
<td id="0-6" class="ng-scope">value 3</td>
<td id="0-7" class="ng-scope">12</td>
</tr></tbody>
</table>

所以我想做的是读取所有行(可能是0、1、2、3、4、5 ...),保存存储在第7列中的值,然后完成此操作,然后执行求和,然后与我从第一张表中保存的值进行比较。

我的代码就是这个:

            var rowstransHistDetail = element(by.id('transHistDetailTable')).all(by.tagName("tr"));

            rowstransHistDetail.count().then(function(rcount){
                //In case only 1 row is displayed
                if (rcount < 3)
                {
                    element(by.id('0-7')).getText().then(function(valueQty){  
                        expect(valueQty).toEqual(600)
                    })
                }
                else
                {
                    var tempValue
                    for (i=0; i < rcount; i++)
                    {
                        element(by.id(i+'-7')).getText().then(function(valueQty){

                            tempValue = Number(tempValue) + Number(valueQty)
                        })
                    }

                    expect(tempValue).toEqual(600);
                }
            });

但是当我执行此操作时,给了我一个未定义的值

有什么想法请解决这个问题吗?

谢谢!!!!

2 个答案:

答案 0 :(得分:1)

似乎您在执行之前在循环中增加了一个值。 看到这里:https://stackoverflow.com/a/6867907/6331748

应该在循环中使用蜜蜂i++而不是++i

如果我错了,请给我下一行。

==========================

编辑: 这是我这边的一些代码:

var expectedCells = element.all(by.css('#transHistDetailTable tr td:nth-of-type(5)'));
var currentSum = 0;
expectedCells.each((eachCell) => {
    eachCell.getText().then((cellText) => {
        currentSum += Number(cellText);
    });
}).then(() => {
    expect(currentSum).toEqual(600);
});

对不起,但是无法测试。我只想分享一个主要思想并加以阐述。

expectedCells都是id=n-4个单元格。我们遍历所有元素并从中获取文本,更改为数字类型并添加为当前值。后果是我们断言。

看起来if语句也不一定。 让我知道它是如何工作的。

答案 1 :(得分:1)

您的问题有两个选择:

1)使用element.all().reduce()

let total = element
    .all(by.css('#transHistDetailTable > tbody > tr > td:nth-child(8)'))
    .reduce(function(acc, item){
        return item.getText().then(function(txt) {
            return acc + txt.trim() * 1;
        });
    }, 0);

expect(total).toEqual(600);

2)使用element.all().getText()Array.reduce

let total = element
    .all(by.css('#transHistDetailTable > tbody > tr > td:nth-child(8)'))
    .getText(function(txts){ //txts is a string Array
        return txts.reduce(function(acc, cur){
            return acc + cur * 1;
        }, 0);
    });

expect(total).toEqual(600);