为了账号安全,请及时绑定邮箱和手机立即绑定

使用带有环的量角器

使用带有环的量角器

千万里不及你 2019-08-28 09:16:27
使用带有环的量角器循环索引(i)不是我在循环中使用Protractor时所期望的。症状:失败:索引越界。试图访问索引处的元素:'x',但只有'x'元素要么索引是静态的,始终等于最后一个值我的代码for (var i = 0; i < MAX; ++i) {   getPromise().then(function() {     someArray[i] // 'i' always takes the value of 'MAX'   })}例如:var expected = ['expect1', 'expect2', 'expect3'];var els = element.all(by.css('selector'));for (var i = 0; i < expected.length; ++i) {   els.get(i).getText().then(function(text) {     expect(text).toEqual(expected[i]); // Error: `i` is always 3.    })}要么var els = element.all(by.css('selector'));for (var i = 0; i < 3; ++i) {   els.get(i).getText().then(function(text) {     if (text === 'should click') {       els.get(i).click(); // fails with "Failed: Index out of bound. Trying to access element at index:3, but there are only 3 elements"     }   })}要么var els = element.all(by.css('selector'));els.then(function(rawelements) {   for (var i = 0; i < rawelements.length; ++i) {     rawelements[i].getText().then(function(text) {       if (text === 'should click') {         rawelements[i].click(); // fails with "Failed: Index out of bound. Trying to access element at index:'rawelements.length', but there are only 'rawelements.length' elements"       }     })   }})
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

汉克在回答这个问题上做得很好。
我还要注意另一种快速而肮脏的方法来处理这个问题。只需将promise内容移动到某个外部函数并将其传递给索引。

例如,如果要在页面上以各自的索引(从ElementArrayFinder)记录所有列表项,您可以执行以下操作:

  var log_at_index = function (matcher, index) {
    return $$(matcher).get(index).getText().then(function (item_txt) {
      return console.log('item[' + index + '] = ' + item_txt);
    });
  };

  var css_match = 'li';
  it('should log all items found with their index and displayed text', function () {
    $$(css_match).count().then(function (total) {
      for(var i = 0; i < total; i++)
        log_at_index(css_match, i); // move promises to external function
    });
  });

当您需要进行快速调试并轻松调整以供自己使用时,这会派上用场。


查看完整回答
反对 回复 2019-08-28
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞


我不是在讨论上面讨论的学识渊博的人的逻辑或智慧。我写道指出,在一个声明为异步的函数中的当前版本的Protractor中,如下所示的for循环(我在typeScript中编写,合并来自@ hetznercloud / protractor-test-helper的flowLog,虽然我相信控制台。日志也可以在这里工作)行为就像人们可能天真地期待的那样。


let inputFields = await element.all(by.tagName('input'));

let i: number;

flowLog('count = '+ inputFields.length);

for (i=0; i < inputFields.length; i++){

  flowLog(i+' '+await inputFields[i].getAttribute('id')+' '+await inputFields[i].getAttribute('value'));

}

产生的输出就像


    count = 44

0 7f7ac149-749f-47fd-a871-e989a5bd378e 1

1 7f7ac149-749f-47fd-a871-e989a5bd3781 2

2 7f7ac149-749f-47fd-a871-e989a5bd3782 3

3 7f7ac149-749f-47fd-a871-e989a5bd3783 4

4 7f7ac149-749f-47fd-a871-e989a5bd3784 5

5 7f7ac149-749f-47fd-a871-e989a5bd3785 6

...


42 7f7ac149-749f-47fd-a871-e989a5bd376a 1

43 7f7ac149-749f-47fd-a871-e989a5bd376b 2

据我所知,这await是关键,强制数组在前面被解析(因此计数是正确的)并且await循环中的s导致每个promise在被允许递增之前被解析。


我的目的是为读者提供选择,而不是对上述内容提出质疑。


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 491 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信