使用带有环的量角器

使用带有环的量角器

循环索引(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"
      }
    })
  }})


千万里不及你
浏览 486回答 3
3回答

心有法竹

汉克在回答这个问题上做得很好。我还要注意另一种快速而肮脏的方法来处理这个问题。只需将promise内容移动到某个外部函数并将其传递给索引。例如,如果要在页面上以各自的索引(从ElementArrayFinder)记录所有列表项,您可以执行以下操作:&nbsp;&nbsp;var&nbsp;log_at_index&nbsp;=&nbsp;function&nbsp;(matcher,&nbsp;index)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$$(matcher).get(index).getText().then(function&nbsp;(item_txt)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;console.log('item['&nbsp;+&nbsp;index&nbsp;+&nbsp;']&nbsp;=&nbsp;'&nbsp;+&nbsp;item_txt); &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;}; &nbsp;&nbsp;var&nbsp;css_match&nbsp;=&nbsp;'li'; &nbsp;&nbsp;it('should&nbsp;log&nbsp;all&nbsp;items&nbsp;found&nbsp;with&nbsp;their&nbsp;index&nbsp;and&nbsp;displayed&nbsp;text',&nbsp;function&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$$(css_match).count().then(function&nbsp;(total)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;total;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log_at_index(css_match,&nbsp;i);&nbsp;//&nbsp;move&nbsp;promises&nbsp;to&nbsp;external&nbsp;function &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;});当您需要进行快速调试并轻松调整以供自己使用时,这会派上用场。

一只名叫tom的猫

我不是在讨论上面讨论的学识渊博的人的逻辑或智慧。我写道指出,在一个声明为异步的函数中的当前版本的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++){&nbsp; flowLog(i+' '+await inputFields[i].getAttribute('id')+' '+await inputFields[i].getAttribute('value'));}产生的输出就像&nbsp; &nbsp; count = 440 7f7ac149-749f-47fd-a871-e989a5bd378e 11 7f7ac149-749f-47fd-a871-e989a5bd3781 22 7f7ac149-749f-47fd-a871-e989a5bd3782 33 7f7ac149-749f-47fd-a871-e989a5bd3783 44 7f7ac149-749f-47fd-a871-e989a5bd3784 55 7f7ac149-749f-47fd-a871-e989a5bd3785 6...42 7f7ac149-749f-47fd-a871-e989a5bd376a 143 7f7ac149-749f-47fd-a871-e989a5bd376b 2据我所知,这await是关键,强制数组在前面被解析(因此计数是正确的)并且await循环中的s导致每个promise在被允许递增之前被解析。我的目的是为读者提供选择,而不是对上述内容提出质疑。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

AngularJS