2017-11-21 2 views
0

Ich versuche, Screenshots zu einem fehlgeschlagenen Testbericht hinzuzufügen. ich renne nach diesem Tutorial: http://toolsqa.com/selenium-webdriver/testng-reporters-asserts/'Reporterausgabe' ist leer im Testbericht

Meine Funktion

public static void onTestFailure(ITestContext tc, ITestResult result, WebDriver driver) { 
    Calendar calendar = Calendar.getInstance(); 
    SimpleDateFormat formater = new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss"); 
    String methodName = result.getName(); 
    File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 
    try { 
     String reportDirectory = new File(System.getProperty("user.dir")).getAbsolutePath() + "\\test-output\\" +tc.getSuite().getXmlSuite().getName(); 
     System.out.printf(reportDirectory); 
     File destFile = new File((String) reportDirectory+"\\failure_screenshots\\"+methodName+"_"+formater.format(calendar.getTime())+".png"); 
     FileUtils.copyFile(scrFile, destFile); 
     Reporter.log("<a href='"+ destFile.getAbsolutePath() + "'> <img src='"+ destFile.getAbsolutePath() + "' height='100' width='100'/> </a>"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Das Problem ist ttht Screenshot in der richtigen Stelle angezeigt wird, aber Link von Reporter.log wird nie zu 'Reporter Ausgabe' Ansicht.

Weiß jemand, was ich tun muss, damit es funktioniert?

Es ist Java-Projekt mit Maven

+0

Wo wird diese Methode aufgerufen: nach @ Test mit Annotationen oder in jedem mit @ attent annotierten Verfahren? –

+0

Es ist in @ AfterMethod annotierte Methode, ich habe dort wenn (result.FAILURE == result.getStatus()) und dann ruft Screenshot und Logging-Link – Pawel

+0

Reporter.logs funktionieren nur innerhalb @_Test annotierte Methoden. Um benutzerdefinierte Protokolle in den Bericht einzufügen, müssen Listener implementiert werden. Überprüfen Sie die folgenden Codefragmente. –

Antwort

0

Sie haben zu diesem Zweck Zuhörer zu verwenden. Erstellen Sie eine neue Klasse mit einem bestimmten Namen und erweitern Sie TestListenerAdapter. Überschreiben Sie die onTestFailure-Methode. Schreibe deinen Screenshot-Capture-Code hier.

public class ListenersEvents extends TestListenerAdapter { 
    @Override 
     public void onTestFailure(ITestResult result) { 
      Object currentClass = result.getInstance(); 
      WebDriver webDriver = ((browserSetup) currentClass).getActiveObject(); 


      if (!result.isSuccess()) { 
         Reporter.log("Test Result: FAIL",true); 
        takeScreenshotOfFailureFromLocalMachine(result,webDriver); 

       } else { 
        Reporter.log("Test Result: PASS",true); 
       } 
     } 


} 

Der einzige schwierige Teil ist, wie Sie den Treiber Objektverweis auf die Listener-Klasse vorbei wird. Also habe ich eine Getter-Methode in der Klasse hinzugefügt, in der der Treiber instanziiert wird, um ein aktives Treiberobjekt zu erhalten.

public class browserSetup{ 
     WebDriver driver; 

     public WebDriver createFirefoxDriver(){ 
// set path for geckodriver 
     return new FirefoxDriver(); 
     } 
public WebDriver createChromeDriver(){ 
//set path for chrome driver 
     return new ChromeDriver(); 
     } 

     public WebDriver getActiveObject() { 
       return this.driver; 
      } 
    }