2013-08-15 4 views
0

머리말 :이 질문에는 많은 WebDriver 용어가 포함되어 있지만 실제로는 Java 프록시 질문이며, 여전히 내 머리 글을 쓰려고합니다. 당신이 WebDriver을 이해하지 못한다면, 나는 현재 WebElementList<WebElement>, 즉 EnhancedWebElementWebElementList 주위에 래퍼를 아래로 건너 뛰고 나는 간단한 문제셀레늄이 포함 된 내부 프록시

을 게시합니다. 몇 가지 이유가 있기 때문에 유연성이 상당히 좋아졌습니다. 또한 페이지 객체 패턴을 사용하고 모든 요소를 ​​내가 작성한 두 개의 래퍼로 선언합니다 (위대한 작품).

그러나 최근에 나는 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); 

과 또는 요소에 대한 조치

(난 그냥) 클릭을 (수행하려는 경우., 나는이 같으면 인스턴스화하지에 의존 EnhancedWebElementWebElementList에서 꽤 많은 기능을 가지고 있기 때문에, 그것은 왜 당신이 정말로 궁금해하는 경우 ' 이 모든 필요 없음)

WebDriver를 이해하지 못하는 모든 사람들에게. 나는 Object X를 가지고있다. 이것은 다른 객체 X를 반환 할 수있는 함수를 가지고 있지만, 일부 처리를 한 후에 만 ​​가능하다. 오브젝트 X는 다른 기능을 가지고 있습니다. X someObject = new X().getX().getX().getX()을 수행하면 내가 수행 할 때까지 처리가 수행되기를 원하지 않습니다. someObject.otherFunction()

답변

0

알아 냈습니다. 새로운 EnhancedWebElement가 아닌 원래의 WebElement 주위에 프록시를 생성 한 다음, 그 주위에 감싸 진 EnhancedWebElement의 새 인스턴스를 만들어야했습니다. 그렇게하면 findEnhancedWebElement()를 사용할 때 원본 WebElement를 절대 접하지 못합니다.