Javascript 如何在量角器中处理do…while循环中的承诺

Javascript 如何在量角器中处理do…while循环中的承诺,javascript,while-loop,protractor,angular-promise,isenabled,Javascript,While Loop,Protractor,Angular Promise,Isenabled,我必须检查表中是否有供应商ID“IACE” 为此,我编写了代码,获取表的第一列中的所有值,并使用“each”进行检查 如果元素出现在第一页中,则代码可以工作。但如果是在第二页或第三页,我必须点击下一步按钮。在单击“下一步”按钮之前,我需要检查该按钮是否已启用或禁用。如果该按钮已启用,则单击next按钮并检查该元素是否存在于该页面中,依此类推。如果按钮被禁用,则意味着元素不存在,我必须使测试用例失败 为此,我在下面编写了代码。我使用了Do…while,因为我看到了第一页,它必须无条件地检查(即“下

我必须检查表中是否有供应商ID“IACE”

为此,我编写了代码,获取表的第一列中的所有值,并使用“each”进行检查

如果元素出现在第一页中,则代码可以工作。但如果是在第二页或第三页,我必须点击下一步按钮。在单击“下一步”按钮之前,我需要检查该按钮是否已启用或禁用。如果该按钮已启用,则单击next按钮并检查该元素是否存在于该页面中,依此类推。如果按钮被禁用,则意味着元素不存在,我必须使测试用例失败

为此,我在下面编写了代码。我使用了
Do…while
,因为我看到了第一页,它必须无条件地检查(即“下一步”按钮是否启用)

发生的问题是:

我已将
isEnabled()
值存储在
isEnabled
变量中。我已将此变量初始化为false

但当我运行测试用例时,虽然我的值在第二页,但它不会进入第二页。相反,它检查第一页并停止测试。发生这种情况是因为在
while(isenabled)
中,
isenabled
存储为
false
。在执行
isEnabled()
函数之前,我认为(isEnabled)正在执行。因此,
而(isenabled)
得到的是假值,即初始化值


我无法在此处找到解决承诺的位置和方法。

仍然不确定您试图实现的目标,但如果您像这样更改代码,解决承诺应该是可行的:

it('AddnewSupplier1',function() {       
    var i =0;
    var isenabled=false;
    var count=0;

    element(by.css("path[d*='M20.995']")).click();
    element(by.cssContainingText('div[class="mat-step-text-label ng-star-inserted"]','Supplier Maintenance')).getText().then(function(text) {
        console.log(text);
    }).then(function() {
        do {
            if (i>0) {
                console.log("Clicking on NextButton");
                element(by.css("button[class='mat-paginator-navigation-next mat-icon-button']")).click();
            }

            (element.all(by.xpath("//table[@class='mat-table']/tbody/tr/td[1]"))).each(function(webelement) {
                webelement.getText().then(function(text) {                  
                    if(text=="IACE") {
                        count++;
                        console.log("Element is found");
                        //break;
                    }
                });
            });

            var nextbutton = element(by.css("button[aria-label='Next page']"));
            nextbutton.isEnabled().then(function(isEnabled) {               
                var isenabled=isEnabled;
                console.log(isenabled);             
            }).then(function() {
                i++;
                console.log(i);
            });
        }
        while(isenabled);
    })
});
如果无法使用async/await,还可以执行以下操作:

    }).then(async function() { //add async
        do {
            // your code here up until var nextbutton = see next line

            var nextbutton = element(by.css("button[aria-label='Next page']"));

            isenabled = await nextbutton.isEnabled(); // await isEnabled and store result in isenabled variable
            console.log(isenabled);             
            i++;
            console.log(i);
        }
        while(isenabled);

我尝试添加async和await,但当我添加它们时,会显示错误(红色十字标记)。在我将这些async和await添加到量角器脚本之前,我需要导入任何内容。我已经在我的配置文件中完成了(SELENIUM\u PROMISE\u MANAGER:false)。除此之外,我还需要做什么来添加async和await。

使用async函数并在PROMISE处等待,然后循环必须等待,直到await处的PROMISE解决并且
isenabled
将设置为您似乎从未重新分配isenabled的值,所以它总是错误的。您似乎将isenabled设置为新的函数作用域变量isenabled。函数完成时丢失。我尝试添加async和await,但添加它们时会显示错误(红十字)。在将这些async和await添加到量角器脚本之前,我需要导入任何内容。我已经在配置文件中完成了(SELENIUM\u PROMISE\u MANAGER:false,)这项操作。除此之外,我还需要做什么来添加异步和等待。添加了基于无法使用异步/等待的新解决方案
.then(function() {
        function repeatMe() { // replace do with a function
            if (i>0) {
                console.log("Clicking on NextButton");
                element(by.css("button[class='mat-paginator-navigation-next mat-icon-button']")).click();
            }

            (element.all(by.xpath("//table[@class='mat-table']/tbody/tr/td[1]"))).each(function(webelement) {
                webelement.getText().then(function(text) {                  
                    if(text=="IACE") {
                        count++;
                        console.log("Element is found");
                        //break;
                    }
                });
            });

            var nextbutton = element(by.css("button[aria-label='Next page']"));
            nextbutton.isEnabled().then(function(isEnabled) {               
                console.log(isEnabled); // no need for isenabled variable anymore      
                i++;
                console.log(i);
                if (isEnabled) {
                    repeatMe(); // call repeatMe if isEnabled is true
                }
            });
        }
        repeatMe(); // replace while with calling function repeatMe once 
    })