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 就可以了