出路出路,走出去了,總是會有路的;困難苦難,困在家里就是難。
?
??? 因為最近遇到的技術問題一直沒找到可行的解決辦法,一直在翻看selenium的源代碼,之前寫測試代碼的時候就是拿來即用,寫什么功能啊,就按手動的操作步驟去轉換 ,近日看到一個文章,又去wiki上查了查,覺得寫的不錯就記錄下來了。
??? 在使用selenium做UI測試的時候,往往并不是頁面的每個功能我們都要測試,總有一些經常要進行回歸的功能,再細致一點的說,有一些節點是我們經常 操作的,那么我從項目初期開始就進行自動化測試代碼編寫的話,我們可以設計適應項目的一套自動化測試代碼結構,基本的思路就是對每一個頁面都創建一個相應 的PageObject類,如果是公共的模板頁面當然只建立一個就可以了。這樣下來就相當于建立了很多基礎頁面一樣,如果項目開發的過程中還有完整的文檔 或者足夠詳細的用戶故事,那么就簡直太完美了~~因為這樣你可以減少很多次的IDE----Browser之間的切換、查找、測試工作,真的方便很多。但 是這個看項目而定吧,這種細致入微的文檔很多團隊似乎都沒能做到。但是筆者還是真的希望在產品初期或項目開始的時候有完整的文檔給我們這些自動化測試的人 員手中,這樣可以大大加快我們自動化測試代碼的編寫。繞的有點遠了。。?;貧w正題,如何做這種一個頁面一個基礎類的實現呢?最實際的,看代碼:
1 public class PageObject { 2 3 private WebElement searchTypeSng; 4 private WebElement fromCity; 5 private WebElement toCity; 6 private WebElement fromDate; 7 8 public String calDate( int nextDays) { 9 // 當前日期加 n 天之后 10 Date date = DateUtils.addDays( new Date(), nextDays); 11 // 格式化時間格式 12 return DateFormatUtils.ISO_DATE_FORMAT.format(date); 13 } 14 15 public void searchTrip(WebDriver driver,String from, String to ,String date) { 16 BaseUtils.clearAndTypeString(driver,fromCity, from); 17 BaseUtils.clearAndTypeString(driver,toCity, to); 18 BaseUtils.clearAndTypeString(driver,fromDate, date); 19 searchTypeSng.submit(); 20 } 21 22 }
?
測試執行:
public class UsingPageObject { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver); eventDriver.register( new MyWebDriverListener()); eventDriver.get( "http://flight.qunar.com/" ); PageObject object = PageFactory.initElements(driver, PageObject.class); String date = object.calDate(30); object.searchTrip(driver,"北京", "廈門", date); } }
?
這個時候就完成對搜索這一功能的冒煙測試,測試執行代碼沒有使用TestNG,只是直接用了一個main函數。為了寫博客簡單方便,不推薦大家效仿。
如果還需要測試其它功能和使用其它節點,直接在PageObject類中加入相應的Field即可。
分割線-------------------------------------------------------------------------------------------------分割線
寫到這里,如果沒用過這個方法的人會越看越暈,現在簡單的講解一下它執行的原理:
在 PageObject類中我們創建的Field的名稱是和頁面有一定的對應關系的,不是隨意取的,如果像上面代碼這么寫,默認的selenium會根據 Id最先進行元素查找,如果沒有查找到再通過name進行查找,下面的我就不說了,因為你已經想到了。。。如果你擔心頁面的不規范或者復雜度比較高,容易 產生ID,name,Css等的沖突,selenium不能準確的識別元素, 那么請往下看:
selenium還提供了一種注解的方式,還是直接上代碼:
1 public class PageObject { 2 private WebElement searchTypeSng; 3 @FindBy(name="fromCity") 4 private WebElement fromCity; 5 @FindBy(name="toCity") 6 private WebElement toWhere ; 7 private WebElement fromDate; 8 9 public String calDate( int nextDays) { 10 // 當前日期加 n 天之后 n=30 11 Date date = DateUtils.addDays( new Date(), nextDays); 12 // 格式化時間格式 13 return DateFormatUtils.ISO_DATE_FORMAT.format(date); 14 } 15 16 public void searchTrip(WebDriver driver,String from, String to ,String date) { 17 BaseUtils.clearAndTypeString(driver,fromCity, from); 18 BaseUtils.clearAndTypeString(driver,toWhere, to); 19 BaseUtils.clearAndTypeString(driver,fromDate, date); 20 searchTypeSng.submit(); 21 } 22 23 }
?
當你看到這兩個annotations的時候,你已經明白了,是的,selenium提供注解的方式對頁面的元素進行準確的定位,可 以參考的關鍵字有:className、css、id、linkText、name、partialLinkText、tagName、xpath.
另外selenium還提供了2個關鍵字,一個是how,另一個是using,如何使用它們就不在這里寫了,因為筆者覺得,用這兩個關鍵字更麻煩,理解起來也麻煩。
關于PageObject & PageFactory的使用,就簡單的寫了這么多,關于PageFactory還有很多知識,我會抽出時間寫在下篇文章里,如果有正在使用這種模式的朋友,請多多批評和指點,相互討論學習。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
