无法单击表格单元格以打开记录

时间:2019-03-29 14:14:22

标签: javascript typescript protractor

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

以下是我的代码:

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>

1 个答案:

答案 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();