Итак, Protractor - это оболочка для webdriverJS, а webdriverJS полностью асинхронный.Чтобы дать определение очень высокого уровня, Protractor упаковывает webdriverJS так, что каждое действие возвращает обещание (например, .get (), .sendKeys (), .findElement ()).
Ранее webdriverJS имел то, что указанов качестве «потока управления», который позволял пользователям писать код так, как они бы это делали на любом синхронном языке программирования, и тот факт, что почти все обещание было обработано за кулисами.В последних версиях эта функция устарела, и основная причина в том, что введение стиля обработки обещаний async/await
значительно упрощает пользователям управление обещаниями.
Если вы используете транспортир 6.0+, поток управления по умолчанию отключен, но он будет отключен для вас независимо от того, как вы установили SELENIUM_PROMISE_MANAGER: false
.Вам нужно будет вручную управлять своими обещаниями, которые вы делаете, используя async/await
.
browser.driver против браузера
Я также хочу указать наиспользуя browser.driver.get
, вы ссылаетесь на базовый экземпляр селена, а не на экземпляр обертки транспортира, поэтому он не будет ждать стабилизации угловой страницы, прежде чем взаимодействовать (я могу ошибаться в этом).В этой теме есть больше информации о различии .
Любое действие, связанное с браузером или файловой системой, вероятно, будет обещанием, поэтому включите ожидание перед ними и любую функцию, которая содержитawait должен быть объявлен как асинхронный.
Я написал бы ваш код следующим образом:
onPrepare: async() => {
await browser.get('https://localhost:8443/support-tool/#/service/config');
let someElement = await element(by.css('mat-select-value'));
await browser.wait(protractor.ExpectedConditions.presenceOf(someElement), 10000);
},
Наконец, пока ваш onPrepare правильно использует awaits, он должен обязательно завершиться до начала ваших тестов.
Надеюсь, что это помогает и понятно, это было дольше, чем я ожидал.