1. 背景
对于有些项目,需要在生产环境支持不同的版本,比如对于不同的企业级用户,或者不同国家的支持。

2. 问题
通常解决这个问题有几种方法:第一,每个版本维护一套代码,但是这样冗余代码太多,因为上下两个版本的差异可能并不大,而且如果有改变需要改动多个版本;第二,在代码中加入 if else 分之对版本进行判断,这样的结果是经过几个版本以后,项目中死代码很难清理,维护成本加大。

3. 解决办法
在这里我采用了一种插件的方式,也就是我把所有的页面、自定义元素都看成可拼装的对象,然后根据版本来自动组装成需要的页面。我们只需要维护一个版本号和加载对象的对应关系就可以了。
首先写一个拼装函数:

from distutils.version import StrictVersion  
from .elements import baseelements  

object_dir_map = {"element.base": "baseelements"}  

def get_object(env, method, module, object_name):  
    object_map = {}  
    object_module = object_dir_map[method + "." + module]  
    object_map.update(eval(object_module).object_map)  
    target_version = '1.0'  
    if module == "moduleA" or module == "base":  
        server_ver = env.moduleA_version  
    elif module == "moduleB":  
        server_ver = env.moduleB  
    object_versions = object_map[object_name]  
    for version in object_versions:  
        if StrictVersion(server_ver) >= StrictVersion(version):  
            if StrictVersion(target_version) <= StrictVersion(version):  
                target_version = version  
    if method == "page":  
        exec("from .pages." + object_module + "." + object_versions[target_version] + " import " + object_name)  
    elif method == "element":  
        exec("from .elements." + object_module + "." + object_versions[target_version] + " import " + object_name)  
    return eval(object_name)  

def get_page(env, module, page_name):  
    return get_object(env, "page", module, page_name)  

def get_element(env, module, element_name):  
    return get_object(env, "element", module, element_name)

然后需要维护一个版本的对应关系

object_map = {"LaunchPage": {"1.0": "login_page"}}

如果想获取元素或者页面我们只需要 call get_page 或者 get_element 就可以了


↙↙↙阅读原文可查看相关链接,并与作者交流