弄清楚如何使用TestNG获取有关测试失败的屏幕截图

时间:2018-02-18 01:11:33

标签: java selenium-webdriver testng screenshot webpage-screenshot

好的,我已经对这个主题进行了很多研究并尝试了多种解决方案来解决我的问题,但我似乎一直陷入困境。我正在尝试使用我的RetryAnalyzer类在达到最大重试次数后设置一般的TakeScreenshot。但是,在添加驱动程序时,我不断受到ClasscastExceptions的攻击,而且我在如何在Base Test中初始化相同的驱动程序时遇到问题(除了设置为静态)。以下是我为截图捕获设置的类:

驱动程序类:

public class Driver implements WebDriver {

protected WebDriver driver;
String browserName;
public static JavascriptExecutor js;


    public Driver (String browserName) {
    this.browserName = browserName;
    if(browserName.equalsIgnoreCase("chrome")) {
        System.setProperty("webdriver.chrome.driver", "./resources/webdrivers/chromedriver_win32/chromedriver.exe");
        this.driver = new ChromeDriver();
        js = (JavascriptExecutor) this.driver;
    }
    // Other methods for different browsers

BaseTest(开始部分):

@Listeners({TestMethodListener.class, ScreenshotListstener.class})
public class BaseTest {
protected Driver driver;
DummyTestAccount dummyAccount = new DummyTestAccount();
String browserName = getParamater("browser");


 @BeforeClass(alwaysRun = true)
 public void setUp() {

  driver = new Driver(browserName);
  driver.manage().window().maximize();
  }

  private String getParamater(String name) {
  String value = System.getProperty(name);
  if(value == null) {
      throw new RuntimeException(name + "missing parameter");
  }
  return value;
  }

  //Further setup for my extended test classes

RetryAnalyzer:

   public class RetryAnalyzer extends BaseTest implements IRetryAnalyzer {
   int count = 0;
   private static int maxTry = 1;
   ScreenshotListstener picCapture = new ScreenshotListstener();

   public boolean retry(ITestResult arg0) {
    if(count < maxTry) {
        count++;
        return true; //Retry for flaky tests with unexpected variables 
    } else {

        picCapture.onTestFailure(driver, arg0);
        return false; //Don't retry the failed test Capture Screenshot.
    }
   }

截图类:

  public class ScreenshotListstener extends TestListenerAdapter {


    public void onTestFailure(Driver driver, ITestResult result) {
    Calendar calendar = Calendar.getInstance();
    String methodName = result.getMethod().getMethodName();
    SimpleDateFormat formater = new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss");

        File bugPic = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

        try {
            Files.copy(bugPic, new File("./target/surefire-reports/error-pics/"+ methodName + "_" +formater.format(calendar.getTime()) + ".png"));
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

目前使用此设置,我在使用bugPic文件实例进行初始化时会在ScreenshotListener类中发生NullPointerException。有什么东西我不见了吗?这个当前的设置是否会遵循测试框架的良好实践?

任何建议都有帮助。

感谢。

(更新):

感谢Grasshopper的建议,弄清楚了我的问题。

驱动程序类:

public class Driver implements WebDriver {

protected WebDriver driver;
String browserName;
public static JavascriptExecutor js;
public TakesScreenshot bugCapture;

    public Driver (String browserName) {
    this.browserName = browserName;
    if(browserName.equalsIgnoreCase("chrome")) {
        System.setProperty("webdriver.chrome.driver", "./resources/webdrivers/chromedriver_win32/chromedriver.exe");
        this.driver = new ChromeDriver();
        js = (JavascriptExecutor) this.driver;
        bugCapture = (TakesScreenshot)driver;
    }
    // Other methods for different browsers

BaseTest(开始部分):

@Listeners({TestMethodListener.class, ScreenshotListstener.class})
public class BaseTest {
protected Driver driver;
public static final ThreadLocal<Driver> driverThread = new ThreadLocal<Driver>();
DummyTestAccount dummyAccount = new DummyTestAccount();
String browserName = getParamater("browser");


 @BeforeClass(alwaysRun = true)
 public void setUp() {

  driver = new Driver(browserName);
  driver.manage().window().maximize();
  driverThread.set(driver);
  }

  private String getParamater(String name) {
  String value = System.getProperty(name);
  if(value == null) {
      throw new RuntimeException(name + "missing parameter");
  }
  return value;
  }

  //Further setup for my extended test classes

RetryAnalyzer:

   public class RetryAnalyzer extends BaseTest implements IRetryAnalyzer {
   int count = 0;
   private static int maxTry = 1;
   ScreenshotListstener picCapture = new ScreenshotListstener();

   public boolean retry(ITestResult arg0) {
    if(count < maxTry) {
        count++;
        return true; //Retry for flaky tests with unexpected variables 
    } else {

        picCapture.onTestFailure(driverThread.get(), arg0);
        return false; //Don't retry the failed test Capture Screenshot.
    }
   }

截图类:

  public class ScreenshotListstener extends TestListenerAdapter {


    public void onTestFailure(Driver driver, ITestResult result) {
    Calendar calendar = Calendar.getInstance();
    String methodName = result.getMethod().getMethodName();
    SimpleDateFormat formater = new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss");

        File bugPic = driver.bugCapture.getScreenshotAs(OutputType.FILE);

        try {
            Files.copy(bugPic, new File("./target/surefire-reports/error-pics/"+ methodName + "_" +formater.format(calendar.getTime()) + ".png"));
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

0 个答案:

没有答案