Selenium Web Driver自動化測試(java版)系列下半部分(30) - 用數據驅動搭建測試框架雛形(3) - 添加用戶模塊用例

上篇我們添加了登錄失敗的test case,完成了整個登錄模塊。這篇我們繼續寫下一個模塊 - 用戶模塊。當你用一組員工代號/密碼登錄成功示例網站后點擊導航欄Employee,出現的是所有員工的基本信息:

注意第三列是Last Login Date,指的是最后一次登錄日期。你每次只要用一組員工代號/密碼登錄成功,系統就會返回該員工最新登錄的日期。從上圖中可以看出來,每個員工最后登錄日期都是2018年5月31日。我這里設計了一個測試用例,驗證的是最后登錄日期是否和你電腦屏幕右下角的系統時間一致。

1. 登錄http://www.cslm-test.com/hrsystem/index.php
2. 輸入員工代號和密碼;
3. 點擊登錄按鈕;
4. 點擊Employee;
5. 驗證登錄員工的最后登錄日期是否和系統時間一致

這里請注意一下,由于頁面上顯示的是網站服務器的日期,不是真正你屏幕右下角的系統日期,但世界各地又差不過24小時,所以我們只要確保頁面日期在系統日期前一天到后一天之間即可。比如我現在電腦上的系統日期是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()方法,那問題來了,怎樣比較兩個日期是否相等呢?網站頁面上的日期本質上其實就是個字符串,而你屏幕右下角的系統日期是日期格式的,格式都不一樣你怎么比較這兩者呢?

這就需要日期和字符串之間進行轉換了。我的想法是把屏幕右下角系統日期轉換成字符串,然后和頁面上的比較。頁面日期字符串很容易取出,定位后用getText()方法就可以了,這步操作在第74行到第77行之間。之前說需要把"||EMPCODE||"這個字符串替換成登錄員工的員工代號,也是在這里完成,這就是為什么verifyLoginDate()方法需要傳入一個員工代號的參數。

接下來我就要把系統日期轉成字符串了。java文檔中有個類叫Date,主要負責日期之類的處理:

這里有關于日期和時間的所有操作,大家有機會可以多看一看。回來看程序,第53行是實例化一個Date對象的過程,得到的就是今天日期的對象,我給它起名為today。其實僅僅做這一步我已經取到了系統日期,但這個today是Date類型的,我要把它轉成字符串,這就需要借助另一個叫SimpleDateFormat的類:

看第54行和55行我是怎么用它的,先實例化對象再調用format方法。實例化對象時需要一個日期格式,它指的是日期轉換后的字符串格式。因為頁面上的日期字符串格式是"yyyy-MM-dd":

我只有把今天日期的對象today轉成相同格式的字符串才可以進行比較,否則沒可比性。所以,我把參數也寫成"yyyy-MM-dd"。當然,這只是我們例子中的需要,SimpleDateFormat還可以接受其它的日期格式,比如"yyyy-MM-dd hh:mm:ss",精確到秒。總之,你希望目標字符串是什么日期格式,你的參數就寫成什么格式。第55行是轉換過程,用SimpleDateFormat的對象df調用format()方法,里面傳入today對象,返回的就是今天日期的字符串。

這還沒完,剛才說了,由于頁面上顯示的是網站服務器的日期,不是真正你屏幕右下角的系統日期,但世界各地又差不過24小時,所以我們只要確保頁面日期在系統日期前一天到后一天之間即可,我們還需要拿到昨天和明天的日期字符串。改變日期還需要一個類,叫Calendar,日歷類:

通過這個類改變日期的具體做法是通過把日期放到日歷中再執行加減得到以給定日期為基準的前后日期。不明白沒關系,一行一行解釋。程序中第58行到65行是取得昨天日期的方法。還是要先取得Calendar對象,做法不是new一個,而是是通過Calendar調用靜態方法getInstance()獲取的,之前介紹靜態方法時說過,它們可以通過類名來調用。通過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里,因為只有一個模塊。現在我們新增了員工模塊,需要給它們分開,登錄模塊放在com.testalliance.hrsystem.tests.login中,員工模塊放在com.testalliance.hrsystem.tests.emp中。新建com.testalliance.hrsystem.tests.emp -> TCEmp1.java:

添加如下代碼:

注意,因為我們修改了文件夾的名字,文件的路徑也就改變了。提醒一下,登錄模塊的四個用例也需要修改文件路徑,我就不貼截圖了。畫紅框的位置就是第四步和第五步的步驟,我們需要先得到page objects,然后再調用verifyLoginDate()方法。

最后,我們在TestRunner.java中添加TCEmp1的實例化以及調用test()方法的過程:

執行一下,測試通過:

這就是一個關于員工模塊用例的演示,現在TestRunner.java已經越來越長了,如果有很多test case你就得實例化每一個+調用test()方法,很不方便維護。下一篇我們就來解決這個問題。

這篇文章的源代碼在SeleniumExcelDataDrivenFrame3項目里邊。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容