TeamCity編譯執行selenium上傳窗口腳本缺陷

     2015-07-04 18:05 編寫本文java

  TeamCity編譯selenium腳本,對於上傳窗口處理只支持sendKeys的使用,不支持模擬人爲按下Enter鍵和使用autoIt等操做,即便本地調試經過的腳本,提交編譯執行後,也是報錯,緣由是teamCity編譯執行腳本的過程當中,只是後臺啓動相應瀏覽器的driver,和瀏覽器對應的進程,沒有和人爲操做同樣的真實在前臺打開一個瀏覽器界面致使的。發現這個缺陷還得從編寫上傳課件測試用例腳本提及。api

    一個上傳課程測試用例,功能測試是,填寫課程的基本信息後,上傳課程的圖片,如圖1,圖片上傳成功後,系統會提示「圖片上傳成功」,而後點擊【選擇】按鈕,如圖2,在彈出的窗口中選擇須要做爲課程課件的文件後,點擊【打開】按鈕或者直接按Enter鍵,便可選擇文件,以下圖3,課件資源上傳成功後,系統會彈出一個蒙板層,告訴課程資源上傳成功
圖1
圖2
 
 
圖3
    爲了實現課件圖片和資源的上傳,我一開始打算都用sendKeys,而後發現上傳圖片是成功,上傳課件失敗,由於公司的上傳課件是使用網絡開源控件,因此上傳文件不支持selenium的api之sendKeys的使用,因而我就換了思路,準備模擬功能測試操做:
  1.  點擊界面【選擇】按鈕
  2. 在彈出的窗口使用javaAPI之Robot,模擬鍵盤按下Ctrl+V,粘貼課件資源路徑
  3. 再按下Enter鍵,實現了課件的上傳
  4. 判斷此時系統是否有彈出蒙板(ps:此處只要判斷窗口中是否有蒙板中特有的文字出現便可)
  操做的步驟的腳本以下
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);//清空系統剪切板
    Transferable tText = new StringSelection(writeMe);  //將文件路徑複製到系統剪切板
    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);
}
    腳本寫完後,就是運行調試,很好,本地執行這個步驟的腳本運行ok,很開心,因而提交腳本到公司的svn,而後就是teamCity去編譯我提交的腳本,這裏說明下,teamCity在編譯的過程當中是會根據我腳本中指定的瀏覽器類型,打開相應的driver去執行腳本的,此時編譯過程當中是不會打開真實的瀏覽器,不過發如今teamCity編譯的過程上傳圖片步驟經過,可是上傳課件資源步驟報錯了,錯誤日誌顯示腳本在Assert.assertTrue(driver.getPageSource().contains("上傳課件成功!"))報錯了,這種狀況出現的緣由是上傳課件步驟沒有成功,因此找不到蒙板層中的字符串,因而我就以爲奇怪,理論上本機調試ok的腳本,在teamCity編譯執行的過程當中是不會有錯誤的,因而爲了排除是網絡延遲致使的,我加長了sleep的時間,發現仍是報同樣的錯誤,此時我懷疑是否是teamCity在編譯執行的的過程當中不支持 Robot的模擬操做,因而我就換了思路,藉助autoIt3這個工具。
    使用autoIt3直接寫了一個小腳本並轉換成可執行的.exe文件,這個腳本的做用就是在彈出上傳窗口的時候,在窗口中輸入文件路徑並點擊窗口【打開】鍵,因而腳本就變成了下面這個
driver.findElement(By.xpath("//ul/li[5]/div[1]/label/div/object")).click();//點擊【選擇】按鈕
Runtime.getRuntime().exec("d:1.exe");//執行.exe文件上傳課件
Assert.assertTrue(driver.getPageSource().contains("上傳課件成功!"));判斷是否有上傳課件成功提示字符串
  而後接着本地調試能夠運行經過,可是提交teamCity編譯仍是報錯,這個時候我就排除了以前的想法「teamCity在編譯執行的的過程當中不支持Robot的模擬操做」這個假設。
    這個時候我又懷疑是否是teamCity編譯執行的時候沒有打開真實的瀏覽器,致使我上傳課件資源失敗,爲了證實個人假設,我把上傳課程圖片腳本也是改爲了使用模擬鍵盤複製粘貼操做並結合Enter鍵盤來實現,不用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");//執行.exe文件上傳課件
Assert.assertTrue(driver.getPageSource().contains("上傳課件成功!"));//判斷是否有上傳課件成功提示字符串
  果真teamCity在編譯的時候就報錯了,找不到「圖片上傳成功」這個字符串的,這個時候我就肯定了個人假設「 TeamCity編譯selenium腳本,對於上傳窗口處理只支持sendKeys的使用,不支持模擬人爲按下Enter鍵和使用autoIt等操做」這個假設
 
  2015-07-17 18:05 有了新發現
 
  在上次發現後,爲了繼續證實是teamCity沒有在前臺打開一個瀏覽器,致使運行失敗而不是腳本自己有問題,我直接經過遠程鏈接到服務器,經過cmd的方式啓動個人腳本:mvn test,以下圖,發現執行過程當中能夠彈出瀏覽器而且結果是正確的
 
  我很奇怪爲何會這樣,因而我觀察了當人爲啓動項目腳本,自動打開一個瀏覽器的時候,任務管理器中瀏覽器的進程用戶名當前系統用戶,如圖1;當teamCity編譯腳本打開瀏覽器的時候,任務管理器中瀏覽器的進程用戶名爲空或者爲system,如圖2
圖1
圖2
  因而我猜想是否是在teamCity編譯腳本的時候,打開瀏覽器的權限不足致使的,由於人爲啓動腳本和teamCity編譯自動啓動腳本,在任務管理器中一樣的進程用戶名不一樣,不過,思考下就否認了這個,由於人爲啓動腳本,是我經過賬號遠程到服務器,因而打開瀏覽器進程的用戶名天然就是我正在使用的賬號名xxy,可是teamCity編譯的時候,teamCity已經安裝在服務器上了,因此啓動瀏覽器進程天然就是system了。
  對於這個問題,我仍是在探索中,若是你有答案,能夠給我評論留言
 
若是本文對你有幫助,可考慮自願爲做者打賞或捐助
 
相關文章
相關標籤/搜索