Я думаю, что проблема в том, что вы не ждете асинхронных задач.Большинство функций из объекта browser
являются асинхронными.Означает, что они выполняются в разных потоках.Поэтому всякий раз, когда вы вызываете асинхронную функцию, она не ждет, пока не завершится.Нет, следующая строка кода выполняется немедленно.Таким образом, в вашем конкретном случае функции browser.get()
, browser.wait()
и element.click()
выполняются практически одновременно, и никогда не ожидали завершения одной функции.Все они работают параллельно, и, как последняя функция завершила, ваши beforeEach()
останавливается.
Для ожидания асинхронных задач вы должны работать с Promises
Object.Следующий код будет работать в вашем тесте:
beforeEach(function() {
browser.get(Utils.baseUrl + '/tickets').then(function () {
// url '/tickets' opened now
browser.wait(function() {
return element(by.id('newTicket')).isPresent();
}, 5000).then(function() {
element(by.id('newTicket')).click();
// next task here..
});
});
});
Если вы используете машинопись, это можно сделать очень красиво, используя await
:
beforeEach(async function() {
await browser.get(Utils.baseUrl + '/tickets');
await browser.wait(function() {
return element(by.id('newTicket')).isPresent();
}, 5000);
await element(by.id('newTicket').click();
// next task here..
});
При использовании такжеФункции стрелок выглядят почти элегантно:
beforeEach(async () => {
await browser.get(Utils.baseUrl + '/tickets');
await browser.wait(() => element(by.id('newTicket')).isPresent()),5000});
await element(by.id('newTicket').click();
// next task here..
});
Если вы никогда не слышали о Promises
, просто изучите их на следующий рабочий день.