[英]Selenium run as a Windows service to take screenshots on errors
我想基於Selenium RC的自動化Web測試套件在遇到一些錯誤時截取頁面的屏幕截圖。 測試套件是持續集成過程的一部分,技術上由作為Windows服務運行的CruiseControl執行。
調用selenium.captureScreenshot()
方法來觸發實際的屏幕截圖。 我已經注冊了一個JUnit RunListener
來在任何測試失敗時調用它。
問題是屏幕截圖只是空白文件 - PNG文件全黑。 尺寸為1440x900。
當從Eclipse手動運行相同的測試時,截圖是可以的(雖然它們是整個桌面的截圖而不是瀏覽器窗口,但這是一個不同的故事和一個小問題)。 所以我猜問題的原因是Selenium作為Windows服務運行。
當Selenium測試中發生異常時,如何獲取頁面截圖?
使用的軟件:
看起來有一個完全不同的答案。 Windows服務(由TanukiSoftware Java Service Wrapper管理)啟動時將wrapper.ntservice.interactive
設置為false
。 將其設置為true
有幫助。 最終截圖包含真實的屏幕內容。
有關詳細信息,請參閱wrapper.ntservice.interactive
。 對包裝器代碼的分析導致在啟動Windows服務時設置[ SERVICE_INTERACTIVE_PROCESS
]( http://msdn.microsoft.com/en-us/library/ms683502 ( VS.85).aspx)標志。
您在哪些瀏覽器中運行這些測試? 如果是Firefox,我建議使用captureEntirePageScreenshot捕獲整個畫布 - 不僅僅是視圖中的內容(而不是屏幕)和captureEntirePageScreenshotToString,如果您正在遠程工作並希望在本地保存文件。
不確定它是否會對您的問題有所幫助,但因為它使用Firefox的附加組件,所以值得一試。
閱讀更多內容,可能與需要額外安全權限的Windows服務有關。 回到Windows NT 3.5 / 4服務限制了對應用程序桌面的訪問 (屏幕截圖所需),我猜他們的安全限制一直持續到今天。
關於java.net論壇上的服務的這個主題可能會提供讓它運行所需的線索。
我遇到了CaptureScreenshot在Windows服務下運行時生成黑色圖像的問題。
使用Dave Hunt推薦的CaptureEntirePageScreenshot對我來說一直在努力。
以下是使用Selenium和Java Robot類拍攝照片的一些代碼:
public void takeAScreenShotOfTheApp() {
Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle screenBounds = new Rectangle(0, 0, screenDim.width, screenDim.height);
Robot robot = new Robot();
BufferedImage image = robot.createScreenCapture(screenBounds);
File screenshotFile = new File("target" + File.separator
+ "image" + System.currentTimeMillis() + ".png");
ImageIO.write(image, "png", screenshotFile);
}
它來自這個網站
我不知道巡航控制將如何執行GUI測試,但我最近自己實現了一個截圖機制,我學到的是你繪制的組件必須在窗口或其他根元素中。 “無根”元素將無法正確繪制,並且大部分時間都會產生黑色圖像。
因此,如果巡航控制或您的單元測試使用一些魔法來正確顯示gui元素,您可能希望在繪制之前將它們添加到虛擬JFrame中。
RunListener方法的替代解決方案:
將您的測試包含在try-catch塊中,並在catch塊中執行屏幕截圖,這就是我一直以來所做的。
示例java代碼:
public void testEnterFormFields()
try {
enterFormFields();
} catch(SeleniumException e) {
//do screenshot, logging, dumping, stacktracing or whatever here
}
}
如果您的編碼規則允許,您也可以捕獲Throwable或Exception,但是逐個捕獲特定的Exception是有意義的。 這種方法會在代碼中產生更多的混亂,但在故障分析的情況下它會對您有所幫助。 您可以根據錯誤類型定制異常處理。 您可能希望在AssertionError的情況下捕獲其他信息,而不是SeleniumException。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.