Есть задача: получить некие данные со страницы, сформировать урлы с этими данными, затем отправить запросы к урлам и в респонзе провести проверку.
Составлен такой код:
function checkSpec() {
return driver.executeScript("var search = []; if (typeof xmlDataSpeclist !== 'undefined') {" +
"$.each(xmlDataSpeclist, function (key, item) {" +
"search.push(" +
"'http://domain/?spec='" + " + item.id" +
");" +
"});" +
"};" +
"return search;"
).then((search) => {
return search.forEach(function(val, i) {
console.log(search.length); //debug printing
return new Promise((resolve, reject) => {
request(search[i], function(error, response, body){
if (error) {
reject(error);
}
resolve(body);
});
}).then((body) => {
console.log(body);
assert.include(body, 'class="someClass"');
});
});
});
}
return checkSpec();
Но работает он неправильно. Сначала идет перебор массива, степ теста якобы благополучно проходит, начинаются другие степы, и где-то посередине начинают приходить ответы (вывод body в консоль).
Где что нужно поправить в промисе, чтобы оно работало нормально? Т.е. на каждый элемент массива - запрос - проверка, и только потом на следующий элемент массива запрос-проверка и т.д.
UPD.
Изменив код в соответствии с рекомендациями, получила такое:
function checkSpec() {
return driver.executeScript("var search = []; if (typeof xmlDataSpeclist !== 'undefined') {" +
"$.each(xmlDataSpeclist, function (key, item) {" +
"search.push(" +
"'http://domain/?spec='" + " + item.id" +
");" +
"});" +
"};" +
"return search;"
).then((search) => {
return Promise.all(search.map(function(val, i) {
/*console.log(search.length);*/
return new Promise((resolve, reject) => {
request(search[i], function(error, response, body){
if (error) {
reject(error);
}
resolve(body);
});
}).then((body) => {
var $ = cheerio.load(body);
var txt = $('locator1').text().replace(/\s+/g," ").trim();
var doc = $(locator2').text().trim();
/*console.log(txt);*/
return assert.notEqual(txt, '', "не найдены: "+ doc);
});
}));
});
}
return checkSpec();
Теперь он хотя бы проверяет все нормально и степ фейлится, когда проверка не проходит. Проблема в том, что когда проверка падает - остальные проверки все равно проходят до конца (если не убирать вывод на консоль текста - видно, что после падения продолжает выводиться текст следующих проверок). Как сделать так, чтобы после фейла проверки прекращать остальные проверки? Пробовала вставлять if (condition) {return}, но не помогает, может тоже не туда вставляла.