Транспортир browser.wait не чака

Предполагам, че browser.wait трябва да бъде блокиращо повикване, но не работи, както очаквах. Ето моята проба:

describe("browser.wait", function() {
    beforeEach(function() {
        browser.wait(function() {
            console.log('1 - BeforeEach WAIT');
            return true;
        });
    console.log('2 - BeforeEach after wait');
});

afterEach(function() {
    browser.wait(function() {
        console.log('4 - afterEach WAIT');
        return true;
    });
    console.log('5 - afterEach after wait');
});

it('should probably actually wait.', function() {
    console.log('3 - IT statement');
    expect(1).toBe(1);      
});

Сега, тъй като предположих, че browser.wait всъщност блокира, реших, че моите извиквания на console.log ще се изпълняват по ред; 1,2,3,4,5;

Действителният резултат, който получавам, е:

2 - BeforeEach after wait  
1 - BeforeEach WAIT  
3 - IT statement  
5 - afterEach after wait  
4 - afterEach WAIT  

Как мога да накарам browser.wait да чака? Или използвам напълно грешната функция? Трябва да блокирам неща, докато браузърът ми стигне до мястото, където трябва да бъде за следващото обаждане.


person Justin    schedule 06.01.2015    source източник


Отговори (3)


Всичко е за обещания (всъщност всеки въпрос за транспортир е за обещания).

browser.wait() не е блокиращо повикване, то < em>планира команда за изчакване на условие:

Планира команда за изчакване за задържане на условие, както е дефинирано от някаква предоставена от потребителя функция. Ако възникнат грешки по време на оценката на изчакването, те ще бъдат разрешени за разпространение. В случай, че дадено условие върне webdriver.promise.Promise, цикълът на анкета ще изчака то да бъде разрешено и ще използва разрешената стойност, за да оцени дали условието е изпълнено. Времето за разрешаване на обещание се взема под внимание дали изчакването е изтекло.

Това няма да извика функцията, която предавате веднага, ще планира команда и ще изчака да бъде разрешено обещание (ако функцията вътре върне обещание).

Можете да използвате then(), за да имате правилен ред в този случай:

beforeEach(function() {
    browser.wait(function() {
        console.log('1 - BeforeEach WAIT');
        return true;
    }).then(function () {
        console.log('2 - BeforeEach after wait');
    });
});

Вижте случаите на употреба тук:

person alecxe    schedule 06.01.2015
comment
Хубавото в това е, че примерният код в документа показва това като блокиращо изчакване, докато секцията Returns ви предупреждава, че това е Promise. Вижте: angular.github.io/protractor/#/ Пример от документа: var started = startTestServer(); driver.wait(started, 5 * 1000, 'Server should start within 5 seconds'); driver.get(getServerUrl()); - person atoth; 30.03.2016
comment
@atoth - съгласен съм с твърдението ти. Примерният код, който посочихте, е подвеждащ, както се показва като блокиращ. т.е. функцията driver.get() трябва действително да бъде обвита в изпълненото обещание. - person bob.mazzo; 25.01.2017

Трябва да инструктирате транспортира да спре, докато browser.wait бъде завършено, като използвате await

it('test case', async () => {
  await browser.wait(function() {
    console.log('1 - BeforeEach WAIT');
    return true;
  });
  console.log('2 - BeforeEach after wait');
});
person Sergey Pleshakov    schedule 09.02.2021

Функцията за изчакване ще задържи изпълнението за тази конкретна функция, но JavaScript работи по асинхронен начин. Така че понякога може да има шанс вашата функция да се изпълни преди функцията за изчакване. За да го разберете по-добре, трябва да прочетете Promises в angular/protractor.

За да работи вашият код, трябва да .then(function(){}); (моля функция 2 да изчака до 1-во завършване.

browser.wait(function() {
    console.log('1 - BeforeEach WAIT');
    return true;
}).then(function () {
    console.log('2 - BeforeEach after wait');
});
person Yash Jagdale    schedule 02.11.2017