Я хотел бы использовать Async / await и onPrepare, чтобы убедиться, что мои тесты не запускаются, пока onPrepare не будет завершен - PullRequest
0 голосов
/ 17 мая 2019

Я хочу завершить onPrepare до запуска любых тестов, и я использую async / await.

Я новичок в javascript и транспортире, но пару десятилетий я пишу автоматизацию тестирования. Кажется, это невероятно простая вещь, которую нужно сделать: закончить onPrepare до начала теста, но я запутался в том, что видел там. Я установил SELENIUM_PROMISE_MANAGER: false, поэтому я не хочу использовать обещания для этого, верно? Моя целевая страница в ангулере использовать async и ожидать на onPrepare или browser.driver.wait или webdriver.until.elementLocated? Если так, я должен поставить 'ожидание' прежде, чем те ждут? (Это кажется излишним)

onPrepare: async() => { 
  await browser.driver.get( 'https://localhost:8443/support-tool/#/service/config'); 
  await browser.driver.findElements(by.className('mat-table')); 
  browser.driver.wait(webdriver.until.elementLocated(by.css('mat-select-value')), 10000);//(Returns webdriver not defined)
},

Во-первых, при запуске я получаю веб-драйвер, который не определен. После того, как я заставлю его работать, мои тесты будут ждать завершения onPrepare, прежде чем они начнут работать?

1 Ответ

1 голос
/ 17 мая 2019

Итак, 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, он должен обязательно завершиться до начала ваших тестов.

Надеюсь, что это помогает и понятно, это было дольше, чем я ожидал.

...