以前寫的自動化測試框架(PageObject設計思路)一直都是每執行一條用例,啓動一次瀏覽器驅動就打開一次瀏覽器,一條用例執行結束以後就關閉瀏覽器。這樣作不只浪費時間並且每次都重啓關閉chromedriver.exe也挺浪費資源的。全部根據TestNG生命週期的各個註解的執行順序,對相關方法作了一點點的改動,實現了這一功能。chrome
首先看一下PageFactory類,這個類主要是利用Java反射的機制,調用頁面類的構造方法生成一個新的頁面對象,這裏我在這個類裏面定義了一個WebDriver對象,之後這個driver對象將做爲全部經過PageFactory類生成的頁面對象的統一driver,理論上就實現了只存在一個driver對象的情景,代碼以下:瀏覽器
PageFactory:框架
public class PageFactory { private static WebDriver driver; public static WebDriver getDriver() { return driver; } public static void setDriver(WebDriver driver) { PageFactory.driver = driver; } static Log log = new Log(PageFactory.class); /** * @Description: 生成新頁面 * @param key * @return Object * @Author: zither */ public synchronized static Object getPage(Class<?> key) { Object obj = null; try { String pageClassName = key.getCanonicalName(); log.debug("跳轉至頁面 " + key.getSimpleName()); Class<?> clazz = Class.forName(pageClassName); try { Constructor<?> constructor = clazz.getConstructor(WebDriver.class); obj = constructor.newInstance(getDriver()); } catch (InstantiationException e) { log.error(e.getMessage()); e.printStackTrace(); } catch (IllegalAccessException e) { log.error(e.getMessage()); e.printStackTrace(); } } catch (Exception e) { } return obj; } }
而後我建立了一個TestSuite類,這個類是TestNG類,主要用來包含一些公用的@BeforeSuite,@AfterSuite等等,以後的每一TestNG類就能夠直接繼承這個類不用重複寫這些註解了,測試
這裏特別關注@BeforeSuite和@BeforeMethod裏作了什麼,代碼以下:網站
TestSuite:ui
public class TestSuite { public static WebDriver driver; /** * @Description: 建立driver,將driver給到PageFactory頁面工廠 * @return void * @Author: zither */ @BeforeSuite public void beforeSuite() { driver = DriverFactory.getChromeDriver(); PageFactory.setDriver(driver); } @BeforeMethod public void BeforeMethod() { driver.get(Config.URL); } /** * @Description: Suite結束關閉瀏覽器,結束驅動 * @return void * @Author: zither */ @AfterSuite public void afterSuite() { DriverFactory.close(driver); } }
再來看看Action類怎麼寫,Action業務流裏的頁面對象經過已經得到了driver的PageFactory來生成的話,就能夠直接得到相似於複製出來的惟一driver了,但實際上仍是隻有一個driver在操做瀏覽器和頁面,Action類寫法以下(以打開瀏覽器進入主頁,點擊登陸,進入登陸頁,登陸,返回主頁的業務流爲例):spa
HomeAcdebug
public class HomeAc { static HomePg homePg; /** * @Description: xxxx首頁點擊登陸進入登陸頁 * @return LoginPg * @Author: zither */ public static LoginPg homeToLogin() { homePg = (HomePg) PageFactory.getPage(HomePg.class); homePg.clickLogin(); return (LoginPg) PageFactory.getPage(LoginPg.class); }
}
LoginAc設計
public class LoginAc { static LoginPg loginPg; /** * @Description: 登陸頁登陸返回xxxx主頁 * @param account * @param password * @return HomePg * @Author: zither */ public static HomePg LoginToHomePg(String account,String password) { loginPg = HomeAc.homeToLogin(); loginPg.typeAccount(account); loginPg.typePassword(password); loginPg.clickSubmit(); return (HomePg) PageFactory.getPage(HomePg.class); } }
如此一來咱們的@Test每執行完一個用例,就會由於@BeforMethod裏面在地址欄從新打開一次主頁連接而回到主頁,繼續開始執行下一條用例,而不用去關掉瀏覽器再重啓瀏覽器這麼麻煩啦~~code
其實這樣作只針對一開始進入的是主頁須要點擊登陸再進行登陸的頁面,由於這種網站登錄一次以後刷一下URL仍是主頁能夠直接進行下一條用例的操做且不用再登錄了。
下一篇講一講,URL直接進入的是「登陸頁-->主頁」而不是「主頁-->登陸-->主頁」的網站該怎麼操做~~