我建立了一个模块来保存所有常见硒预期条件,然后在各种测试中都将其引用。 (此示例中的硒部分并不重要,仅是我拥有数千种“目录”的事实。)
# ec module
class EcHR(object):
class sidemenu(object):
hrfile: Clickable = Clickable((By.ID, "sidemenu_HRFile"), f"HR File")
hrvistainfo: Clickable = Clickable((By.ID, "sidemenu_HRVistA Info"), f"HR VistA Info")
class hrfile(__hr_search__):
class actionmenu(__hr_search__.actionmenu):
add: Clickable = Clickable((By.ID, "NewHireLink"), f"Add {BUTTON}")
personnel: Clickable = Clickable((By.ID, 'setEmpType'), f"Personnel Filter {DROPDOWN}")
status: Clickable = Clickable((By.ID, 'setStatus'), f"Status {DROPDOWN}")
configure: Clickable = Clickable((By.ID, "configureLinkGen"), f"Configure {BUTTON}")
reports: Clickable = Clickable((By.ID, 'Reports'), f"Reports {BUTTON}")
class addmenu(object):
employee: Clickable = Clickable((By.ID, f'Employee'), f"Add->Employee {BUTTON}")
在ec模块中对给定项目的示例引用。
import ec
# navigation helper method for a given page
def do_hrfile_nav(self):
self.clickbutton(ec.EcHR.sidemenu.hrfile)
这很好用;我可以跟踪每个对象的用法,同时仍然提供对象的可读性上下文。
self.clickbutton(ec.EcHR.sidemenu.hrfile)
告诉读者我们正在单击hrfile
页面上的补充菜单项HR
。区别于ec.EcHR.hrfile
是一组不同的对象,这一点很重要。
我的问题:是否有更好/更干净的方法来组织这些对象?我正在使用永远不会实例化的类。 (由于我无法阐明的原因,这感觉有些尴尬)这些类仅作为一种以有组织的方式引用它们的方法。也许某种具有类结构的轻量级数据对象? (我在考虑问题吗?)
答案 0 :(得分:1)
我有一些想法。 可能有用。
如何将函数用作名称空间?
@namespace
def EcHR():
@namespace
def sidemenu():
hrfile: Clickable = Clickable((By.ID, "sidemenu_HRFile"), f"HR File")
return locals()
@namespace
def hrfile():
@namespace
def actionmenu():
add: Clickable = Clickable((By.ID, "NewHireLink"), "Add {BUTTON}")
@namespace
def addmenu():
employee: Clickable = Clickable(
(By.ID, f"Employee"), "Add->Employee {BUTTON}"
)
return locals()
return locals()
return locals()
return locals()
我已将每个class
更改为一个函数。而且每个函数都必须使用namespace
装饰器进行修饰,并且必须返回locals()
或任何具有自定义键,val映射的dict
。
这里是NameSpace
类和namespace
装饰器。
from functools import reduce
class NameSpace:
def __init__(self, name):
self.__name__ = name
def __str__(self):
return "{}".format(self.__name__)
def __repr__(self):
return "NameSpace({})".format(self.__name__)
def __call__(self):
pass
def namespace(func):
return reduce(
lambda ns, kv: setattr(ns, kv[0], kv[1]) or ns,
func().items(),
NameSpace(func.__name__),
)
namespace
装饰器运行装饰后的函数,并将返回的dict
转换为NameSpace
实例。
如何访问对象?
print(EcHR.sidemenu.hrfile)
print(EcHR.hrfile.actionmenu.addmenu.employee)