一般的应用里都有列表这种场景,比如 QQ 好友列表,粉丝列表等等。

列表处理一般会存在处理 重复不全 的问题。

这里分享一个比较好的方案。

一般来说列表的每个列表项都有一个特征,可以是用户的名字,id 之类的。
可以利用这种特征来做到比较好的列表处理。


// 这里假定列表项的特征是用户名
function doWithList (func) {
  // 存储上一屏获取到的名字
  let lastNames = []

  // 存储当前一屏获取到的名字
  let currentNames = []

  while (true) {
    // 获取当前一屏的名字
    currentNames = id('tv_name').untilFind().map(n => n.text())

    // 如果上一屏的名字与当前一屏的名字一摸一样,那么就可以判定为列表处理完成了
    if (arrayEq(currentNames, lastNames)) {
      return alert('处理完成')
    }

    // 挨个处理列表项
    for (let i = 0; i < currentNames.length; i++) {
      // 列表项不在上一屏中出现,即重复的判断
      if (lastNames.indexOf(currentNames[i]) < 0) {
        // 交由回调处理
        func(currentNames[i])
      }
    }

    // 滚动列表
    id('listView').findOne().scrollForward()
    lastNames = currentNames
    sleep(3000)
  }
}

// 判断两个数组完全相等
function arrayEq (a, b) {
  if (a.length !== a.length) { return false }

  for (let i = 0; i < a.length; i++) {
    if (a[i] !== b[i]) { return false }
  }

  return true
}

// 点击列表项的每个名字
doWithList(name => {
  text(name).findOne().click()
})