2013-07-12 2 views
4

У меня есть тестовый файл, который будет вызывать драйвер как нестационарную переменную. Я также добавил слушателя скриншотов в своем тестовом примере. Когда тест не срабатывает, элемент управления автоматически отправляется на прослушиватель скриншотов ... однако, поскольку мой драйвер является НЕСТАЦИОНАЛЬНОЙ переменной, к нему нельзя было получить доступ в прослушивателе скриншотов. Поэтому я получаю исключение nullpointer.Нестатический драйвер и прослушиватель скриншотов в 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

Вам не нужно проходить мимо водителя или звонить n testfailure в рамках теста (infact this defeats the point of the listen listeners);

Следующие пользователи получат скриншоты в прослушивателях, не проезжая мимо водителя;

  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

Благодаря Dude! Единственное отличие вашей опции приведения типов в базовый класс и использование Guide Inject lib с текстовым контекстом - ваш вариант работает для параллельного выполнения там, где другого нет. Еще раз спасибо ! –

0

Я собирался пойти на решение, предоставленное Робби, но хотел избежать привязки моего базового класса. Как я использую, чтобы Guice внедрить мой провайдер 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); 

}