我在量角器 - 黄瓜框架中使用typescript编写e2e测试。对于我的测试,我想将UI中的HTML表与黄瓜数据表进行比较。最初,我所做的只是尝试获取每个单元格文本。但我正面临着遍历表格的问题。这是我的代码,我是打字稿和javascript的新手,我混淆了所有的语法。如果代码看起来不好,请原谅。任何指针都表示赞赏。
getCellText() {
console.log('I am here');
//'brickletrows' is my page object equivalent of 'tbody tr'
this.brickletrows.array.forEach(element => {
let cells = element.$$('td');
console.log(cells.getText);
});
}
我收到错误:TypeError:无法读取上面的undefined属性'forEach'
async getCelltexts() {
//this.Bricklet_table_columns is my page object the equivalent of 'tbody tr td'
let someArray = [this.Bricklet_table_columns];
for (let cell of someArray) {
{
await console.log(cell.getText());
}
}
在控制台上为这一个打印出一堆乱码。我的最终目标是将单元格放在一个二维数组中,这样我就可以使用chai库来断言黄瓜表,其中包含我在此处形成的二维数组。有人可以指出我正确的方向。
我无法在这里发布DOM,因为它是一个敏感的信息。但该表与任何具有表id,tbody,th,tr,td标记的HTML表非常相似
因此,下面的代码部分工作 - 在某种意义上它能够遍历表,但是当我尝试与数据表进行比较时 - 它失败了,这是因为推送到2D数组的元素的顺序是随机的。我认为.each()函数是异步工作的 - 你是否知道如何纠正这个问题?
getCellValues(): Promise<string[][]> {
return new Promise<string[][]>(function (resolve, reject) {
let allValues = [];
// take all 'tr' child elements and iterate them using 'each()'
Brick_table_rows1.each(function(el){
//console.log("el text " + el.toString());
// create sub arr for filling one row in
let subArr = [];
// take a row and process each element
el.all(by.css('td')).each(function(subEl){
//console.log("subEl text: " + subEl.toString());
// get text of one row element
subEl.getText().then(function(text) {
// at the point we receive the text add it to sub array.
subArr.push(text);
console.log("subarr text: " + subArr.toString());
});
}).then(function () {
allValues.push(subArr);
console.log("arr text: " + allValues.toString());
});
}).then(function() {
resolve(allValues);
});
});
}
为了能够以正确的顺序存储元素,我们可以依赖索引。 ElementArrayFinder.each()
在其回调中提供了第二个参数索引。由于您要比较整个表,因此逐行比较就足够了,并且不需要将所有值都作为单个值。新功能看起来会更好一点如下:
async getCellValues(): Promise<string[]> {
return new Promise<string[]>(async function (resolve, reject) {
let table = element(by.css('#myTableID'));
let rows = table.all(by.css('tr'));
let rowCount = await rows.count();
let rowValues = new Array(rowCount);
rows.each(async (row, index) => {
let text = await row.getText();
rowValues[index] = text.trim();
}).then(function() {
resolve(rowValues);
});
});
}