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