是否可以在量角器的.map中找到子元素?

时间:2015-08-14 02:54:45

标签: protractor

是否可以在量角器的.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,量角器会冻结。 :( 为什么会这样?我错过了什么吗?

2 个答案:

答案 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);
    }
  });