上篇我們添加了登錄失敗的test case昼捍,完成了整個登錄模塊翠肘。這篇我們繼續(xù)寫下一個模塊 - 用戶模塊眯亦。當你用一組員工代號/密碼登錄成功示例網站后點擊導航欄Employee伤溉,出現的是所有員工的基本信息:
注意第三列是Last Login Date,指的是最后一次登錄日期搔驼。你每次只要用一組員工代號/密碼登錄成功谈火,系統(tǒng)就會返回該員工最新登錄的日期。從上圖中可以看出來舌涨,每個員工最后登錄日期都是2018年5月31日糯耍。我這里設計了一個測試用例,驗證的是最后登錄日期是否和你電腦屏幕右下角的系統(tǒng)時間一致囊嘉。
1. 登錄http://www.cslm-test.com/hrsystem/index.php
2. 輸入員工代號和密碼温技;
3. 點擊登錄按鈕;
4. 點擊Employee扭粱;
5. 驗證登錄員工的最后登錄日期是否和系統(tǒng)時間一致
這里請注意一下舵鳞,由于頁面上顯示的是網站服務器的日期,不是真正你屏幕右下角的系統(tǒng)日期琢蛤,但世界各地又差不過24小時蜓堕,所以我們只要確保頁面日期在系統(tǒng)日期前一天到后一天之間即可。比如我現在電腦上的系統(tǒng)日期是2018-06-01博其,那我們放寬一下要求套才,只要頁面日期是2018-05-31、2018-06-01慕淡、2018-06-02之中的任意一天就行了背伴。
首先還是先定位頁面上的元素然后放進object repository中,我整理了一下峰髓,其實就兩個傻寂,一個是導航欄上的Employee,還一個是日期携兵。在com.testalliance.hrsystem.objrepository中新建empPage.properties:
日期的xpath里面員工代號的位置是“||EMPCODE||”疾掰,我們有三個員工,所以這地方不能寫死徐紧,“||EMPCODE||”指的是這個位置未來是要被剛剛登錄的員工代號替換的个绍。
下一步就該寫包括所有操作和斷言的page object的類了勒葱。寫登錄操作時起的名字是LoginPage.java,那我就叫用戶模塊EmpPage.java吧巴柿。在com.testalliance.hrsystem.pageobj中新建EmpPage.java:
測試用例中的前三步都沿用LoginPage.java里的操作方法凛虽,不說了,我們只需要把第4步和第5步寫到EmpPage.java中广恢。完整代碼如下:
首先還是在第25行讀取page objects凯旋。接下來點擊Employee的操作是navToEmployee()方法,在第43行钉迷。驗證日期的操作是第50行的verifyLoginDate()方法至非,那問題來了,怎樣比較兩個日期是否相等呢糠聪?網站頁面上的日期本質上其實就是個字符串荒椭,而你屏幕右下角的系統(tǒng)日期是日期格式的,格式都不一樣你怎么比較這兩者呢舰蟆?
這就需要日期和字符串之間進行轉換了趣惠。我的想法是把屏幕右下角系統(tǒng)日期轉換成字符串,然后和頁面上的比較身害。頁面日期字符串很容易取出味悄,定位后用getText()方法就可以了,這步操作在第74行到第77行之間塌鸯。之前說需要把"||EMPCODE||"這個字符串替換成登錄員工的員工代號侍瑟,也是在這里完成,這就是為什么verifyLoginDate()方法需要傳入一個員工代號的參數丙猬。
接下來我就要把系統(tǒng)日期轉成字符串了涨颜。java文檔中有個類叫Date,主要負責日期之類的處理:
這里有關于日期和時間的所有操作茧球,大家有機會可以多看一看庭瑰。回來看程序袜腥,第53行是實例化一個Date對象的過程见擦,得到的就是今天日期的對象钉汗,我給它起名為today羹令。其實僅僅做這一步我已經取到了系統(tǒng)日期,但這個today是Date類型的损痰,我要把它轉成字符串福侈,這就需要借助另一個叫SimpleDateFormat的類:
看第54行和55行我是怎么用它的,先實例化對象再調用format方法卢未。實例化對象時需要一個日期格式肪凛,它指的是日期轉換后的字符串格式堰汉。因為頁面上的日期字符串格式是"yyyy-MM-dd":
我只有把今天日期的對象today轉成相同格式的字符串才可以進行比較,否則沒可比性伟墙。所以翘鸭,我把參數也寫成"yyyy-MM-dd"。當然戳葵,這只是我們例子中的需要就乓,SimpleDateFormat還可以接受其它的日期格式,比如"yyyy-MM-dd hh:mm:ss"拱烁,精確到秒生蚁。總之戏自,你希望目標字符串是什么日期格式邦投,你的參數就寫成什么格式。第55行是轉換過程擅笔,用SimpleDateFormat的對象df調用format()方法志衣,里面?zhèn)魅雝oday對象,返回的就是今天日期的字符串剂娄。
這還沒完蠢涝,剛才說了,由于頁面上顯示的是網站服務器的日期阅懦,不是真正你屏幕右下角的系統(tǒng)日期和二,但世界各地又差不過24小時,所以我們只要確保頁面日期在系統(tǒng)日期前一天到后一天之間即可耳胎,我們還需要拿到昨天和明天的日期字符串惯吕。改變日期還需要一個類,叫Calendar怕午,日歷類:
通過這個類改變日期的具體做法是通過把日期放到日歷中再執(zhí)行加減得到以給定日期為基準的前后日期废登。不明白沒關系,一行一行解釋郁惜。程序中第58行到65行是取得昨天日期的方法堡距。還是要先取得Calendar對象,做法不是new一個兆蕉,而是是通過Calendar調用靜態(tài)方法getInstance()獲取的羽戒,之前介紹靜態(tài)方法時說過,它們可以通過類名來調用虎韵。通過Calendar對象c調用setTime()方法就是把日期放入日歷的過程易稠,它接受一個Date類型的日期參數,我把today傳進去包蓝,把今天放進了日歷驶社。然后日歷對象c調用add方法可以在剛才的日期參數也就是today的基礎上進行加減得到之前或之后的日期企量,“-1”表示前一天,也就是昨天。完成這步之后日歷上的日期也就變成了昨天,調用getTime()方法從日歷中再把日期取出來峦朗,因為是Date類型,所以我還要轉成字符串類型姆泻,和之前的一樣。同理冒嫡,我們還可以獲取明天的字符串形式拇勃,在第68到72行。當我們同時取得了昨天孝凌、今天和明天后方咆,就可以進行比較了。只要頁面上的日期和其中一個相等蟀架,我們就可以說測試通過了瓣赂。步驟在79到84行。
操作方法寫完了就該設計數據源文件了片拍。之前登錄模塊的四個數據源文件都放在了files里煌集,因為只有一個模塊。現在我們新增了員工模塊捌省,最好把它們分開苫纤,把files改成testdata.login,再新建testdata.employee -> TCEmp1.xlsx:
該改寫測試用例了纲缓。和剛才的道理一樣卷拘,之前登錄模塊的四個測試用例都放在了com.testalliance.hrsystem.tests里,因為只有一個模塊∽8撸現在我們新增了員工模塊栗弟,需要給它們分開,登錄模塊放在com.testalliance.hrsystem.tests.login中工闺,員工模塊放在com.testalliance.hrsystem.tests.emp中乍赫。新建com.testalliance.hrsystem.tests.emp -> TCEmp1.java:
添加如下代碼:
注意,因為我們修改了文件夾的名字陆蟆,文件的路徑也就改變了雷厂。提醒一下,登錄模塊的四個用例也需要修改文件路徑遍搞,我就不貼截圖了罗侯。畫紅框的位置就是第四步和第五步的步驟器腋,我們需要先得到page objects溪猿,然后再調用verifyLoginDate()方法钩杰。
最后,我們在TestRunner.java中添加TCEmp1的實例化以及調用test()方法的過程:
執(zhí)行一下诊县,測試通過:
這就是一個關于員工模塊用例的演示讲弄,現在TestRunner.java已經越來越長了,如果有很多test case你就得實例化每一個+調用test()方法依痊,很不方便維護避除。下一篇我們就來解決這個問題。
這篇文章的源代碼在SeleniumExcelDataDrivenFrame3項目里邊胸嘁。