• #3 楼 @284772894 能把排版调整一下吗?例如:

    问题描述

    ……

    解决方法

    ……

  • #12 楼 @mads 看了下源码,它调用了 appium-chromedriver 来启动 chromedriver ,下一个 log 应该是在 appium-chromedriver 输出的 Set chromedriver binary as: ...
    你卡在这里不知道是否和没能调用到 appium-chromedriver 有关。

    你用 appiumForWindows 试过吗?

  • #9 楼 @mads 你是停在截图那个位置不动了?
    你设了 autoWebview,不用再用 dr.switch_to.context("WEBVIEW_com.jiudao.ccare") 转 context 了。文档里已经说了设置了 autoWebview 后会自动转 context 到 webview 的。

  • #9 楼 @mads Yes。文档里不是有例子了吗?

  • 额,说了那么久,你貌似还没怎么说你现在做的 API 测试做成什么样,你觉得怎么做才算是完整的方案(至少你觉得能说服你领导)。。。

  • #5 楼 @yuwuhen333 也可以。但你要确定那个应用是不是可以关。

  • 哥今天郁闷极了。 at June 02, 2015

  • #2 楼 @mads 或者用 --chromedriver-port 参数改下 chromedriver 的端口。
    参考:https://github.com/appium/appium/blob/master/docs/cn/writing-running-appium/server-args.cn.md

  • #2 楼 @mads 这里是关键:

    > info: [debug] [CHROMEDRIVER STDERR] [0.015][SEVERE]: Could not bind socket to 127.0.0.1:9515
    > info: [debug] [CHROMEDRIVER] Port not available. Exiting...
    

    自己检查一下电脑的 9515 端口是不是被占用了?

  • #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 May 30, 2015

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

  • #3 楼 @xdf :plus1:

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

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

  • #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 May 30, 2015

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

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

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

  • #2 楼 @monkey 。。。

  • Crosswalk 简介 at May 30, 2015

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

  • Crosswalk 简介 at May 30, 2015

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

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

  • 这标题好霸气~~

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