2012-03-27 7 views
4

웹 응용 프로그램 용 Selenium 테스트를 작성했으며 내부 서버 오류의 경우 응용 프로그램에 내부 서버 오류의 여러 인스턴스가있는 것 같습니다. 응용 프로그램에 사용자 정의 오류 페이지가 표시되고 사용자에게 오류 ID가 표시됩니다. 기술 팀이 사용자와 마주 치면 문제를 해결하십시오.프로그래밍 방식으로 페이지 상태 확인

이렇게하면 Selenium 실행 중에 테스트 실패를 디버깅하는 데 약간의 어려움이 있습니다. 내부 서버 오류의 인스턴스가 있는지를 찾기 위해 테스트에서 실행 된 각 단계마다 페이지를 폴링 (polling)하는 메커니즘을 사용하려고 생각했습니다. 그리고 이것이 내가 Junit 규칙을 보았을 때 사용자 지정 주석을 작성하려고 할 때입니다. 같은 몇 가지 -

public class PageChecker extends SelTestCase { 

    @Retention(RetentionPolicy.RUNTIME) 
    @Target({ElementType.METHOD}) 
    public @interface CheckPage { 
     // page check should take place here (Though not sure if it is right place)  
     // like if(driver.getPageSource.contains("Internal Server Error") {throw Exception ("Err")} 
    } 

} 

이것은 내가 CheckPage의 annonations으로 어떻게 진행합니까, 함께 붙어있는 무슨이다 -

public class SelTestCase { 
    protected WebDriver driver; 

    @Before 
    public void startDriver() { 
     driver = new FirefoxDriver(); 
     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
     driver.get("http://www.google.com/"); 
    } 

    @After 
    public void closeDriver() { 
     driver.quit(); 
    } 
} 

public class GoogleSearchTest extends SelTestCase { 

    @Rule 
    PageChecker pageChecker = new PageChecker(); 

    @Test 
    @CheckPage 
    public void testGoogleSearch() { 
     GoogleHomePage googleHomePage = PageFactory.initElements(driver, 
       GoogleHomePage.class); 
     googleHomePage.searchGoogle("Selenium HQ"); 
     assert driver.getPageSource().contains("seleniumhq") : "Selenium headquarter search failed"; 
    } 
} 

SelTestCase 클래스는 테스트를 실행 WebDriver의 인스턴스를 생성, 그리고 여기 PageChecker 클래스 ?

답변

1

IMHO 두 가지 해결책이 있습니다. 이 기능이 테스트의 작은 부분에서만 필요하면 규칙을 사용하지 않을 것입니다. 대신 각 테스트에 단일 줄 errorChecker.checkPage(driver)을 추가하고이 방법으로 수표를 구현하십시오.

  1. 변환 SelTestCase을 규칙에 ExternalResource를 확장하여 : 당신은 거의 모든 시험을 위해 필요한 경우

    .

    public class WebDriverRule extends ExternalResource { 
        public WebDriver driver; 
    
        @Override 
        protected void before() { 
        driver = new FirefoxDriver(); 
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
        driver.get("http://www.google.com/"); 
        } 
    
        @Override 
        protected void after() { 
        driver.quit(); 
        } 
    } 
    
  2. Verifier를 확장하여 규칙에 페이지 체크 코드를 추가합니다.

    public class PageChecker extends Verifier { 
        private WebDriverRule webDriverRule; 
        private enabled = true; 
    
        public PageChecker(WebDriverRule webDriverRule) { 
        this.webDriverRule = webDriverRule; 
        } 
    
        public void disable() { 
        this.enabled = false; 
        } 
    
        @Override 
        public void verify() { 
        if(enabled && notValid()) 
         throw new AssertionError("foo"); 
        } 
    
        private boolean notValid() { 
        WebDriver driver = webDriverRule.driver; 
        //do something with driver 
        } 
    } 
    
  3. 사용 org.junit.rules.RuleChain은이 규칙의 실행 순서를 제어 할 수 있습니다.

    public class GoogleSearchTest { 
        private WebDriverRule webDriverRule = new WebDriverRule(); 
        private PageChecker pageChecker = new PageChecker(webDriverRule); 
    
        @Rule 
        public RuleChain driverAroundPageChecker 
        = RuleChain.outerRule(webDriverRule).around(pageChecker); 
    
        @Test 
        public void testGoogleSearch() { 
        GoogleHomePage googleHomePage = PageFactory.initElements(driver, 
         GoogleHomePage.class); 
        googleHomePage.searchGoogle("Selenium HQ"); 
        assert driver.getPageSource().contains("seleniumhq") : "Selenium headquarter search failed"; 
        } 
    
        @Test 
        public void testWithouPageCheck() { 
        pageChecker.disable(); 
        //here is your real test 
        } 
    } 
    
+0

이 내가 찾던 가깝지만 작동하지 않았다. 드라이버 인스턴스를 생성하고 소멸시키는'SelTestCase' 클래스의 구현을 포함하도록 질문을 수정했습니다. 나는 시간 컨트롤이'notValid' 메소드에 도달했다는 것을 알아 차렸다. 드라이버는 파괴되고 널 포인터 예외가 발생한다. 테스트 메소드에서 각 명령문 다음에'verify' 메소드가 실행될 것이라고 가정하고 있습니다. – Tarun

관련 문제