是否可以在量角器的.map中找到子元素?
我尝试修改here中的示例代码,将ToDo项解析为数据结构。
describe('angularjs homepage todo list', function() {
it('should add a todo', function() {
browser.get('https://angularjs.org');
element(by.model('todoList.todoText')).sendKeys('write first protractor test');
element(by.css('[value="add"]')).click();
var todoList = element.all(by.repeater('todo in todoList.todos'));
var todoStruct = todoList.map(function(el) {
return {
checkbox: el.element(by.model('todo.done')),
label: el.element(by.tagName('span')).getText()
};
});
todoStruct.then(function(resolvedTodoStruct) {
expect(todoStruct.length).toEqual(3);
expect(todoStruct[2].label).toEqual('write first protractor test');
});
});
});
从我所读到的,地图是这类任务的正确选择。但出于某种原因,只要我在.map内使用.element,量角器会冻结。 :( 为什么会这样?我错过了什么吗?
答案 0 :(得分:0)
我为此找到了几个解决办法,虽然不漂亮,但似乎工作正常。
对于getText(),我移动了从JSON中获取文本的过程,然后将变量保存在返回的JSON中。 对于元素,解决方法是将元素包装在函数中:
var todoList = element.all(by.repeater('todo in todoList.todos'));
var spanText;
var todoStruct = todoList.map(function(el, index) {
var spanText = el.element(by.tagName('span')).getText().then(function(t){
return t;
});
return {
checkbox: function(){
return todoList.get(this.index).element(by.model('todo.done'));
},
label: spanText
};
});
然后,当您想稍后访问该元素时,您可以作为函数访问:
todoStruct.checkbox().click();
答案 1 :(得分:0)
是的,我们可以通过以下方式从地图中获取子元素
getRows() {
return this.element.all(by.css('.ag-row')).map((row, index) => {
return {
index: index,
title: row.element(by.css("[colid=\"title\"]")).getText(),
operationStatus: row.element(by.css("[colid=\"operation_status_enum\"]")).getText()
};
});
}
// You can print this in the following way
this.getRows().then((rows) => {
for (var i=0; i<rows.length; i++) {
console.log(rows[i].title);
console.log(rows[i].operationStatus);
}
});