• 理论上支持,实际上没试过,不敢确定。
    话说你们公司好激进,这么快上 win10,不怕旧软件不兼容吗?

  • 我目前没遇到过这种情况,而且也不知道你的 app 里面具体使用了什么框架/方式来获取网络数据,所以答不上来。。。

    建议你先收集一下 crash log 或者 iOS sys log 看看到底哪里出错或者卡在哪一步,然后再进一步地去查询吧。

    另外,仔细查看一下开发那边的配置和你的配置有什么出入,有可能就是有出入那部分造成的问题。

  • 女嘉宾 😍 😍

  • 这个情况是不是就是 https://testerhome.com/topics/3160 里面那个?
    如果开发那边没问题,那就找开发帮忙检查一下环境配置吧。我们不知道你的 app 具体用了什么技术,启动加载的逻辑是什么,也没有能直接反映卡住时 app 处于什么状态的 log ,基本定位不了问题。。。

  • 顶一下
    可惜不在上海。。。

  • 额,还是没能明白你的问题。

    通过 ui 自动化工具获取 来刷新当前消息

    这句话没看懂。

    可以的话能否详细说一下 app 的消息是如何刷新的(自动/特定步骤/其他),然后想如何获取消息?nice 这个软件国内用的人不多,所以你说类似 nice 获取用户消息可能很多人还是不明白你的意思。

    例如:

    • app 刷新机制:服务器自动推送,用户发送消息到服务器后服务器会自动推送给对应用户的客户端。

    • 需要实现的用例:

    1. a 用户发送消息给 b 用户
    2. 检查 b 用户是否能在 xx 秒内收到消息(UI 上自动出现 a 用户发出的消息) ....
    • 遇到的问题:

    尝试使用 appium 工具执行用例,但遇到 xx 问题,用例中第 xx 步应该获取到 xx 信息,但实际上 xxx 。

  • #8 楼 @testbird 我想确认一下我理解对不对:

    会卡住的过程(UIAutomation 或 appium):打开应用->出现等待页面(类似广告)->卡死在这里,进入不了视频主界面
    不会卡住的过程:打开应用->出现等待页面(类似广告)->由于网络原因没有获取到数据,直接进入空白的视频主界面
    正常启动过程(没使用自动化工具,纯人工启动):打开应用->出现等待页面(类似广告)-> 通过网络连接获取到视频主界面需要的数据->进入视频主界面。

    如果是这样的话得了解一下之前视频主页为何被关闭,以及关闭时和不关闭时逻辑处理有什么区别了。同时也要看一下正常启动过程在出现等待页面到进入视频主界面大致需要多长时间。

    1. 排版不符合要求
    2. 请添加头像
  • #5 楼 @testbird 大致看了一下,主要出问题的地方是:

    info: [debug] Error: App did not have elements
    at /Applications/Appium.app/Contents/Resources/node_modules/appium/lib/devices/ios/ios.js:483:30
    at Object.cb as callback
    at next (/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/async/lib/async.js:798:43)
    at /Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/async/lib/async.js:32:16
    at [object Object].exports.respond (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/devices/common.js:28:9)
    at [object Object].<anonymous> (/Applications/Appium.app/Contents/Resources/node_modules/appium/lib/devices/ios/ios.js:1473:18)
    at getResultAndSendNext (/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/appium-uiauto/lib/command-proxy.js:146:20)
    at Socket.<anonymous> (/Applications/Appium.app/Contents/Resources/node_modules/appium/node_modules/appium-uiauto/lib/command-proxy.js:88:7)
    at Socket.emit (events.js:129:20)
    at _stream_readable.js:908:16
    at process._tickDomainCallback (node.js:381:11)
    info: [debug] Responding to client with error: {"status":33,"value":{"message":"A new session could not be created. (Original error: App did not have elements)","origValue":"App did not have elements"},"sessionId":null}
    info: <-- POST /wd/hub/session 500 18640.090 ms - 172
    

    可以肯定的是,app 和 UIAutomation 都起来了,但神奇之处在于 au.mainApp().getTreeForXML() 这个命令获取到的元素列表为:

    {"UIAApplication":{"@":{"name":null,"label":null,"value":null,"dom":null,"enabled":false,"valid":false,"visible":false,"hint":null,"path":"/0","x":2.7063929845e-314,"y":2.701248923e-314,"width":1.061256928e-314,"height":3.372846711e-314},">":[]}}
    

    正常来说,UIAApplication 应该有至少一个子节点的(就算界面空白一片实际上也应该有元素),但在你的 app 里抓取不到。

    相关关键代码:https://github.com/appium/appium/blob/v1.4.1/lib/devices/ios/ios.js

    IOS.prototype.waitForAppLaunched = function (cb) {
      // on iOS8 in particular, we can get a working session before the app
      // is ready to respond to commands; in that case the source will be empty
      // so we just spin until it's not
      var condFn;
      if (this.args.waitForAppScript) {
      ...
      } else {
        logger.debug("Waiting for app source to contain elements");
        condFn = function (cb) {
          this.getSourceForElementForXML(null, function (err, res) {
            if (err || !res || res.status !== status.codes.Success.code) {
              return cb(false, err);
            }
            var sourceObj, appEls;
            try {
              sourceObj = JSON.parse(res.value);
              appEls = sourceObj.UIAApplication['>'];
    
              if (appEls.length > 0 && !IOS.isSpringBoard(sourceObj.UIAApplication)) {
                return cb(true);
              } else {
                return cb(false, new Error("App did not have elements"));
              }
            } catch (e) {
              return cb(false, new Error("Couldn't parse JSON source"));
            }
            return cb(true, err);
          });
        }.bind(this);
      }
      this.waitForCondition(10000, condFn, cb, 500);
    };
    

    appium 通过判断 在 10 秒内界面是否有在 UIAApplication 内的元素并且已经不在 SpringBoard(就是点击应用图标后会立即出现的静态界面)里面 来判断被测应用是否成功启动了。你的 app 没能通过检查,所以就建立不了 session 了。

    能否描述一下实际上在手机端的显示是怎样的?在应用被打开后(从 log 来看至少应用打开的动画应该出现过)界面显示是怎样的?

    从 ios sys log 来看,你的 app 本身也有一些报错信息:

    info: [IOS_SYSLOG_ROW ] Aug 21 09:37:45 1905de-iPhone FilmSiteClient[395] <Error>: assertion failed: 12D508: libxpc.dylib + 71792 [3C982BC2-5B46-305A-9A09-3C3D15332820]: 0x7d
    

    同时 app 启动时会联网获取不少数据,不知道内部设计逻辑是获取完才初始化界面还是先初始化界面。

    如果可以的话,能否开启了 --time-stamp 后再获取一次 log ?首次启动需要联网获取不少信息,但里面的时间戳是手机上的时间,和后面 Instruments log 的时间戳不对应,所以不知道是否因为获取不到网络信息导致 app 没能成功初始化。如果确实是,那就是 app 设计缺陷了。

  • Centos 安装下载命令 at 2015年08月21日

    很实用的知识!赞!
    大部分需要编译的应该都是 ./configure -> make -> make install ,分别用来检查和生成配置参数、编译、把编译后文件移动到需要的位置和修改对应的系统参数。

  • #5 楼 @55hhy 不知道你用的是哪个 client ,但从 appium log 看起来你的 steps 好短,相当于瞬移了。。。
    duration 一般设 0.5 秒以上吧。某些 client 的 duration 单位是毫秒,这个你最好检查一下。

    另外,之前误解你的需求了。。。你需要的不是 scroll to ,只是 scroll 后操作某个元素。方法就是 swipe + find + click 就好了。

    另外,startX,startY 这些单位都是 像素,所以需要注意一下你滑动的距离对不对。

    android 的开发者选项里有两个显示触摸操作的选项:显示触摸操作 和 指针位置 ,你把这两个都打开然后看看 swipe 具体是滑动了什么地方,然后再调整参数吧。

  • 问题描述不清晰。

    1. 刷新什么消息?
    2. 你问的是开发技术(在 app 里怎么刷新)还是测试技术(UI 自动化工具获取/触发界面刷新)还是别的?
  • 关于 Monkey 各指令用法 at 2015年08月21日

    :plus1:

    1. 使用 UIAutomator API,根据 scrollView 和需要寻找的元素的 content-desc 或 text 来滚动查找
    2. 自己封装。

    这是 UIAutomator 的原理决定的,不可见元素都抓不到,所以只能滚一次找一次。

  • 把全部 log 贴出来,不要只贴一部分。
    最重要的部分你的截图里去掉了。。。

  • 苦 B 的娃。今天好好过一下七夕吧!

  • 第二个问题的答案:ideviceinstaller。
    第一个问题单靠你说的信息回答不了你。。。

  • 额,你有把最后一幅图里面的错误拿去 google 一下吗?
    这个错误原因很明显了。

  • 另外,这种情况比较通用的解决方法应该是类似 mysql 那样把 server 做成一个 service ,通过命令控制 service 的开关。

  • 麻烦添加头像~

  • 关于 Monkey 各指令用法 at 2015年08月19日

    麻烦按照 排版说明 修改一下排版,谢谢。

  • 麻烦根据 排版说明 修改一下排版,谢谢。

  • 麻烦给出详细的 appium server log(从接收到 --> POST wd/hub/session 开始)。
    从这个日志里面我们只能看出 bundle id 不对。

    PS:bundle id 是必须的,你没有指定的话 appium 自己会去解析 app 来获取。

  • 出现这种问题一般是 exec 的运行环境和你平时命令行运行的运行环境不一样。

    建议检查一下 exec 下环境变量、使用的用户这些是否一致?

    另外,注意一下 shell 的登录式和非登录式的区别,看是否有些配置信息没有加载?