Java 含硒内代理
前言:虽然这个问题包含了很多WebDriver术语,但它实际上是一个Java代理问题,我仍在努力解决这个问题。如果您不理解WebDriver,请往下跳,我将发布一个简化的问题 我目前在Java 含硒内代理,java,webdriver,proxy-classes,Java,Webdriver,Proxy Classes,前言:虽然这个问题包含了很多WebDriver术语,但它实际上是一个Java代理问题,我仍在努力解决这个问题。如果您不理解WebDriver,请往下跳,我将发布一个简化的问题 我目前在WebElement和List周围有一个包装,即EnhancedWebElement和WebElementList。这有很多原因,也给了我很大的灵活性。我还使用页面对象模式,并将我的所有元素声明为我创建的两个包装器(非常有效) 然而,我最近问。我想在一个元素中找到一个元素,并且仍然将整个内容保留在代理中。答案非常有
WebElement
和List
周围有一个包装,即EnhancedWebElement
和WebElementList
。这有很多原因,也给了我很大的灵活性。我还使用页面对象模式,并将我的所有元素声明为我创建的两个包装器(非常有效)
然而,我最近问。我想在一个元素中找到一个元素,并且仍然将整个内容保留在代理中。答案非常有效,我将其设置为通用的,并将其放在我的EnhancedWebElement
类中。看起来是这样的:
public EnhancedWebElement findEnhancedWebElement(final By by){
return (EnhancedWebElement) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class<?>[] { WebElement.class }, new InvocationHandler() {
// Lazy initialized instance of WebElement
private EnhancedWebElement webElement;
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (webElement == null) {
webElement = new EnhancedWebElement(findElement(by), driver);
}
return method.invoke(webElement, args);
}
});
}
EnhancedWebElement newElement = element.findElements(By.foo).getElementFoundBy(By.bar).findElement(By.foobar);
在我执行newElement.click()
或对元素执行任何操作之前,仍然没有在页面上执行任何选择
(如果你真的想知道为什么,那是因为我在EnhancedWebElement
和WebElementList
中有很多函数依赖于它没有被实例化。如果我只是想执行一个click(),那么我就不需要所有这些)
对于所有不了解WebDriver的人。我有一个对象X。它有一个函数,可以返回另一个对象X,但必须经过一些处理。对象X还具有其他功能。如果我做了
X someObject=new X().getX().getX().getX()
,我不想做任何处理,直到我做了someObject.otherFunction()
我找到了它。我需要围绕原始WebElement而不是新的EnhancedWebElement创建一个代理,然后围绕它创建一个EnhancedWebElement的新实例。这样,当我使用findEnhancedWebElement()时,我永远不会接触原始WebElement