Как обрабатывать обещания в do ... while в Protractor - PullRequest
0 голосов
/ 02 октября 2019
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);
    })
});

Я должен проверить, присутствует ли в таблице идентификатор поставщика "IACE".

Для этого я написал код, принимающий все значения в первом столбце таблицы, и проверил, используя "каждый". ".

Если элемент присутствует на первой странице, код работает. Но если это на второй или третьей странице, то я должен нажать на следующую кнопку. Прежде чем нажать на следующую кнопку, мне нужно проверить, включена ли кнопка или нет. Если кнопка включена, то я нажимаю на следующую кнопку и проверяю, присутствует ли элемент на этой странице и так далее. Если кнопка отключена, то это означает, что элемент отсутствует, и мне нужно пройти тестовый случай.

Для этого я написал код ниже. Я использовал Do ...while, потому что на первой странице он должен проверить без каких-либо условий (то есть следующая кнопка включена или нет).

Возникла проблема:

Я сохранил isEnabled() значение в isenabled переменная. Я инициализировал эту переменную как false.

Но когда я запускаю тестовый пример, хотя мое значение находится на второй странице, оно не переходит на вторую страницу. Вместо этого он проверяет на первой странице и останавливает тест. Это происходит потому, что в while(isenabled), isenabled хранится как false. Я думаю, что перед выполнением isEnabled() функция while(isenabled) выполняется. Поэтому while(isenabled) получает ложное значение, которое является инициализированным значением.

Я не могу найти, где и как решить обещание здесь.

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Я попытался добавить асинхронные и ожидающие, но когда я добавляю их, это показывает ошибку (красная крестовая метка). Мне нужно импортировать что-либо, прежде чем я добавлю эти асинхронные и ожидаю в своих скриптах транспортира. Я сделал (SELENIUM_PROMISE_MANAGER: false,) это в моем файле конфигурации. Что еще мне нужно сделать, кроме этого, чтобы добавить асинхронный режим и ждать.

0 голосов
/ 02 октября 2019

Все еще не уверен, что именно вы пытаетесь выполнить, но решение обещания должно сработать, если вы измените свой код следующим образом:

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