Appium 分享批量执行 case 的方法

隔壁老王 · 2015年05月30日 · 最后由 陈恒捷 回复于 2015年05月30日 · 2303 次阅读

最近在入手学 appium,发送一个批量执行 case 的好方法,分享下,希望大家勿喷。

test_001.py

from appium import webdriver
import unittest
import os
from selenium.webdriver.support.ui import WebDriverWait
PATH = lambda p: os.path.abspath(
    os.path.join(os.path.dirname(__file__), p)
)
class test_001_cls(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '4.1'
        desired_caps['deviceName'] = 'SCRIBEPRO'
        desired_caps['appPackage'] = 'com.tencent.mm'
        desired_caps['appActivity'] = '.ui.LauncherUI'

        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    def tearDown(self):
        self.driver.close_app()
        self.driver.quit()
    def test_001(self):
         # 智能等待
        element = WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_name("通讯录"))
        self.driver.find_element_by_name('通讯录').click()
test_002.py
.....................

runCase.py
.....................
def load_tests():
    test_file_strings = glob.glob('test_*.py')
    module_strings = [str[0:len(str)-3] for str in test_file_strings]
    suites = [unittest.defaultTestLoader.loadTestsFromName(str) for str
          in module_strings]
    testSuite = unittest.TestSuite(suites)
    return testSuite
if __name__ == '__main__':
   unittest.TextTestRunner(verbosity=2).run(load_tests())

就这样,很简单也很实用,如果想运行指定的 case 只要改下 load_tests 即可。
另外贴下 api: https://docs.python.org/3.3/library/unittest.html#unittest.TestSuite.run

另外弱弱问下:

PATH = lambda p: os.path.abspath(
os.path.join(os.path.dirname(file), p)
)
返回此文件的绝对路径?

这段代码什么意思?我看到太多的例子都加了这段代码,我去掉了这段代码其实没有任何影响,但是打印出来的结果是: at 0x0227D2B8>,求解惑

共收到 10 条回复 时间 点赞

好吧,我表示我跪了。。。我一下子脑子没有转过弯来。。。认为PATH在 python 中的定义是有特殊意义的。我表示我搜索了十分钟我放弃了。。。那啥。。这位同学你误导我误导的好苦啊。。

这段代码是出自 Appium sample code。话说我以为真的是这样写的。。是你们没有用啊。。人家用了啊。。我想怎么一个 PATH 放在这儿,lamda 的定义是一个 function 的定义,怎么能不调用生效呢。。我已经怀疑我的智商了。。。

人家是这样调用的。。

desired_caps['app'] = PATH(
    '../../../sample-code/apps/ApiDemos/bin/ApiDemos-debug.apk'
)

这其实就是一个文件路径的拼接。lamda 本身其实就是为了缩短函数代码行数的。你可以认为这里实现了一个 function,然后传了一个 PATH 进去。。。

快说你是谁!我保证不打死你!!!

我是隔壁老王。。。好吧,我之前也怀疑过 PATH 的用法。。。看到了网上好多例子都有了这段代码,弄的我好费劲。。。也怪我没有仔细看官网的例子。。

#4 楼 @284772894 哈哈。其实我也老费劲了。。一下子没有绕出来。保证不打死你。。哈哈

PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p))
我的理解,其最主要的功能是可以统一不同操作系统的文件路径分隔符,因为我自己写的 python 脚本里面基本上都有这个匿名函数,只是有点不同:
PATH = lambda p : os.path.abspath(p)

#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 时所在的路径)

@chenhengjie123 很透彻!!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册