Я новичок в JavaScript и работаю над тестом E2E для одностраничного веб-приложения в Angular2.По сути, на странице есть много кликабельных тегов (не перенаправляемых на другие страницы, но имеющих некоторый эффект CSS), с некоторой логикой между ними.Я пытаюсь сделать следующее: {случайно щелкнуть тег, проверить правильность ответа на странице или нет (для этого нужно извлечь много компонентов из Интернета), а затем снять его}.
Итак, я установил два const как totalRound и ITER, которые я загружал бы на totalRound веб-страницы, затем на каждой странице загрузки я выбирал случайным образом и нажимал кнопку ITER times.
Моя структура кода выглядит следующим образом:
let totalRound: number = 10;
let ITER: number = 100;
describe('XX Test', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
});
describe('Simulate User\'s Click & Unclick',() => {
for(let round = 0; round < totalRound; round++){
it('Click Simulation Round ' + round, () =>{
page.navigateTo('');
let allTagFinder = element.all(by.css('someCSS'));
allTagFinder.getText().then(function(tags){
let isMatched: boolean = True;
let innerTurn = 0;
for(let i = 0; i < ITER; i++){
/* Randomly select a button from allTagFinder,
using async func. eg. getText() to get more info
about the page, then check if the logic is correct or not.
If not correct, set isMatchTemp, a local variable to False*/
isMatched = isMatched && isMatchTemp;
innerTurn += 1;
if(innerTurn == ITER - 1){
expect(isMatched).toEqual(true);
}
}
});
});
}
});
});
, поэтому я хочу получить результат после каждой проверки кнопки ITER со страницы загрузки.Внутри цикла for код вложен для асинхронных функций, таких как getText () и т. Д.
В большинстве случаев код работает правильно (выглядит, что проверки кнопок выполняются последовательно).Но все же иногда кажется, что информация двух итераций была противоречивой.Я предполагаю, что есть некоторая проблема с моей структурой кода для асинхронности.
Я думал, что JS является однопоточным.(не брал ОС, поправьте меня, если не так) Так что в цикле for, после всего асинхронного.инициализация функции завершена, все вложено асинхронно.Функция (одна для каждого цикла) все еще должна запускаться одна за другой, что я хочу?Так что в большинстве случаев код по-прежнему работает так, как я надеюсь?
Я пытался добавить блокировку в цикл for, например:
while(i > innerTurn){
;
}
Я хотел бы, чтобы это могло заставить цикл работатьбыть запущенным последовательно.Так что за асинхронность.func из индекса 1 ~ ITER-1, он должен ожидать первую асинхронность.закончите свою работу и увеличьте innerTurn на 1. Но он просто не может даже вернуть первый асинхронный сигнал (i = 0) ...
Заранее благодарим за любые предложения.