#javascript #jquery #grid #jasmine #protractor
#javascript #jquery #сетка #jasmine #транспортир
Вопрос:
Мне нужно проверить, содержит ли сетка все указанные заголовки, но не все заголовки видны в DOM одновременно, поэтому мне нужно прокрутить, чтобы «открыть» больше заголовков, но я действительно не знаю, как заставить его работать из-за асинхронной природы javascript.
Я пробовал что-то подобное, но я не думаю, что это хороший подход.
var self = this;
this.checkGridHeaders = function(gridName, expectedHeaders) {
var previous;
var headers = this.poGridUtil.getGrid( gridName ).element( by.css('.ui-grid-render-container-body'))
.element( by.css('.ui-grid-header') ).all( by.repeater('col in colContainer.renderedColumns track by col.uid') );
headers.each(function(header, headerIndex) {
if(expectedHeaders.length != 0 amp;amp; header != 'undefined') {
header.getText().then(function(headerText){
if(headerText == '') {
browser.executeScript("arguments[0].scrollIntoView();", previous).then(function() {
self.checkGridHeaders(expectedHeaders);
});
}
previous = header;
console.log('***Element: ' headerText );
expect(expectedHeaders.indexOf(headerText)).not.toEqual(-1);
header = 'undefined';
});
}
});
};
и вызов выглядит так: checkGridHeaders('grid-className', ['header1', 'header2', 'header3', 'header4']);
В принципе, я хочу проверить, expectedHeader
виден ли он, и если нет, то прокрутите до последнего известного заголовка, а затем проверьте еще раз. Я просто не знаю, как правильно это написать.
Ответ №1:
Попробуйте следующий код,
var self = this;
this.checkGridHeaders = function(gridName, expectedHeaders) {
var defer = protractor.promise.defer();
this.poGridUtil.getGrid( gridName ).element( by.css('.ui-grid-render-container-body .ui-grid-header'))
.all( by.repeater('col in colContainer.renderedColumns track by col.uid')).then(function (headers) {
var headerText =[];
for(var i=0;i<headers.length;i ){
browser.executeScript("arguments[0].scrollIntoView();", headers[i].getWebElement())
headerText.push(headers[i].getText())
}
defer.fulfill(headerText);
})
expect(defer.promise()).toContain(expectedHeaders)
});
};
Комментарии:
1. он выдает:
defer.promise is not a function
inexpect(defer.promise()).toContain(expectedHeaders);
. Также вы использовали слишком много скобок междуexpect(defer.promise()).toContain(expectedHeaders)
2. Я исправил предыдущую ошибку, но теперь она очень быстро прокручивается до каждого столбца и выдает:
A Jasmine spec timed out. Resetting the WebDriver Control Flow.
3. Проблема с этим заключается в том, что он начинает итерацию по количеству столбцов, найденных в начале, и это именно моя проблема, потому что в начале я не знаю количество столбцов, потому что пара из них не видны в DOM. Так, например
headers.length
, равно 10, хотя действительное число равно 13… Мне нужно что-то, что проверяет, есть ли новый столбец при каждой прокрутке.
Ответ №2:
Я понял это. Это не лучший подход, но работает.
this.checkGridHeaders = function(gridName, expectedHeaders, iterationNumber) {
if(isNaN(iterationNumber))
iterationNumber = 5;
var headers = [];
var findHeaders = function() {
return self.poGridUtil.getGrid( gridName ).element( by.css('.ui-grid-render-container-body .ui-grid-header'))
.all( by.repeater('col in colContainer.renderedColumns track by col.uid')).then(function (foundHeaders) {
var next = foundHeaders[foundHeaders.length - 1];
return self.getResolvedText(foundHeaders).then(function(result) {
browser.executeScript("arguments[0].scrollIntoView();", next.getWebElement());
for(var i = 0; i < result.length; i ) {
var cut = result[i].toString().replace("n", "");
var shorten = cut.trim();
if(shorten !== "" amp;amp; shorten !== " ")
headers.push(shorten);
}
browser.sleep(500);
return resu<
});
});
};
var headerFinders = [];
for (var iterIndex = 0; iterIndex < iterationNumber; iterIndex )
headerFinders.push(findHeaders());
var allPromises = headerFinders.map(function(item) {
return item;
});
var finderResult = protractor.promise.all(allPromises).then(function(presentValues) {
return presentValues;
});
finderResult.then(function(resultItems) {
var newHeaders = headers.filter( function( item, index, inputArray ) {
return inputArray.indexOf(item) == index;
});
for(var index = 0; index < expectedHeaders.length; index ) {
expect(newHeaders).toContain(expectedHeaders[index], 'Nie znaleziono naglowka: ' expectedHeaders[index]);
}
});
};
Если кто-нибудь знает, как привести в порядок этот код, не стесняйтесь оставлять комментарии 🙂