代码之家  ›  专栏  ›  技术社区  ›  Ken Palmer

使用量角器和TypeScript,我如何才能基于该列的标题文本返回网格的列索引?

  •  2
  • Ken Palmer  · 技术社区  · 9 年前

    我正在尝试编写一个函数,根据该列的标题文本返回网格的列索引。我做了很多尝试,这些尝试出现在下面的评论中。最后,此函数总是返回-1,而不是预期的列索引。使用WebStorm调试器,我能够验证输入函数的参数是否被填充。

    此外,您可以看到我尝试通过CSS选择器来实现这一点,这是一种绝望的方法。

    public getColumnIndexByHeaderText(gridId: string, headerText: string): number {
        var GRID_HEADER_REPEATER: string = 'col in colContainer.renderedColumns track by col.uid';
        var columnIndex: number = -1;
    
        // Attempt A
        element(by.id(gridId)).all(by.repeater(GRID_HEADER_REPEATER)).getText().then(function (textArray) {
            columnIndex = textArray.indexOf(headerText);
        });
    
        // Attempt B
        element(by.id(gridId)).then(function (grid) {
            grid.all(by.repeater(GRID_HEADER_REPEATER)).getText().then(function (textArray) {
                columnIndex = textArray.indexOf(headerText);
            });
        });
    
        // Attempt C
        element.all(by.repeater(GRID_HEADER_REPEATER)).filter(function (elm, index) {
            return elm.getText().then(function (text) {
                if (text === headerText) {
                    return index;
                }
            });
        });
    
        // Attempt D
        var cssSelector = '#' + gridId + ' .ui-grid-header span.ng-binding';
        element.all(by.css(cssSelector)).getText().then(function (textArray) {
            columnIndex = textArray.indexOf(headerText);
        });
    
        return columnIndex;
    };
    

    我尝试的其他方法(此处未显示)也失败了。感觉我只是忽略了一些基本的东西。谢谢你的帮助。

    1 回复  |  直到 9 年前
        1
  •  2
  •   Ken Palmer    9 年前

    与一位同事合作,他指出了我上述方法的几个突出问题。他能够按如下方式解决此问题:

    首先,函数的签名需要返回一个承诺,而不是数字。注意返回类型和返回语句。

    public getIndexByHeaderText(gridId: string, headerText: string): protractor.promise.Promise<number> {
        var GRID_HEADER_REPEATER: string = 'col in colContainer.renderedColumns track by col.uid';
        return element(by.id(gridId)).all(by.repeater(GRID_HEADER_REPEATER)).getText().then(function (textArray) {
            return textArray.indexOf(headerText);
        });
    };
    

    其次,对该函数的调用需要将其视为一个promise,并通过then函数语法分配返回的值,就像这样。

    it('Should do something', function() {
        lib.grid.getRow.byRowIdentifier(page.GRID_ID, newUserEmailPrefix, 'name').then(function (gridReturnObject) {
            lib.grid.column.getIndexByHeaderText(page.GRID_ID, 'Header Text').then(function (columnIndex) {
                var deactivateButtonCell = gridReturnObject.rowCellElements[columnIndex];
                // Other code omitted for clarity...
            });
        });
    });