我无法测试我的应用程序的某些功能,因为有时(通常)量角器测试在beforeEach函数中失败。
可能我错过了一些重要的东西,因为测试失败了,我发现了一些关于最大化超时的讨论,但它没有解决问题。
我看到beforeEach
在测试失败时没有完全执行,只执行了第一条指令(browser.get),然后浏览器仍然在同一页面上。
我正在尝试allScriptsTimeout: 45000
这是一些测试。
describe('Rebus', function() {
// mi posiziono nella lista ticket dopo ogni test e clicco su nuovo ticket
beforeEach(function() {
browser.get(Utils.baseUrl + '/tickets');
browser.wait(function() {
return element(by.id('newTicket')).isPresent();
}, 5000);
element(by.id('newTicket')).click();
/**Ora passo dalla lista ticket a selezione blocco*/
browser.wait(function() {
return element(by.id('0')).isPresent();
}, 5000);
element(by.id('0')).click();
element(by.id('newTicket')).click();
});
it('should buy ordinary ticket eurolevel 3', function() {
// A questo punto dovrei essere arrivato al form del nuovo ticket
selectArea('0');
fillLicensePlate(5, 3);
fillCountry();
fillPassengers();
setEntryDate(now);
setExitDate(now.add(1, 'd'));
// vai avanti al secondo step
element(by.id('stepperNext')).click();
browser.wait(function() {
return element(by.id('daysOfStay')).isDisplayed();
}, 5000);
// Controllo che il prezzo sia corretto e controllo i giorni di permanenza
element(by.id('daysOfStay'))
.getText()
.then(function(text) {
expect(text).toContain('1');
});
element(by.id('amount'))
.getText()
.then(function(text) {
expect(text).toContain('510', 'Errore nella tariffa');
});
browser.wait(function() {
return element(by.id('save')).isDisplayed();
}, 5000);
// salvo il ticket
element(by.id('save')).click();
// Controllo che il prezzo sia corretto e controllo i giorni di permanenza
browser.wait(function() {
return element(by.name('price')).isPresent();
}, 5000);
element(by.name('price'))
.getText()
.then(function(text) {
expect(text).toContain('510', 'Errore nella tariffa');
});
expect(element(by.name('addPay')).isPresent()).toBeTruthy(
'Bottone non presente'
);
});
it('should buy HOTEL ticket eurolevel €3', function() {
// A questo punto dovrei essere arrivato al form del nuovo ticket
selectArea('0');
fillLicensePlate(5, 3);
fillCountry();
fillPassengers();
setEntryDate(now);
setExitDate(now.add(1, 'd'));
// Campi opzionali
setHotelField();
setAgencyField();
// vai avanti al secondo step
element(by.id('stepperNext')).click();
browser.wait(function() {
return element(by.id('daysOfStay')).isDisplayed();
}, 5000);
// Controllo che il prezzo sia corretto e controllo i giorni di permanenza
element(by.id('daysOfStay'))
.getText()
.then(function(text) {
expect(text).toContain('1');
});
element(by.id('amount'))
.getText()
.then(function(text) {
expect(text).toContain('210', 'Errore nella tariffa');
});
browser.wait(function() {
return element(by.id('save')).isDisplayed();
}, 5000);
// salvo il ticket
element(by.id('save')).click();
// Controllo che il prezzo sia corretto e controllo i giorni di permanenza
browser.wait(function() {
return element(by.name('price')).isPresent();
}, 5000);
element(by.name('price'))
.getText()
.then(function(text) {
expect(text).toContain('210', 'Errore nella tariffa');
});
expect(element(by.name('addPay')).isPresent()).toBeTruthy(
'Bottone non presente'
);
});
答案 0 :(得分:1)
我认为问题在于,您不是在等待异步任务。 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
只是使用您的第二天工作来学习它们。