簡體   English   中英

Selenium作為Windows服務運行,以捕獲錯誤的屏幕截圖

[英]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 2003 Server
  • 硒1.0.1

看起來有一個完全不同的答案。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM