/*
* JBoss, Home of Professional Open Source.
* Copyright 2010, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.gatein.selenium;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.SeleniumException;
/**
* The listener interface for receiving AbstractTestCase events. The class that is interested in processing a AbstractTestCase
* event implements this interface, and the object created with that class is registered with a component using the component's
* <code>addTestCaseFailListener<code> method. When
* the AbstractTestCase event occurs, that object's appropriate
* method is invoked. <br/>
* TestCaseFailListener is responsible for decoding most of the parameters which are passed to selenium tests.
* <table>
* <thead>
* <tr>
* <th>parameter name</th>
* <th>valid values</th>
* <th>default value</th>
* <th>description</th>
* </tr>
* </thead>
* <tr>
* <td>screenshot</td>
* <td>true/false</td>
* <td>false</td>
* <td>If true, screenshots are taken after the test failure. They are saved into directory specified by the "output-dir" parameter.</td>
* </tr><tr>
* <td>html-src</td><td>true/false</td><td>false</td><td>If true, html sources are taken after the test failure. They are saved into directory specified by the "output" parameter.</td>
* </tr><tr>
* <td>output-dir</td><td><path-to-dir></td><td>""</td><td>Path to the directory where html sources and screenshots are saved.</td>
* </tr>
* </table>
*/
public class TestCaseFailListener extends TestListenerAdapter {
public static Selenium selenium;
protected static int count;
protected static boolean screenshot = false;
protected static boolean htmlSource = false;
protected static String outputDir = "";
static {
String ss = System.getProperty("screenshot");
if ("true".equals(ss)) {
screenshot = true;
}
String sh = System.getProperty("html-src");
if ("true".equals(sh)) {
htmlSource = true;
}
String so = System.getProperty("output-dir");
if (so != null) {
outputDir = so;
}
}
/*
* (non-Javadoc)
*
* @see org.testng.TestListenerAdapter#onTestFailure(org.testng.ITestResult)
*/
@Override
public void onTestFailure(ITestResult tr) {
String name = outputDir + "/" + "F_" + tr.getName() + "-" + count;
if (screenshot) {
try {
selenium.windowMaximize();
waitFor(5000);
selenium.captureScreenshot(name + ".jpg");
} catch (SeleniumException e2) {
e2.printStackTrace();
}
}
if (htmlSource) {
try {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(name + ".html")));
out.println(selenium.getHtmlSource());
out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
count++;
}
/**
* Waits for specified time in ms. Used mostly in AJAX based tests.
*
* @param time the time (in ms) to be waited for.
*/
public void waitFor(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void captureScreenshot(String testName) {
String name = outputDir + "/" + "F_" + testName;
if (screenshot) {
try {
selenium.captureScreenshot(name + ".jpg");
} catch (SeleniumException e) {
e.printStackTrace();
}
}
}
}