2017-11-22 1 views
1

내 테스트 프레임 워크는 셀레늄의 PageFactory와 Lambok을 사용합니다. 테스트 플로우가 실행되는 동안 나타나는 모든 웹 요소를 캡처하는 측면을 작성하고자합니다.AspectJ - @FindBy로 주석 된 모든 WebElements를 포착하기위한 포인트 컷

@Slf4j 
public class MyCustomPage { 

    @Inject 
    private IWebDriverSet driverSet; 

    @Getter 
    @FindBy(id = PAGE_ROOT) 
    private WebElement root; 

    @FindAll({ 
      @FindBy(css = FOOT_BAR), 
      @FindBy(css = FOOT_BAR_B) 
    }) 
    private WebElement navBar; 
} 

@FindBy과 함께 거래를 테스트하는 webelement을 결정처럼

전형적인 페이지가 보인다. 50 페이지가 있습니다.

페이지가 PageFactory를 사용하여 인스턴스화 될 때 webElement 필드가 인스턴스화됩니다 (@FindBy의 값에 해당하는 WebElement 인스턴스로 지정됨).

@ FindBy/@ FindAll을 인스턴스화하자 마자 이러한 webElements를 캡처하고 싶습니다. 모든 페이지 클래스에 대해 별도의 pointcut을 작성하고 싶지 않습니다. 어떻게 그럴 수 있습니까?

+0

IMO는 그것을 수행하는 셀레늄 방식이 아니며 단지 오래된 자바 리플렉션 만 사용합니다. 그렇다면 분석 할 클래스 목록을 전달해야합니다. 또는 FindBy를 다시 작성하여 로그인 할 수 있습니다. –

+0

"캡처"란 무엇을 의미합니까? 그냥 로깅? DefaultFieldDecorator를 확장하고 decorate() 메서드에 코드를 추가 할 수 있습니다. 그런 다음 새 Decorator 클래스를 PageFactory static initElements (FieldDecorator 데코레이터, java.lang.Object 페이지) 메서드에 전달하여 page 객체를 초기화합니다. 이 코드는 findby 주석을 사용하여 각 web 요소에 대해 실행해야합니다. – Grasshopper

답변

0

반사를 통해 할당 된 WebElement의 값은 set() pointcut 지정자로 차단할 수 없으므로 그러나 당신은 당신이 당신의 pom.xml

<dependencies> 
     <dependency> 
      <groupId>java</groupId> 
      <artifactId>jre-runtime</artifactId> 
      <version>1.8</version> 
      <scope>system</scope> 
      <systemPath>${java.home}/lib/rt.jar</systemPath> 
     </dependency> 
... 
</dependencies> 

을과 AspectJ를-받는다는 - 플러그인의 weaveDependencies 섹션에 종속 섹션의 rt.jar을 정의 할 필요가있는 경우 java.lang.reflect.Field.set

@After("call(* java.lang.reflect.Field.set(..)) && args(obj, value) && target(target)") 
    public void webelementInit(JoinPoint jp, Object obj, Object value, Field target) { 
     //obj - instance of a class (page object) that declares current field 
     //value - new field value (instantiated WebElement) 
     //field - current field 
     //you can filter calls to the fields you need by matching target.getDeclaringClass().getCanonicalName() with page object's package 
     //for example: 
     //if(target.getDeclaringClass().getCanonicalName().contains("com.example.pageobjects")) { 
      //do stuff 
     //} 
    } 

모든 통화를 추적 할 수 있습니다

<weaveDependencies> 
    <weaveDependency> 
     <groupId>java</groupId> 
     <artifactId>jre-runtime</artifactId> 
    </weaveDependency> 
... 
</weaveDependencies> 
관련 문제