我试图动态地单击一行中的一个单元格,即,我传递该单元格中存在的文本并尝试单击它。
以下是我的代码:
await element.all(by.xpath('//div/table/tbody/tr')).then(rows => {
rows.find(row => {
return row.all(by.tagName('td')).filter(async elem => {
await elem.getText().then(text => {
return text === cellValue;
});
});
}).click();
});
我希望这段代码可以帮我解决问题,但事实并非如此。我避免使用那些较旧的for循环,然后一一比较,然后单击以假定这些功能好得多。
上面的代码始终单击第一行,而不会进入
return row.all(by.tagName('td')).filter(async elem => {
也没有引发任何错误。不知道我在这里想念什么。
更新-以下内容对我有用。
const rows = await element.all(by.xpath('//table/div/table/tbody/tr'));
for (const row of rows) {
const columns = await row.all(by.tagName('td'));
const actualCellValue = await columns[columnIndex].getText();
console.log(':::cell text:: ' + await columns[columnIndex].getText());
if (actualCellValue === cellValue) {
clickWhenAvailable(columns[columnIndex]);
break;
}
}
}
示例HTML表格单元格-
<td _ngcontent-c30="" class="mat-cell cdk-column-Company mat-column-Company ng-star-inserted" mat-cell="" role="gridcell"> VAX - ABC </td>
答案 0 :(得分:0)
更新后的答案
基本上,您的代码失败,因为您的第一个发现返回的是包含单元格而不是单元格元素本身的行。这可能就是为什么点击总是显示在第一个单元格中的原因。
有关更多详细信息,此处存在许多问题,因此我们可以按顺序进行研究。
您不应该将await
与.then
一起使用。这两个都是用来兑现承诺的,所以这两行是等效的
await element(by.css('button')).getText().then(btnText=> {
console.log(btnText);
})
--- Is the same as (but below is much easier to read) ---
let btnText = await element(by.css('button')).getText();
console.log(btnText)
接下来,您将在表中找到所有tr
元素,并在包含行元素的elementArray上调用.find
。 .find
在原始数组中找到了其中一个都是行元素的元素,看来您正在期待一个单元格值。
您似乎根本不需要担心行,因此可以尝试以下操作
await element(by.xpath('//div/table/tbody/tr//td[text()=cellValue]').click();