WebDriver 之測試失敗自動截圖

發表于:2012-08-24來源:test China作者:lihuazhang點擊數: 標簽:WebDriver
webDriver 測試的時候最頭疼的就是調試。 但也遠不及運行的時候出錯,再回頭調試來的痛苦??偹苤?, web 自動化的代碼都非常脆弱,一份代碼一會運行失敗,一會運行成功也是很正常的事情??偟膩碚f造成案例運行失敗的原因大抵有兩點:

  webDriver 測試的時候最頭疼的就是調試。 但也遠不及運行的時候出錯,再回頭調試來的痛苦??偹苤?, web 自動化的代碼都非常脆弱,一份代碼一會運行失敗,一會運行成功也是很正常的事情??偟膩碚f造成案例運行失敗的原因大抵有兩點:

  環境問題: 比如網絡不穩定啊

  代碼變動: 比如某個元素不在

  遇到 bug :這就是真的發現 bug

  無論哪一種,遇到了都需要花一番時間去 debug。那如果這個時候有一張運行時候出錯的截圖,那就一目了然了。(即便不一目了然,也有很多幫助)

  在運行出錯的時候,捕獲錯誤并截圖有兩種思路:

  自定義一個 WeDdriver 的監聽器,在出異常的時候截圖。

  利用 Juint 的 TestRule, 自定義一個 Rule 在運行失敗的時候截圖。

  自定義監聽器

  截圖的原理

  截圖需要用到 RemoteWebDriver。在 Selenium 官方我們可以找到:

  One nice feature of the remote

  webdriver is that exceptions often

  have an attached screen shot, encoded

  as a Base64 PNG. In order to get this

  screenshot, you need to write code

  similar to:

  public String extractScreenShot(WebDriverException e) {

  Throwable cause = e.getCause();

  if (cause instanceof ScreenshotException) {

  return ((ScreenshotException) cause).getBase64EncodedScreenshot();

  }

  return null;

  }

  意思就是說,每個異常都是 ScreenshotException 的對象,轉碼一下就可以用了。這是截圖的本質。

  import java.io.File;

  import java.io.FileOutputStream;

  import java.io.IOException;

  import java.text.SimpleDateFormat;

  import java.util.Date;

  import org.openqa.selenium.WebDriver;

  import org.openqa.selenium.internal.Base64Encoder;

  import org.openqa.selenium.remote.ScreenshotException;

  import org.openqa.selenium.support.events.AbstractWebDriverEventListener;

  /**

  * This is an customized webdriver event listener.

  * Now it implements onException method: webdriver will take a screenshot

  * when it meets an exception. It's good but not so usable. And when we use

  * WebDriverWait to wait for an element appearing, the webdriver will throw

  * exception always and the onException will be excuted again and again, which

  * generates a lot of screenshots.

  * Put here for study

  * Usage:

  * WebDriver driver = new FirefoxDriver();

  * WebDriverEventListener listener = new CustomWebDriverEventListener();

  * return new EventFiringWebDriver(driver).register(listener);

  *

  * @author qa

  *

  */

  public class CustomWebDriverEventListener extends

  AbstractWebDriverEventListener {

  @Override

  public void onException(Throwable throwable, WebDriver driver) {

  Throwable cause = throwable.getCause();

  if (cause instanceof ScreenshotException) {

  SimpleDateFormat formatter = new SimpleDateFormat(

  "yyyy-MM-dd-hh-mm-ss");

  String dateString = formatter.format(new Date());

  File of = new File(dateString + "-exception.png");

  FileOutputStream out = null;

  try {

  out = new FileOutputStream(of);

  out.write(new Base64Encoder()

  .decode(((ScreenshotException) cause)

  .getBase64EncodedScreenshot()));

  }

  catch (Exception e) {

  e.printStackTrace();

  }

  finally {

  try {

  out.close();

  }

  catch (IOException e) {

  e.printStackTrace();

  }

  }

  }

  }

  }

  主要看 onException 這個方法的實現,很明顯, 我們捕獲了這個異常, 然后通過強制轉換將圖片提取出來,寫入硬盤。

  然后就是使用這個監聽器, 通常會在 setup 方法里面將這個監聽器注冊到 WebDriver 中去, 看代碼:

  @Test

  public void setup(){

  String remote_driver_url = "http://localhost:4444/wd/hub";

  DesiredCapabilities capability = null;

  capability = DesiredCapabilities.firefox();

  WebDriverEventListener eventListener = new CustomWebDriverEventListener ();

  WebDriver driver = new EventFiringWebDriver(new RemoteWebDriver(new URL(

  remote_driver_url), capability)).register(eventListener);

  }

  在這之后,如果運行出錯, WebDriver 拋出異常就會在相應的 classpath 下面生成 png 的截圖。

  自定義 TestRule

  和自定義 WebDriver 監聽器不同, 自定義 TestRule 只有在這個 Rule 被執行的時候, 才去做一些我們預設的 CallBack。 所以這個截圖動作,對于 WebDriver 而言, 是主動的。 那么,我們就需要自定義一個 RemoteWebDriver 來實現截圖功能。 WebDriver 自身提供了 TakesScreenshot 這個接口, 我們只要實現它就可以了, 看代碼:

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97