머리말 :이 질문에는 많은 WebDriver 용어가 포함되어 있지만 실제로는 Java 프록시 질문이며, 여전히 내 머리 글을 쓰려고합니다. 당신이 WebDriver을 이해하지 못한다면, 나는 현재 WebElement
및 List<WebElement>
, 즉 EnhancedWebElement
및 WebElementList
주위에 래퍼를 아래로 건너 뛰고 나는 간단한 문제셀레늄이 포함 된 내부 프록시
을 게시합니다. 몇 가지 이유가 있기 때문에 유연성이 상당히 좋아졌습니다. 또한 페이지 객체 패턴을 사용하고 모든 요소를 내가 작성한 두 개의 래퍼로 선언합니다 (위대한 작품).
그러나 최근에 나는 this question에게 질문했습니다. 엘리먼트 내에서 엘리먼트를 찾고, 여전히 프록시 내에서 모든 것을 유지하기를 원했습니다. 그 대답은 훌륭하게 작동했으며, 일반화하여 내 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);
}
});
}
그러나 이것은 하나의 문제가 있습니다. 요소 내의 요소 내에 요소가있는 경우 첫 번째 프록시가 손실됩니다. 이는 다음 findEnhancedWebElement()
기능을 수행하기 위해 요소를 인스턴스화하기 때문입니다.
당신은 내가 이런 걸 할 수 있도록 내 정신, 내 목표는 일련의 기능을 가지고있다 생각하지만 : 여전히 페이지에있는 모든 선택 나는 newElement.click()
할 때까지 수행되지
EnhancedWebElement newElement = element.findElements(By.foo).getElementFoundBy(By.bar).findElement(By.foobar);
과 또는 요소에 대한 조치
(난 그냥) 클릭을 (수행하려는 경우., 나는이 같으면 인스턴스화하지에 의존 EnhancedWebElement
및 WebElementList
에서 꽤 많은 기능을 가지고 있기 때문에, 그것은 왜 당신이 정말로 궁금해하는 경우 ' 이 모든 필요 없음)
WebDriver를 이해하지 못하는 모든 사람들에게. 나는 Object X를 가지고있다. 이것은 다른 객체 X를 반환 할 수있는 함수를 가지고 있지만, 일부 처리를 한 후에 만 가능하다. 오브젝트 X는 다른 기능을 가지고 있습니다. X someObject = new X().getX().getX().getX()
을 수행하면 내가 수행 할 때까지 처리가 수행되기를 원하지 않습니다. someObject.otherFunction()