您的位置:軟件測試 > 開源軟件測試 > 開源功能測試工具 > Selenium
TeamCity編譯執(zhí)行Selenium上傳窗口腳本缺陷
作者:網絡轉載 發(fā)布時間:[ 2015/7/14 9:50:30 ] 推薦標簽:功能測試工具

  TeamCity編譯selenium腳本,對于上傳窗口處理只支持sendKeys的使用,不支持模擬人為按下Enter鍵和使用autoIt等操作,即使本地調試通過的腳本,提交編譯執(zhí)行后,也是報錯,原因是teamCity編譯執(zhí)行腳本的過程中,只是后臺啟動相應瀏覽器的driver,和瀏覽器對應的進程,沒有和人為操作一樣的真實打開一個瀏覽器界面導致的。發(fā)現(xiàn)這個缺陷還得從編寫上傳課件測試用例腳本說起。
  一個上傳課程測試用例,功能測試是,填寫課程的基本信息后,上傳課程的圖片,如圖1,圖片上傳成功后,系統(tǒng)會提示“圖片上傳成功”,然后點擊【選擇】按鈕,如圖2,在彈出的窗口中選擇需要作為課程課件的文件后,點擊【打開】按鈕或者直接按Enter鍵,即可選擇文件,如下圖3,課件資源上傳成功后,系統(tǒng)會彈出一個蒙板層,告訴課程資源上傳成功

  為了實現(xiàn)課件圖片和資源的上傳,我一開始打算都用sendKeys,然后發(fā)現(xiàn)上傳圖片是成功,上傳課件失敗,因為公司的上傳課件是使用網絡開源控件,所以上傳文件不支持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("上傳課件成功"));//判斷是否有上傳課件成功提示字符串
/**
* 復制數據到剪切板并粘貼出來
* @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);
}
  腳本寫完后,是運行調試,很好,本地執(zhí)行這個步驟的腳本運行ok,很開心,于是提交腳本到公司的svn,然后是teamCity去編譯我提交的腳本,這里說明下,teamCity在編譯的過程中是會根據我腳本中指定的瀏覽器類型,打開相應的driver去執(zhí)行腳本的,此時編譯過程中是不會打開真實的瀏覽器,不過發(fā)現(xiàn)在teamCity編譯的過程上傳圖片步驟通過,但是上傳課件資源步驟報錯了,錯誤日志顯示腳本在Assert.assertTrue(driver.getPageSource().contains("上傳課件成功!"))報錯了,這種情況出現(xiàn)的原因是上傳課件步驟沒有成功,所以找不到蒙板層中的字符串,于是我覺得奇怪,理論上本機調試ok的腳本,在teamCity編譯執(zhí)行的過程中是不會有錯誤的,于是為了排除是網絡延遲導致的,我加長了sleep的時間,發(fā)現(xiàn)還是報一樣的錯誤,此時我懷疑是不是teamCity在編譯執(zhí)行的的過程中不支持Robot的模擬操作,于是我換了思路,借助autoIt3這個工具。
  使用autoIt3直接寫了一個小腳本并轉換成可執(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("上傳課件成功!"));判斷是否有上傳課件成功提示字符串
  然后接著本地調試可以運行通過,但是提交teamCity編譯還是報錯,這個時候我排除了之前的想法“teamCity在編譯執(zhí)行的的過程中不支持Robot的模擬操作”這個假設。
  這個時候我又懷疑是不是teamCity編譯執(zhí)行的時候沒有打開真實的瀏覽器,導致我上傳課件資源失敗,為了證明我的假設,我把上傳課程圖片腳本也是改成了使用模擬鍵盤復制粘貼操作并結合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等操作”這個假設

軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd