Как вы подозреваете, это, скорее всего, результат асинхронных проблем.Несмотря на то, что ваша функция входа в систему работает нормально, я бы лично написал ее, используя все await
вместо .then()
, например
this.login = async function (repo, username, password, domain) {
if (repo == null){ repo = REPO_UNDER_TEST; }
await browser.driver.manage().window().maximize();
await this.openLoginPage(domain);
await this.selectRepo(repo);
await this.usernameTextBox.sendKeys(username);
await this.passwordTextBox.sendKeys(password);
await this.signInButton.click();
console.log(`I'm starting my WAIT at ${Date().toString()}`);
await browser.wait(EC.titleIs(repo), 32000);
};
Хотя .then () работает, я считаю, что это намного лучше / прощеиспользуйте await
везде.await
ждет завершения следующего действия, прежде чем перейти к следующей строке кода, что аналогично множеству .then()
, но вы избегаете назойливых функций рождественской елки, которые могут стать кратными .then()
.
Я не вижу ничего плохого в самом тесте, хотя проверка isPresent()
на element.all
потенциально может вызвать проблемы, и я думаю, что проблема в этом.element
и element.all
не будут обрабатывать ни одного элемента, находящегося там.Например:
element.all(by.css('NothingHere'); // will return array with length of 0
element(by.css('NothingHere'); //will return an ElementFinder object
По сути, 0 является допустимым ответом, в то время как пустой ElementFinder выдаст ошибку, поэтому, если ваша первая проверка включена element.all()
, если что-то еще не загружено, оно с радостью вернет 0. Однакоelement()
увидит, что ничего еще нет, и подождет, пока элемент станет видимым, пока не истечет время ожидания. Если бы вы могли найти уникальный элемент внутри element.all(by.model('searchQuery'));
и нацелить его вместо этого, я ожидаю, что он пройдет.
Также при использовании async / await вам нужно иметь SELENIUM_PROMISE_MANAGER = false;
внутри вашего файла конфигурации