• 相关源码:
    appium/lib/devices/ios/ios-controller.js

    // we need to change the time (which is now an offset)
    // and the position (which may be an offset)
    var time = 0;
    _.each(touchStateObjects, function (state) {
      if (state.touch[0] === false) {
        // if we have no position (this happens with `wait`) we need the previous one
        state.touch[0] = prevPos;
      } else if (state.touch[0].offset && prevPos) {
        // the current position is an offset
        state.touch[0].x += prevPos.x;
        state.touch[0].y += prevPos.y;
      }
      // prevent wait => press => moveto crash
      if (state.touch[0]) {
        delete state.touch[0].offset;
        prevPos = state.touch[0];
      }
    
    
      var timeOffset = state.timeOffset;
      time += timeOffset;
      state.time = time;
    
      delete state.timeOffset;
    });
    

    相关文档:https://github.com/testerhome/appium/blob/master/docs/cn/writing-running-appium/touch-actions.cn.md

  • 从左边的 log 看,你正在执行的应该是右面第二个 touch 的代码:

    action.press(170, 250).moveTo(150, 250).release().perform();
    

    第一个 log 表明一次性传入了 3 个动作(action)(这里 log 太长了,我就只写前面一小部分):

    --> POST /wd/.....
    

    这个 log 和你的执行代码是一致的,即 appium server 收到的命令是没问题的。
    然后你有疑惑的应该是下一个 log:

    [debug] Pushing command to appium ...
    

    此处的第二个 touch 坐标和你代码不是完全一样。代码是150, 250,而命令则是320, 500。这个应该是做了一个计算:170+150=320, 250+250=500,即moveTo在传坐标时会认为传的是相对于起始元素的偏移量。

    你没有滑动的原因应该是没有加wait方法。你可以尝试在pressmoveTo之间加个wait方法。

  • 能把标题改改,改成类似"xx 错误原因及解决方案"吗?
    看到这标题我还以为是提问帖。。。

  • Appium Wrapper for Java at 2015年03月24日

    #17 楼 @springs412 你先试试adb devices能不能找到设备。adb 能找到 appium 一般都能连到。

  • #4 楼 @testly 设置了unicodeKeyboardtrue后会自动安装 appium 的输入法并设为默认输入法。你想在测试完成后自动改回原有输入法可以把resetKeyboard设为true
    详见:https://github.com/appium/appium/blob/master/docs/cn/writing-running-appium/caps.cn.md

  • Appium 启动 Browser 失败 at 2015年03月23日

    #4 楼 @staticfield 麻烦更新一下标题和帖子内容,说明已解决及解决方案吧。这样其他人也可以方便地解决类似的问题。

  • 能提供详细点的上下文不?例如你脚本大部分情况下执行到哪里会出现这个问题,appium 上对应的详细 log 是什么?
    只有 client 端的 exception 信息量太少了。

  • Appium 启动 Browser 失败 at 2015年03月23日

    试试在desired_caps里添加这个?
    'browserName': 'Browser',

    你的问题和那个帖子应该不一样。你这个是应用内置 webview。
    appium 相关文档:https://github.com/appium/appium/blob/master/docs/cn/advanced-concepts/hybrid.cn.md

  • selendroid 入门 at 2015年03月22日

    #3 楼 @lihuazhang 那不就类似于 selenium 1 的做法吗?

  • selendroid 入门 at 2015年03月22日

    好文,后面学习 seledroid 就参照这个文章来撘环境了。
    在 google 的规划中,webview 的自动化貌似是用 chromedriver 来做的,和 uiautomator 定位有所不同。

    话说怎么那么多人写 xpath 都那么喜欢用工具生成的……自己写不是更灵活吗……

  • #4 楼 @hssdx 麻烦提供一下你运行这个命令时所在目录路径及你配置的 appium 源码根目录路径,以及你是否运行成功了reset.sh --dev命令。

  • 受教了,又学了一个很不错的设计模式!

  • 先收藏了!
    这压缩好强悍……我当时下源码搞了一个晚上……

    话说下载链接干嘛用代码块……

  • 根据我目前对那两个工具的了解,可能是你的自定义的 view 没有实现 accessibility 方面的方法,你提到的两个工具貌似都是通过 accessibility 服务获取控件的。
    帮你找一下分析过这两个工具源码的人,看他的意见吧。@doctorq

  • #6 楼 @yangchengtest 对,你说的我都赞同,确实目前图片识别技术准确性还不能达到很高的实用价值,但在某些特定场景下(如文中的场景)可以起到很大的辅助作用。
    我主要想分享一下它这种另类的解决思路(用较低成本达到较大的产出)而已。

  • appium 1.3.4.1 版 sendkey 错误 at 2015年03月19日

    #4 楼 @adfghzhang 有试过像我那样在 sendKeys 前先 clear 吗?效果如何?

  • appium 1.3.4.1 版 sendkey 错误 at 2015年03月19日

    #5 楼 @misnull 我也遇到过,貌似三星的默认输入法映射有点问题,后来改成用 google 拼音输入法就好了。
    对于非 ASCII 字符(如中文),目前只有 Appium 的 unicode 输入法一条路。坏处是它触发不了输入法的按键事件(因为它压根就没按键,直接传信号的)

  • #2 楼 @yangchengtest
    文中第一部分已经说明图和关键字对应起来放数据库走不通。。。图库量太大了。。。所以要用识图工具。
    百度识图不是单纯的数据库比对,里面有识别算法的,当然也包含大数据。简单地说就是它能识别近乎于任意图片的对应关键字,这样即使你图库再大,再怎么更新也不怕。
    附上文中提到的知乎的讨论链接:http://www.zhihu.com/question/19738567

  • 额,我分享这个的目的不是想让大家讨论抢票软件本身,只是想让大家开阔一下思维,遇到用常规方法做不了的事情时就突破常规,用非常规方法来解决。
    框架/工具用得多很容易局限在它们以内。框架只是辅助工具,如同这里的百度识图一样。我们的价值不是熟练使用各种框架/工具,而是能快速找到合适的方法、采用合适的工具、以尽量快和低成本的方式解决问题。
    个人觉得,测试和开发的主要区别就在于测试更需要开阔的眼界和思维,能跳出编程固有的思路来解决问题。这也是我选择做测试的原因之一。

  • #5 楼 @misnull 话说你改的不就是 appium server 解析启动参数的代码嘛……参数名称是-bp或者--bootstrap-port啊。。。

  • appium 1.3.4.1 版 sendkey 错误 at 2015年03月19日

    刚刚用 appium 1.3.4.1 的 exe 试了一下(使用 python client):

    username = self.driver.find_element_by_id("xxx")
    username.send_keys("test")
    username.send_keys("abcdefg")
    

    执行完后 username 框的内容为"testabcdefg"
    改为:

    username = self.driver.find_element_by_id("xxx")
    username.send_keys("test")
    username.clear()
    username.send_keys("abcdefg")
    

    执行完后 username 框的内容为"abcdefg"
    @adfghzhang 你可以试试加上 clear() 方法。

  • appium 1.3.4.1 版 sendkey 错误 at 2015年03月19日

    从日志上看,有可能是这里出的问题:

    Pushing command to appium work queue: ["element:setText",{"elementId":"20","text":"2015-03-20","replace":false,"unicodeKeyboard":true}]
    

    此处的"replace":false可能会让 sendKeys 在原有字符在不清空的情况下继续输入。

    @tspring 能否帮忙让你们组相应组员查查 BOOTSTRAP 这边对于"replace":false实际是怎么执行的?
    我们组这边会看看 1.3.4.1 的 Server 端在

    > info: --> POST /wd/hub/session/4adf2a57-f5d7-4c32-9f2d-64621d825d7a/element/20/value {"id":"20","value":["2015-03-20"]}
    > info: [debug] Pushing command to appium work queue: ["element:setText",{"elementId":"20","text":"2015-03-20","replace":false,"unicodeKeyboard":true}]
    

    这两行日志之间根据什么设定replace的。

    另外,@adfghzhang 能否提供一下你使用的 client 的语言和版本?谢谢。

    PS:我这边使用 python 的 Appium-Python-Client==0.11 作为客户端,Appium 1.2.0 作为服务端,真机使用 Android 4.3,使用 send_keys() 方法会清空输入框后再输入。