#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:以后不要问这么简短的问题。。。
我刚好是最典型的测试屌丝。。。
很实用的工具!
我支持你宣传自己写的工具,但我觉得这个工具离 “强大” 这个词还有一段距离吧。。。
# 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 时所在的路径)
感谢分享,看来 corsswalk 用的地方还真不少。
另外,发现两处拼写错误:
可以在其 gitgub 网站
需要下载 android SKD:
挺有用的文章,说明了用 AppiumForWindows 也能做 CI,这样大家就不用总是卡在用 node 安装 appium 时的各种网络、编译问题了。
这标题好霸气~~
#2 楼 @mads 额,我指的不仅仅是超链接。。。
发帖的话考虑一下你的帖子是给大家看的,不要写得像随笔那样。
参考一下 浅谈 iOS 版本号 ,有层级的排版读起来舒服很多。
学到好东西了。
排版麻烦调整一下,超链接明显有问题。
我想先问一下,你有把 logcat 的 log 都读一遍吗?
既然提到了 CPU,你要提供一下你的模拟器信息啊,至少说明一下你的真机和模拟器使用什么 CPU 吧。
另外,不要只关注自己觉得有问题的地方(例如第七点,这个问题和是否有源码关系不大,不过有源码可以针对不同 cpu 再编译一次而已。有些 apk 在 x86 和 ARM 上都能跑,有些不能),提供信息的时候尽可能从客观的角度提供所有能获取的信息。
这篇文章很眼熟。。。
据我所知,现在不少主流浏览器都是基于 WebKit 内核做的,如新版的 opera ,文中的 crosswalk(某个角度来说它也算浏览器)。所以他们都会提供自己在 chromedriver 基础上进行更改来适配自己的浏览器的 webdriver 。只是 crosswalk 的 webdriver 有点坑爹,只提供了 linux 的预编译版本(而且我在 docker 中用 ubuntu:14.04 跑还会说需要某些动态库),其他平台需要自己编译。
crosswalk 是界面都用 html 实现(区别于既有原生界面,又有 webview 界面的 hybrid)的 android app 的利器(否则 4.4 以下的界面适配和调试会死人的),用 cordova/phonegap 来做产品的不少都会用它。
之前做过一下使用 cordova/phonegap 的应用,晚些我也搬运一些这方面的文章介绍一下。