2013-07-12 48 views
4

我有一個將作爲非靜態變量調用驅動程序的測試用例。我還在我的測試用例中添加了截圖監聽器。當測試用例失敗時該控件會自動發送給截圖監聽器...但是由於我的驅動程序是非靜態變量,因此無法在截圖偵聽器中訪問該變量。所以我得到了空指針異常。TestNG中的非靜態驅動程序和屏幕截圖監聽器

有沒有一種方法可以全局訪問截圖監聽器中的非靜態驅動程序?

我的測試用例:

@Test 
public void testCase() { 
    //non-static driver is initialized 
} 

我的截圖聽衆:

public class ScreenshotListener extends TestListenerAdapter 
{ 
    @Override 
    public void onTestFailure(ITestResult testResult) { 
     //driver needs to be accessed here 
    } 
} 

回答

0

如果您有什麼訪問你的驅動程序的任何地方意味着,你有你的驅動器參考作爲參數到處傳遞給爲您執行流程如下,

// i assume onTestFailure method has been called explicitly. 

@Test 
public void testCase() 
{ 
    Webdriver driver=XXXXDriver(); 
    try 
    { 
     // your tests 
    } 
    catch(Exception e) 
    { 
     onTestFailure(new ITestResult(),driver) 
    } 

public class ScreenshotListener extends TestListenerAdapter 
{ 

    @Override 
    public void onTestFailure(ITestResult testResult,Webdriver driver) 
    { 
     // you can access your driver here 
    } 
} 
9

你不必通過驅動程序或調用o n測試中的testfailure(事實上這打敗了測試聽衆);

以下將實現聽衆截圖而不需要傳遞驅動程序;

  1. 所有測試類都必須擴展一個簡單的基礎測試類;

    public asbtract baseTestCase() { 
    
        private WebDriver driver; 
    
        public WebDriver getDriver() { 
          return driver; 
    } 
    
        @BeforeMethod 
        public void createDriver() { 
          Webdriver driver=XXXXDriver(); 
        } 
    
        @AfterMethod 
         public void tearDownDriver() { 
         if (driver != null) 
         { 
           try 
           { 
            driver.quit(); 
           } 
           catch (WebDriverException e) { 
            System.out.println("***** CAUGHT EXCEPTION IN DRIVER TEARDOWN *****"); 
            System.out.println(e); 
           } 
    
         } 
        } 
    
  2. 在你的監聽器中,你需要訪問基類;

公共類ScreenshotListener擴展TestListenerAdapter {

@Override 
public void onTestFailure(ITestResult result) 
{ 
     Object currentClass = result.getInstance(); 
     WebDriver webDriver = ((BaseTest) currentClass).getDriver(); 

     if (webDriver != null) 
     { 

      File f = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE); 

      //etc. 
     } 
} 

您的測試現在不知道一個screenshgot甚至被捕獲並可以通過聽者的加入來控制。

+0

謝謝老兄! 只有將類型轉換爲基類的選項和使用帶有文本上下文的指南注入庫相比,您的選項適用於並行執行,而其他方式不適用。再次感謝 ! –

0

我打算去找Robbie提供的解決方案,但是想避免捆綁我的基類。由於我使用到吉斯注入我的webdriver提供商我選擇通過在設置測試類一旦鉤住它,像這樣通過TestNG的屬性通過實例:

public class Setup { 
    @Inject WebDriver driver; 

    @BeforeSuite 
    public void onStart(ITestContext testContext) { 
     testContext.setAttribute("WebDriver", this.driver); 
    } 
} 

然後在我的聽衆,我只是將其拉出:

@Override 
public void onTestFailure(ITestResult result) { 

    Object webDriverAttribute = 
     result.getTestContext().getAttribute("WebDriver"); 
    // test, cast, and use... 

希望有一個更好的方式,不需要鑄造,但還沒有找到一個。

0

如果你想隨時隨地訪問驅動器項目,然後在瀏覽器中設置類定義wedDriver像下面一樣

public class BrowserSetup{ 
private WebDriver driver; 
public WebDriver getDriver() 
{ 
    return driver; 
} 
    use rest of code 
} 

而且使用下面的代碼在TestNG的聽衆

public class TestNgListener extends BrowserSetup implements ITestListener, ISuiteListener, IInvokedMethodListener{ 
WebDriver driver =null; 

@Override 
public void onTestFailure(ITestResult arg0) { 
    Object currentClass = arg0.getInstance(); 
    WebDriver driver = ((BrowserSetup) currentClass).getDriver(); 
    //this.driver = ((BrowserSetup)currentClass).getDriver; 

    // This is calling the printTestResults method 
    try { 
     getScreenshot(arg0.getTestName(), driver); 
     System.out.println("Screenshot taken"); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     System.out.println("Exception while takescreenshot "+e.getMessage()); 
     //e.printStackTrace(); 
    } 
    printTestResults(arg0); 

}