如何使用JavaScript从列表中检查选中了哪些复选框以及量角器中没有的复选框

时间:2019-02-27 16:39:40

标签: javascript html angularjs protractor

我正在尝试使用量角器编写一个端到端测试,我想从列表中获取名称以检查哪些复选框未选中。 我可以使用isSelected()检查复选框的状态,但是如何获取与之对应的名称列表。 这就是我要获取的标签Option 1和Option 2的标签,一一看是否被选中:

<ul _ngcontent-c8="" class="children" style="">
<li _ngcontent-c8="" class="ng-tns-c8 " ng-reflect-ng-class="[object Object]">
<input _ngcontent-c8="" class="ng-tns-c8" id="all" type="checkbox">
<label _ngcontent-c8="" class="ng-tns-c8" for="all">Option 1</label>
</li>
<li _ngcontent-c8="" class="ng-tns-c8 " ng-reflect-ng-class="[object Object]">
<input _ngcontent-c8="" class="ng-tns-c8" id="all" type="checkbox">
<label _ngcontent-c8="" class="ng-tns-c8" for="all">Option 2</label>
</li>
</ul>

任何帮助和建议将不胜感激

1 个答案:

答案 0 :(得分:0)

我有两种方法可以尝试,但我自己实际上还没有运行过。它们都涉及首先获取ul中的所有列表项,并且都使用async / await语法编写。

选项1

    let checkedNames = [];
    //iterate over all list items
    await element.all(by.xpath('ul[@class="children"]//li')).each(async (li) => {

        //if checkbox is selected then get label text and add to array
        let chkboxIsSelected = await li.element(by.tagName('input')).isSelected();
        if (chkboxIsSelected) {
            let lableTxt = await li.element(by.tagName('label')).getText();

            //Add lable text to array of labels
            checkedNames.push(lableTxt);
        };
    })

说明 element.all(by.xpath('ul[@class="children"]//li'))将返回elementFinder数组,我们可以对element finder数组调用几种方法,所有方法都在here中列出。 .each是这些方法之一,它将在元素查找器数组上迭代并在每个元素上运行一个函数。它需要将元素传递到函数中才能运行。

其语法如下

eleArray.each(function(elementInArray){

})

我们可以使用arrow notation声明此函数,由于它是一个列表项的数组,因此我们可以对其进行迭代,因此可以将传递给函数的参数重命名为'li',以进行描述。

eleArray.each((li) => {

})

此外,由于我使用的是async / await语法而不是Promise Manager,因此我在所有包含异步操作的函数之前添加关键字async,以检查您是否在浏览器中选中了复选框并从输入字段获取文本

选项2

    let allListItems = await element.all(by.xpath('ul[@class="children"]//li'));

    //filter out all of the list items that contain unchecked checkboxes
    let itemsWithSelectedChkbox = await allListItems.filter(async li => {
        return await li.element(by.tagName('input')).isSelected();
    });

    //convert the array of list items into an array which contains
    let textForAllCheckedBoxes = await itemsWithSelectedChkbox .map(async li => {
        return await li.element(by.tagName('label')).getText();
    })

    console.log(`The test associated with all the checked checkboxes is ${textForAllCheckedBoxes}`);

希望这些对您有用,但请告诉我是否存在问题!