首页 > 解决方案 > 无法单击表格单元格以打开记录

问题描述

我正在尝试动态单击一行中的单元格,即我传递单元格中存在的文本并尝试单击它。

以下是我的代码:

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>

标签: javascripttypescriptprotractor

解决方案


更新的答案

基本上你的代码失败了,因为你的第一个发现是返回包含单元格的而不是单元格元素本身。这可能就是为什么点击似乎总是在第一个单元格中。

有关更多详细信息,这里有许多问题,因此我们可以按顺序查看它们。你不应该使用awaitwith .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元素,并调用.find包含行元素的 elementArray。.find找到原始数组中的一个元素,在您的情况下这些元素都是行元素,看来您正在期待一个单元格值。

看来您根本不需要担心行,因此您可以尝试以下操作

await element(by.xpath('//div/table/tbody/tr//td[text()=cellValue]').click();

推荐阅读