答案 0 :(得分:9)
当您使用PageFactory
时,webelements实例实际上是代理,并且在您调用方法之前必须找到元素。
获取部分封装在每个字段的ElementLocator
中。 ElementLocatorFactory
为每个元素提供了这些元素。该工厂需要向工厂构造函数提供SearchContext
。驱动程序实现SearchContext
(方法findelement)甚至是webelement。 By
部分是如何查找它们的,它是通过页面对象字段上的反射API
检索的。
将代理分配给字段由FieldDecorator
处理,这需要ElementLocatorFactory
。为每个webelement字段调用的decorate()
方法返回为该字段设置的代理。当在webelement上调用方法时,它实际上在代理上被调用。代理拦截此调用以使用SearchContext.findElement
方法查找实际元素,然后调用原始方法。
因此,可以创建自定义ElementLocatorFactory
和FieldDecorator
以传递给PageFactory
。
有关代码级别的说明 - http://www.alechenninger.com/2014/07/a-case-study-of-javas-dynamic-proxies_14.html。