• #4 楼 @flint Sorry,代码里有个地方写错了,只有 new-style class 能使用 __metaclass__,所以正确的应该是这么写:

    class BasePageMetaClass(type):
        def __new__(cls, clsname, bases, dict):
            if decorator:
                for name, method in dict.items():
                    if not name.startswith('_'):
                        dict[name] = decorator(stay_window_frame, method)
            return type.__new__(cls, clsname, bases, dict)
    
    class BasePage(object):
        __metaclass__ = BasePageMetaClass
        ...
    
  • #1 楼 @lihuazhang 我明白他的意思了。例如 frame1 包着 frame2,frame2 包着 frame3,那必须先切到 frame1,然后 frame2,最后 frame3,需要依次切换。此时这个 frame 对象的 self._iframe = ["frame1", "frame2", "frame3"]
    这种方式很不错,可以把 frame 以类似 page 的方式来管理,不用再在 case 层级关心 frame 的层级关系。

    PS:通过 decorator 模块可以批量在类的方法前面添加装饰器,这样就不用每个方法都加一模一样的装饰器那么麻烦了:

    class BasePageMetaClass(type):
        def __new__(cls, clsname, bases, dict):
            if decorator:
                for name, method in dict.items():
                    if not name.startswith('_'):
                        dict[name] = decorator(stay_window_frame, method)
            return type.__new__(cls, clsname, bases, dict)
    
    class BasePage:
        __metaclass__ = BasePageMetaClass
        ...
    
  • ……这个问题和 appium 没啥关系吧。

    首先,你要解决一个物理问题:怎么让你的单据编号刚好显示在手机摄像头里且可以被识别?如果不行,那你得改应用源码, mock 这个读取二维码的模块,给一个接口,让你传个值进去然后就能把这个值当做单据编号返回。摄像头这块调用的是系统服务,没那么容易改,而且你还得配套搞个根据用例改变二维码的程序。

    解决了第一个问题后,你的问题也不是问题了。直接用 UI 自动化点击扫码按钮、等待扫码识别(我不清楚这块是否属于动态元素, uiautomator 在摄像机界面能否 dump 界面元素,你自己可以试试)、识别完成后点击确认。

    PS:以后不要问这么简短的问题。。。

  • Crosswalk App UI 自动化 at 2015年05月30日

    #3 楼 @luis 对了,你们在 ubuntu 上使用 xwalkdriver 有没有装什么依赖库?
    现在在尝试用 docker 跑 xwalkdriver ,总是提示缺少某些动态库。。。

  • #3 楼 @xdf :plus1:

  • 我刚好是最典型的测试屌丝。。。

  • 很实用的工具!
    我支持你宣传自己写的工具,但我觉得这个工具离 “强大” 这个词还有一段距离吧。。。

  • 分享批量执行 case 的方法 at 2015年05月30日

    #7 楼 @xuxu 其实把它改写回普通函数就很清晰了:

    # python
    import os
    
    def PATH(app_path):
        # 这里是把 lambda 改写成普通函数的写法,lambda 与冒号之间的变量名是参数名,冒号后是函数体,同时也是返回值
        # return os.path.abspath(os.path.join(os.path.dirname(__file__), app_path))
    
        # 下面是为了方便了解各个步骤到底在干嘛而写的。
    
        # 获取脚本所在文件夹相对于 working directory 的路径。__file__是脚本相对于 working directory 的路径,所有 python 文件运行时都会有这个属性。
        script_folder_path = os.path.dirname(__file__)
        print "script_folder_path: {}".format(script_folder_path)
    
        # 把传入的参数和当前脚本相对于 working directory 的路径组合起来,即获取 apk 相对于 working directory 的路径。之所以用 os.path.join 而不是直接插入 “/” 是因为 os.path.join 这种组合方法能根据平台不同自动插入不同的分隔符,即为了跨平台
        relative_path_of_app = os.path.join(script_folder_path, app_path)
        print "relative_path_of_app: {}".format(relative_path_of_app)
    
        # 把相对路径转化为绝对路径。注意此处传入的相对路径都会被认为是相对于 working directory 的路径!
        absolute_path_of_app = os.path.abspath(relative_path_of_app)
        print "absolute_path_of_app: {}".format(absolute_path_of_app)
    
        return absolute_path_of_app
    
    if __name__ == "__main__":
        PATH("app.apk")
    

    如果直接使用你的那种写法 PATH = lambda p : os.path.abspath(p) 会存在隐患,例如通过 python tmp/script.py 执行你的脚本,那么获取到的 app 路径就会不对了(此时脚本的 working directory——即你在运行 python 命令时所处在的目录——会不同)。

    例如上面的脚本,如果使用 python testPath.py 在它所在目录执行,会输出:

    script_folder_path:
    relative_path_of_app: app.apk
    absolute_path_of_app: /Users/hengjiechen/Develop/tmp/app.apk
    

    如果移到它的父级目录执行(假设它在 tmp 目录下)python tmp/testPath.py,则会输出:

    script_folder_path: tmp
    relative_path_of_app: tmp/app.apk
    absolute_path_of_app: /Users/hengjiechen/Develop/tmp/app.apk
    

    此时如果 PATH 是 lambda p : os.path.abspath(p),那么它的返回值会变成:

    /Users/hengjiechen/Develop/app.apk
    

    tmp 这个文件夹会不见了(因为你在这里的 "app.apk" 相对路径是相对你执行 python 时所在的路径)

  • Crosswalk App UI 自动化 at 2015年05月30日

    感谢分享,看来 corsswalk 用的地方还真不少。

    另外,发现两处拼写错误:

    可以在其 gitgub 网站
    需要下载 android SKD:

  • 分享批量执行 case 的方法 at 2015年05月30日

    #2 楼 @monkey 。。。

  • Crosswalk 简介 at 2015年05月30日

    #7 楼 @luis 嗯。是的,要自己编译。。。真心麻烦。。。

  • Crosswalk 简介 at 2015年05月30日

    #5 楼 @luis 什么意思?只有 linux 版本?你说的是它提供的编译好的 webdriver 吧?

  • 命令行启动 AppiumForWindows at 2015年05月29日

    挺有用的文章,说明了用 AppiumForWindows 也能做 CI,这样大家就不用总是卡在用 node 安装 appium 时的各种网络、编译问题了。

  • 这标题好霸气~~

  • #2 楼 @mads 额,我指的不仅仅是超链接。。。
    发帖的话考虑一下你的帖子是给大家看的,不要写得像随笔那样。
    参考一下 浅谈 iOS 版本号 ,有层级的排版读起来舒服很多。

  • 学到好东西了。

  • 排版麻烦调整一下,超链接明显有问题。

  • 我想先问一下,你有把 logcat 的 log 都读一遍吗?
    既然提到了 CPU,你要提供一下你的模拟器信息啊,至少说明一下你的真机和模拟器使用什么 CPU 吧。

    另外,不要只关注自己觉得有问题的地方(例如第七点,这个问题和是否有源码关系不大,不过有源码可以针对不同 cpu 再编译一次而已。有些 apk 在 x86 和 ARM 上都能跑,有些不能),提供信息的时候尽可能从客观的角度提供所有能获取的信息。

  • Crosswalk 简介 at 2015年05月29日

    这篇文章很眼熟。。。
    据我所知,现在不少主流浏览器都是基于 WebKit 内核做的,如新版的 opera ,文中的 crosswalk(某个角度来说它也算浏览器)。所以他们都会提供自己在 chromedriver 基础上进行更改来适配自己的浏览器的 webdriver 。只是 crosswalk 的 webdriver 有点坑爹,只提供了 linux 的预编译版本(而且我在 docker 中用 ubuntu:14.04 跑还会说需要某些动态库),其他平台需要自己编译。

    crosswalk 是界面都用 html 实现(区别于既有原生界面,又有 webview 界面的 hybrid)的 android app 的利器(否则 4.4 以下的界面适配和调试会死人的),用 cordova/phonegap 来做产品的不少都会用它。

    之前做过一下使用 cordova/phonegap 的应用,晚些我也搬运一些这方面的文章介绍一下。