2012-03-27 46 views
4

我一直在爲Web應用程序編寫Selenium測試,在內部服務器錯誤的情況下,應用程序中似乎有內部服務器錯誤的多個實例,應用程序顯示自定義錯誤頁面,並向用戶顯示錯誤ID與技術團隊一起追求事情,以防用戶遇到它。以編程方式檢查頁面狀態

這使得在Selenium執行期間調試測試失敗有點費力。 我正在考慮使用一些機制來保持輪詢頁面,在測試中執行的每一步都會發現是否有內部服務器錯誤的任何實例。這是我遇到Junit Rule並想到爲它編寫自定義註釋時,像一些事情 -

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類 -

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 ?

回答

1

恕我直言,你的問題有兩種解決方案。如果該功能只需要測試的一小部分,那麼我不會使用規則。相反,在每個測試中添加一行errorChecker.checkPage(driver)並在此方法中執行檢查。

如果你需要它,幾乎所有的測試:通過延長ExternalResource

  1. 轉換SelTestCase到規則。

    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 2012-03-28 10:16:31

相關問題