上一篇文章我們用工時記錄的xpath個數(shù)驗證了搜索結果和實際結果是否匹配谆构。但是,光檢查工時表里的記錄數(shù)目對不對還不夠框都,考慮這么一種情況:萬一數(shù)目匹配搬素,但最后顯示的記錄里多了一個其它員工的記錄怎么辦?假設我搜索Tester One返回了如下結果:
多了一個Tester Two的記錄魏保。Tester One的xpath數(shù)目與在Excel表中的期望結果都是2熬尺,但實際搜索出來的總工時數(shù)是3。所以谓罗,我們還需要進一步對每一條數(shù)據(jù)進行驗證粱哼。
搜索欄中輸入Tester One先拿到每條記錄:
我的思路是逐行讀取每條記錄,每條有9列數(shù)據(jù)檩咱,把它們讀到list里然后再與輸入數(shù)據(jù)進行比較揭措。
既然是逐行讀取胯舷,那肯定要用循環(huán)語句。我們已經在登錄那個例子中讀文件的操作里使用到了for語句“砗現(xiàn)在介紹一種更容易理解的寫法桑嘶。如果用java寫For循環(huán)語句怎么寫?是不是for(int i = 0; i < count; i++)躬充?這里的寫法差不多逃顶,看下圖,在Search Timesheet By Employee Name中繼續(xù)寫第二個檢查點:
第9行寫個comment充甚,告知開始進行第二個檢查點的測試以政。第10行就是for循環(huán)的寫法,只是這里我把循環(huán)變量$i的初始值設成1伴找。注意盈蛮,雖然第5列寫的是${timesheetCount}+1,可實際最后一次循環(huán)的值是${timesheetCount}疆瑰。如果這里你寫${timesheetCount}眉反,那循環(huán)就進行到${timesheetCount}-1就停了,永遠在前一個停穆役,這里請注意寸五。
很顯然,由于${timesheetCount}等于2耿币,我們的循環(huán)語句只會循環(huán)兩次梳杏,每次拿出一條記錄。上篇文章已經用firebug找到了工時記錄的xpath了:
它們的xpath分別為:
第一條://table/tbody/tr[1]
第二條://table/tbody/tr[2]
用xpath可以訪問數(shù)據(jù):比如第一條數(shù)據(jù)的訪問結果如下:
如果這里沒看懂的朋友請再復習下xpath的相關知識淹接。沒問題后我們在ObjectRepository -> Timesheet.html中為xpath聲明變量${locTSTable_Records_Fields}:
這里我在xpath后面加了/td十性,以便一會兒訪問數(shù)據(jù)。又寫了個可替換的||ROW NUMBER||塑悼,因為第一次循環(huán)||ROW NUMBER||是1劲适,第二次是2,以此類推:
第13行就是替換過程厢蒜,${i_string}是${i}的字符串形式霞势。上篇文章我們有一步避免了使用轉換,這次很不幸斑鸦,躲不過去了愕贡。${i}在循環(huán)里默認是整型的,是integer巷屿,而Replace String不能用整型替換字符串固以,所以要在第12行轉換一下。轉換操作的關鍵字是Convert To String嘱巾,參數(shù)就是一個integer憨琳,轉換完可以賦給一個字符串變量诫钓。在API文檔上我們還能看到ConvertTo Integer,Convert To Boolean等等栽渴,其實都是為了轉化設計的尖坤。
第13行第二列局部變量${locTSTable_Records_Fields_Row}存的是${locTSTable_Records_Fields}替換后的字符串,它的值在第一次循環(huán)執(zhí)行到這里時應該是//table/tbody/tr[1]/td闲擦,看到這兒你就知道為什么我當時把${i}的初值設置成1了吧慢味?可以通過循環(huán)變量把tr的角標索引巧妙賦值,因為每次循環(huán)讀一條記錄墅冷,其實就是讀一條xpath纯路。好,現(xiàn)在我要把這條記錄里的每列數(shù)據(jù)都讀入到list里寞忿,然后一個一個和搜索關鍵字Tester One對比驰唬,看有沒有一樣的。如果有就證明工時記錄里包含關鍵字腔彰,測試通過叫编,反之則失敗。有人說了霹抛,你傻啊搓逾,直接對比第一列姓名不就完了么?是這樣杯拐,有時候搜索功能并不在乎數(shù)據(jù)出現(xiàn)的位置霞篡,只要出現(xiàn)就算搜索成功。再一個端逼,我也通過這么一種較復雜的驗證過程給大家講講如何聲明和使用list朗兵。
右擊Pages -> Timesheet.html創(chuàng)建Keyword“Get All Timesheet Fields”,用來寫把數(shù)據(jù)讀到list的過程顶滩。它有一個參數(shù)叫${locTSTable_Records_Fields_Row_Current}余掖,這個參數(shù)指的是當前的某一行,也就是某個tr礁鲁。如果這是第一次循環(huán)盐欺,傳進來的值就是//table/tbody/tr[1]/td。
如下圖救氯,第1行創(chuàng)建了一個空的list,之前說過歌憨,list的前綴是“@”着憨,而創(chuàng)建list的關鍵字是Create List。如果想取每列數(shù)據(jù)還要用For循環(huán)語句進行遍歷务嫡,每條工時記錄是9列甲抖,我們完全可以用9+1=10作為循環(huán)終值漆改。可這樣不好准谚,因為如果開發(fā)人員以后每次加了一列或是減了一列那我們還得重新修改函數(shù)挫剑,很不方便,也不靈活柱衔。最好讓程序自動得知當前有多少列樊破,不要把它寫死。所以第2行我還是用Get Matching Xpath Count唆铐,得到這條記錄/tr的xpath里有多少個td哲戚,也就是多少列,賦給一個叫${fieldCount}的局部變量:
循環(huán)過程如下3-6步:
再看一遍這7列數(shù)據(jù)作為提示:
字有點小艾岂,不過還是能看清楚的顺少。這個例子中循環(huán)需要進行7次,但終值為8王浴,所以在第三行用${fieldCount}+1表示脆炎。總共7個數(shù)據(jù)氓辣∶朐#看到這里你會發(fā)現(xiàn)什么?我們還可以用循環(huán)變量${j}當td的角標索引筛婉。當前參數(shù)是//table/tbody/tr[1]/td簇爆,我們需要做的就是第4行的連接字符串。這里我們和上次連接字符串的情況不同爽撒,td和[${j}]之間不需要空格入蛆,所以需要加個Separator=來區(qū)分土全。不明白的Ctrl+ALT+Space打開API就懂了香璃。如果這是第一次循環(huán),第4步結束的結果就應該是${locTSTable_Records_Fields_Column_Current} = //table/tbody/tr[1]/td[1]椅亚。第5行就是用Get Text關鍵字對xpath進行簡單的取值源武,第一次循環(huán)得到“Tester One”扼褪。最后一步,得到的數(shù)據(jù)放到咱們之前聲明的list中粱栖,用到的關鍵字是Append to List话浇。這個關鍵字屬于一個名叫Collections的library,用之前請先引入ApplicationSpecific.html:
Append To List接受兩個參數(shù)闹究,第一個是目標list幔崖,這里的用${fieldList}表示;是第二個是要放進list的數(shù)據(jù)變量。有人問為什么${fieldList}不寫成@{fieldList}赏寇,它不是個List嗎吉嫩?注意,List只有在聲明和作為返回值的時候才用“@”表示嗅定,賦值過程把它當成一個變量來寫自娩。
7次循環(huán)過后,數(shù)據(jù)全部進入list渠退。然后返回list到之前的函數(shù)忙迁,我直接在Return Value那里寫了:
List返回之后就簡單了,直接看看包不包含搜索關鍵字唄智什,用的語句是List Should Contain Value动漾。在Search Timesheet By Employee Name中調用Get All Timesheet Fields:
List Should Contain Value也是個布爾函數(shù),判斷列表里有沒有目標數(shù)據(jù)荠锭。它有兩個參數(shù)旱眯,列表以及目標數(shù)據(jù)。有的話測試通過证九,沒有測試失敗删豺。
寫完這一步,整個程序的脈絡就清晰多了愧怜。首先對記錄進行循環(huán)呀页,每讀取一條記錄,就在第13行調用Get All Timesheet Fields傳入當前記錄的xpath拿到所有列拥坛,然后通過對列的循環(huán)取值放入list蓬蝶,最后看list里有沒有要搜索的文字。雖然復雜猜惋,但一切看起來都正確丸氛。
到現(xiàn)在只是做完搜索Tester One的,那另外三個員工呢著摔?還是讀文件那些東西缓窜,每次從文件里讀一個員工姓名以及期望的工時數(shù)目,然后調用Search Timesheet By Employee Name執(zhí)行剩下的搜索操作谍咆。再建一個Keyword叫Search Timesheet作為這一系列操作的總函數(shù)禾锤,代碼如下:
最后回到TCTIMES-1,在第7行和第8行加上總函數(shù)Search Timesheet摹察,這個test case就寫完了:
運行TCTIMES-1恩掷,測試通過。這就是關于工時表的第一個Test case供嚎,之后我會再帶著大家看一個例子黄娘。
這篇文章的源代碼在[Test10](https://github.com/cslm/cslm.robotframework/tree/master/Test10)里旦签。