TeamCity編譯selenium腳本,對于上傳窗口處理只支持sendKeys的使用,不支持模擬人為按下Enter鍵和使用autoIt等操作,即使本地調(diào)試通過的腳本,提交編譯執(zhí)行后,也是報錯,原因是teamCity編譯執(zhí)行腳本的過程中,只是后臺啟動相應瀏覽器的driver,和瀏覽器對應的進程,沒有和人為操作一樣的真實打開一個瀏覽器界面導致的。發(fā)現(xiàn)這個缺陷還得從編寫上傳課件測試用例腳本說起。
一個上傳課程測試用例,功能測試是,填寫課程的基本信息后,上傳課程的圖片,如圖1,圖片上傳成功后,系統(tǒng)會提示“圖片上傳成功”,然后點擊【選擇】按鈕,如圖2,在彈出的窗口中選擇需要作為課程課件的文件后,點擊【打開】按鈕或者直接按Enter鍵,即可選擇文件,如下圖3,課件資源上傳成功后,系統(tǒng)會彈出一個蒙板層,告訴課程資源上傳成功
為了實現(xiàn)課件圖片和資源的上傳,我一開始打算都用sendKeys,然后發(fā)現(xiàn)上傳圖片是成功,上傳課件失敗,因為公司的上傳課件是使用網(wǎng)絡開源控件,所以上傳文件不支持selenium的api之sendKeys的使用,于是我換了思路,準備模擬功能測試操作:
點擊界面【選擇】按鈕
在彈出的窗口使用javaAPI之Robot,模擬鍵盤按下Ctrl+V,粘貼課件資源路徑
再按下Enter鍵,實現(xiàn)了課件的上傳
判斷此時系統(tǒng)是否有彈出蒙板(ps:此處只要判斷窗口中是否有蒙板中特有的文字出現(xiàn)即可)
操作的步驟的腳本如下
driver.findElement(By.id("updatePicId")). sendKeys("D:1.jpg");//上傳圖片
Assert.assertTrue(driver.getPageSource().contains("上傳圖片成功"));//判斷是否有上傳圖片成功提示字符串
driver.findElement(By.xpath("//ul/li[5]/div[1]/label/div/object")).click();//點擊【選擇】按鈕
this.useSysClipboard("D:1.mp4");//將要上傳的文件路徑復制到剪切板然后粘貼出來并按下Enter鍵
Assert.assertTrue(driver.getPageSource().contains("上傳課件成功"));//判斷是否有上傳課件成功提示字符串
/**
* 復制數(shù)據(jù)到剪切板并粘貼出來
* @param writeMe
* @throws java.awt.AWTException
*/
public void useSysClipboard(String writeMe) throws AWTException {
Sleeper.sleepTight(800);
Robot robot=new Robot();
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
clip.setContents(new StringSelection(""), null);//清空系統(tǒng)剪切板
Transferable tText = new StringSelection(writeMe); //將文件路徑復制到系統(tǒng)剪切板
clip.setContents(tText, null);
robot.keyPress(KeyEvent.VK_CONTROL);//模擬按ctrl鍵
robot.keyPress(KeyEvent.VK_V);//模擬按v鍵
Sleeper.sleepTight(500);
robot.keyRelease(KeyEvent.VK_V);//模擬釋放v鍵
robot.keyRelease(KeyEvent.VK_CONTROL);//模擬釋放ctrl鍵
Sleeper.sleepTight(500);
robot.keyPress(KeyEvent.VK_ENTER);//模擬按Enter鍵
Sleeper.sleepTight(500);
}
腳本寫完后,是運行調(diào)試,很好,本地執(zhí)行這個步驟的腳本運行ok,很開心,于是提交腳本到公司的svn,然后是teamCity去編譯我提交的腳本,這里說明下,teamCity在編譯的過程中是會根據(jù)我腳本中指定的瀏覽器類型,打開相應的driver去執(zhí)行腳本的,此時編譯過程中是不會打開真實的瀏覽器,不過發(fā)現(xiàn)在teamCity編譯的過程上傳圖片步驟通過,但是上傳課件資源步驟報錯了,錯誤日志顯示腳本在Assert.assertTrue(driver.getPageSource().contains("上傳課件成功!"))報錯了,這種情況出現(xiàn)的原因是上傳課件步驟沒有成功,所以找不到蒙板層中的字符串,于是我覺得奇怪,理論上本機調(diào)試ok的腳本,在teamCity編譯執(zhí)行的過程中是不會有錯誤的,于是為了排除是網(wǎng)絡延遲導致的,我加長了sleep的時間,發(fā)現(xiàn)還是報一樣的錯誤,此時我懷疑是不是teamCity在編譯執(zhí)行的的過程中不支持Robot的模擬操作,于是我換了思路,借助autoIt3這個工具。
使用autoIt3直接寫了一個小腳本并轉(zhuǎn)換成可執(zhí)行的.exe文件,這個腳本的作用是在彈出上傳窗口的時候,在窗口中輸入文件路徑并點擊窗口【打開】鍵,于是腳本變成了下面這個
driver.findElement(By.xpath("//ul/li[5]/div[1]/label/div/object")).click();//點擊【選擇】按鈕
Runtime.getRuntime().exec("d:1.exe");//執(zhí)行.exe文件上傳課件
Assert.assertTrue(driver.getPageSource().contains("上傳課件成功!"));判斷是否有上傳課件成功提示字符串
然后接著本地調(diào)試可以運行通過,但是提交teamCity編譯還是報錯,這個時候我排除了之前的想法“teamCity在編譯執(zhí)行的的過程中不支持Robot的模擬操作”這個假設。
這個時候我又懷疑是不是teamCity編譯執(zhí)行的時候沒有打開真實的瀏覽器,導致我上傳課件資源失敗,為了證明我的假設,我把上傳課程圖片腳本也是改成了使用模擬鍵盤復制粘貼操作并結(jié)合Enter鍵盤來實現(xiàn),不用sendKeys,腳本修改如下
driver.findElement(By.id("updatePicId")).click();//點擊【上傳圖片】按鈕
this.useSysClipboard("D:1.jpg");//通過復制粘貼方式上傳圖片
Assert.assertTrue(driver.getPageSource().contains("上傳圖片成功"));//判斷是否有上傳圖片成功提示字符串
driver.findElement(By.xpath("//ul/li[5]/div[1]/label/div/object")).click();//點擊【選擇】按鈕
Runtime.getRuntime().exec("d:1.exe");//執(zhí)行.exe文件上傳課件
Assert.assertTrue(driver.getPageSource().contains("上傳課件成功!"));//判斷是否有上傳課件成功提示字符串
果然teamCity在編譯的時候報錯了,找不到“圖片上傳成功”這個字符串的,這個時候我確定了我的假設“ TeamCity編譯selenium腳本,對于上傳窗口處理只支持sendKeys的使用,不支持模擬人為按下Enter鍵和使用autoIt等操作”這個假設