我正在尝试使用__get__
描述符在某种类型的数据上创建一个思考代理,以便客户端代码可以方便地使用它(最好通过示例显示):
class Value(object):
def __init__(self, val):
self.val = val
def __get__(self, instance, owner):
return self.val
class Container(object):
x = Value(1)
y = [ Value(2), Value(3) ]
c = Container()
assert c.x == 1
assert c.y[0] == 2 # fails.
现在,我主要知道它为什么会失败,所以我想知道是否有更好的方法来实现我的目标,即包装数据,这样当客户端访问它时,他们只需直接访问 Value 对象(实际上,方法会在返回之前__get__
做一些事情)self.val
细节
我试图解决的实际案例是帮助编写用于硒测试用例的PageObjects和 PageElements 的实用程序代码。我想为测试作者提供一种简洁的方式来编写表单的 PageObjects:
class MyLogin(PageObject):
username_text_box = PageElement(By.ID, "username")
password_text_box = PageElement(By.ID, "password")
submit_button = PageElement(By.CLASS_NAME, "login-button")
driver = webdriver.Firefox()
driver.get("http://mypage.com")
login_page = MyLogin(driver)
login_page.username_text_box.send_keys("username01")
login_page.password_text_box.send_keys("XXXX")
login_page.submit_button.click()
我正在尝试将在 PageElement 类中获取实际WebElement的业务封装起来,并且我希望允许客户端在访问 PageElement 对象后能够访问 WebElement。能够拥有列表,字典有助于使 PageObject 实例更清晰,并对相关的 PageElements 进行分组。