繁体   English   中英

如何在 Protractor 中的 do…while 循环中处理 Promise

[英]How to handle Promises in do…while loop in Protractor

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);
    })
});

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

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

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

为此,我在下面编写了代码。 我使用过Do...while因为我必须在第一页无条件检查(即下一个按钮是否启用)。

发生的问题是:

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

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

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

仍然不确定您要完成什么,但是如果您像这样更改代码,则解决 promise 应该可以工作:

    }).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,您还可以执行以下操作:

.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 
    })

我尝试添加异步和等待,但是当我添加这些时它显示错误(红色十字标记)。在我添加这些异步和等待到我的 protractor 脚本之前,我需要导入任何内容。 我已经在我的配置文件中完成了 (SELENIUM_PROMISE_MANAGER: false, )。除了添加异步和等待之外,我还需要做什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM