【问题标题】:Protractor - looping through table to select option from listbox量角器 - 循环遍历表格以从列表框中选择选项
【发布时间】:2014-09-16 17:35:08
【问题描述】:

我正在尝试使用量角器遍历一个表,以查看一行是否包含选择元素。然后选择两个特定选项之一。到目前为止,测试“通过”,但实际上没有选择任何内容。我最近的尝试如下。

it('should loop through table and select an option if listbox is available', 
function () {
    var table= element(by.xpath("//table[@id='tableID']"));
    var count = table.length;
    var currentType = "";

    for (var i = 1; i <= count; i++) {
        tableSelect(i);
    }

    function tableSelect(i) {
        it('should loop through this table and associate', function () {
            expect(table.isDisplayed()).toBe(true);

            if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]")).isDisplayed()) {

                if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]//select[matches(@ng-change,'listChange()')]")).isDisplayed()) {

                    var varOne = element(by.xpath("//table[@id='tableID']/" + 
                         "tbody/tr[" + i + "]/td[4]/div/span/span")).getText();

                    if (currentType != "Moretext" || varOne.Length < 6) {
                        element(by.xpath("//table[@id='tableID']/tbody/tr[" + i +
                                         "]/td[6]/div/span/div/select")).
                            element(by.cssContainingText('option', 
                                    'This is option A')).click();
                    }
                    else {
                        element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'This is option B')).click();
                    }
                }
                else if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).isDisplayed()) {
                    currentType = element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).getText();

                }
            }
        });
    }

    var saveBtn = elem(by.id('saveButton'));
    expect(associateBtn.isDisplayed()).toBe(true);
    expect(associateBtn.isEnabled()).toBe(true);
    saveBtn.click();
});

这是尝试 #2:

element.all(by.repeater('row in datarows')).then(function(rows) {
    for (var i = 1; i <= rows.length; ++i) {
        if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]//select[matches(@ng-change,'listChange()')]")).isDisplayed()) {

            var varOne = element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[4]/div/span/span")).getText();

            if (currentType != "MoreText" && varOne.Length < 6) {
                element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'This is option A')).click();
            }
            else {
                element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'This is option B')).click();
            }
        }
        else if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).isDisplayed()) {
            currentType = element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).getText();
        }
    }
});

这是最新的尝试:

var varOne = "";
var varTwo = "";

element.all(by.xpath("//table[@id='tableID']/tbody/tr")).then(function (rows) {
    for (var i = 1; i < (rows.length); i++) {

        console.log('rowcount = ' + i);

        element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]")).isDisplayed().then(function (visible) {
            if (visible) {
                element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]//select[@ng-change='listChange()']")).isDisplayed().then(function (visible) {
                    if (visible) {
                        element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[4]/div/span/span")).getText().then(function (monthText) {
                            varTwo = monthText;

                            console.log(varTwo);
                        });

                        if (varOne != "Revolving" || varTwo.length < 6) {
                            element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'Exclude: Duplicate Account')).click();
                        }
                        else {
                            element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'Include in Ratios')).click();
                        }
                    }
                    else {
                        element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).isDisplayed().then(function (visible) {
                            if (visible) {
                                element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).getText().then(function (currText) {
                                    varOne = currText;
                                    console.log(varOne);
                                });
                            }
                        });
                    }
                });
            }
        });
    }
});

【问题讨论】:

    标签: angularjs gruntjs protractor


    【解决方案1】:

    类似代码

    if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]")).isDisplayed()) {
    

    不会工作,因为它总是评估为真,因为承诺对象是每个 Javascript 布尔值的真值。

    你需要遵守承诺:

    var elm = element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]"));
    elm.isDisplayed().then(function(visible) {
      if (visible) {
        // logic here
      }
    });
    

    假设元素存在,如果不存在,则 isDisplayed 将在 webdriver 级别失败,因此您可以测试 isPresent 而不是 isDisplayed

    【讨论】:

    • 我试过了,看起来我更接近了。但我收到此错误:“错误:使用定位器找不到元素:By.xpath(“//table[@id='tableID']/tbody/tr[10]/tr[6]/div/span/ div/select[@ng-change='listChange()']" 。这是有道理的,因为该行没有选择元素。在这种情况下,它应该移动到条件的 else 部分。至少我是这么认为的。
    • 这种情况下你应该使用 isPresent 而不是 isDisplayed
    • 我确实更改为 isPresent,它通过但没有选择任何内容。
    • 在下面查看我的答案,根据您的建议,我想出了一个适合我的解决方案。
    • 我完全没想到会这样。恰恰相反。你提供的,对我帮助很大。感谢您的意见,我现在有了解决方案。
    【解决方案2】:

    这就是我过去常常让它工作的东西。我在 for 循环中调用了一个函数,函数内部是执行繁重工作的代码。

    it('should loop through table and select an option from each listbox available', function() {
        var varOne = "";
        var varTwo = "";
    
        element.all(by.xpath("//table[@id='tableID']/tbody/tr")).then(function (rows) {
            for (var i = 1; i < (rows.length); i++) {
                console.log('count = ' + i);
                selectWithinTable(i);
            }
    
            function selectWithinTable(i) {
                element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]")).isDisplayed().then(function(visible) {
                    if (visible) {
                        element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]//select[@ng-change='listChange()']")).isDisplayed().then(function(visible) {
                            if (visible) {
                                element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[4]/div/span/span")).getText().then(function(someText) {
                                    varTwo = someText;
                                    console.log(varTwo);
                                    console.log(varTwo.length);
                                });
    
                                if (varOne != "Revolving" || varTwo === "") {
                                    element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'This is option A')).click();
                                }
                                else {
                                    element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'This is option B')).click();
                                }
                            }
                            else {
                                element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).isDisplayed().then(function(visible) {
                                    if (visible) {
                                        element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).getText().then(function (moreText) {
                                            varOne = moreText;
                                            console.log(varOne);
                                        });
                                    }
                                });
                            }
                        });
                    }
                });
            }
        });
    
        element(by.id('buttonID')).isDisplayed().then(function(visible) {
            if(visible) {
                element(by.id('buttonID')).isEnabled().then(function(enabled) {
                    if (enabled) {
                        element(by.id('buttonID')).click();
                    }
                });
            }
        });
    });
    

    【讨论】:

    • 这一行是错误的:if (element(by.id('buttonID')).isDisplayed() &amp;&amp; element(by.id('buttonID')).isEnabled()) { 你又没有遵守.then 的承诺
    • @Leo Gallucci 是的,我注意到在我发布它之后,我已经在上面进行了编辑。我有它在我的项目文件夹中工作。
    【解决方案3】:

    //下面的代码可以让我遍历表格中的特定行和单元格

    async colRowIterate() {
        this.rowsTblValue.each(async (rowsValues: any) => {
            let cells = rowsValues.$$('td');
            cells.get(0).getText().then(async (cellvalues: any) => {
                await browser.sleep(10000);
                if (cellvalues == 'Harry') {
                    cells.get(4).$('button').click();
                }
    
            });
        });
    

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多