2017-10-30 15 views
0

다른 브라우저에서 테스트 케이스 (XML 파일의 테스트 태그)를 병렬로 실행할 수있는 프레임 워크를 만들려고합니다. testNG 주석의 모든 조합을 사용하여 시도했지만 블로그를 읽은 후에 testNg listners를 사용하여 블로그를 얻을 수 있음을 알게되었습니다. ThreadLocal을 사용하여 드라이버를 스레드로부터 안전하게 유지합니다. LocalDriverManager.getDriver()에서 테스트 케이스 클래스의 Webdriver에 액세스하려고 할 때 null 포인터 예외가 발생합니다. get (url); 아래 시나리오에서 Selenium Webdriver 인스턴스에 액세스하려고 할 때 NullPointerException이 발생합니다.

은 LocalBrowserFactory.Class

package BrowserFactory; 

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.ie.InternetExplorerDriver; 

import DataProvider.ConfigDataProvider; 

public class LocalDriverFactory { 

     public static WebDriver createInstance(String browserName) { 
      WebDriver driver = null; 
      ConfigDataProvider config=new ConfigDataProvider(); 

      if (browserName.toLowerCase().contains("firefox")) { 
       System.setProperty("webdriver.gecko.driver", config.getgeckoPath()); 
       driver = new FirefoxDriver(); 

      } 
      if (browserName.toLowerCase().contains("internet")) { 
       driver = new InternetExplorerDriver(); 

      } 
      if (browserName.toLowerCase().contains("chrome")) { 
       System.setProperty("webdriver.chrome.driver", config.getchromePath()); 
       driver = new ChromeDriver(); 

      } 
      driver.manage().window().maximize(); 
      return driver; 
     } 

} 

입니다 이것은 내 LocalDriverManager.class

package BrowserFactory; 

import org.openqa.selenium.WebDriver; 

public class LocalDriverManager { 
    private static ThreadLocal<WebDriver> webDriver = new ThreadLocal<WebDriver>(); 

    public static WebDriver getDriver() { 
     return webDriver.get(); 
    } 

    public static void setWebDriver(WebDriver driver) { 
     webDriver.set(driver); 
    } 
} 

입니다 이것은 내 ConfigPropertyReader.class

package DataProvider; 

import java.io.File; 
import java.io.FileInputStream; 
import java.util.Properties; 

public class ConfigDataProvider { 

    static Properties p; 
    public ConfigDataProvider() 
    { 

     File f =new File("C:/Eclipse/parallelframework/configuration/config.properties"); 

     try { 
      FileInputStream fis = new FileInputStream(f); 
      p=new Properties(); 
      p.load(fis); 

     } 
     catch (Exception e) 
     { 
     System.out.println("Custom Exception- cannot load properties file"+e.getMessage()); 
     }  
    } 

    public String getvalue(String key) 
    { 
     return p.getProperty(key); 
    } 

    public String getUrl() 
    { 
     return p.getProperty("url");  
    } 

    public String getchromePath() 
    { 
     return p.getProperty("chromepath"); 
    } 

    public String getgeckoPath() 
    { 
     return p.getProperty("firefoxpath"); 
    } 

    public String getIEPath() 
    { 
     return System.getProperty("User.dir")+p.getProperty("IEPath"); 
    } 

} 

인이

,691 WebDriverListner.class입니다
package Listners; 

import org.openqa.selenium.WebDriver; 
import org.testng.IInvokedMethod; 
import org.testng.IInvokedMethodListener; 
import org.testng.ITestResult; 

import BrowserFactory.LocalDriverFactory; 
import BrowserFactory.LocalDriverManager; 

public class WebDriverListner implements IInvokedMethodListener { 

    public void afterInvocation(IInvokedMethod method, ITestResult testResult) { 
     if (method.isTestMethod()) { 
      String browserName = method.getTestMethod().getXmlTest().getLocalParameters().get("browserName"); 
      System.out.println(browserName); 
      WebDriver driver = LocalDriverFactory.createInstance(browserName); 
      LocalDriverManager.setWebDriver(driver); 
      System.out.println("Driver Set"); 
     } 

    } 

    public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { 
     if (method.isTestMethod()) { 
      WebDriver driver = LocalDriverManager.getDriver(); 
      if (driver != null) { 
       driver.quit(); 
      } 
     } 
    } 

} 

package tests; 

import org.openqa.selenium.WebDriver; 
import org.testng.annotations.Test; 

import BrowserFactory.LocalDriverManager; 

public class sampleTest { 


    @Test 
    public void testMethod1() { 
     invokeBrowser("http://www.ndtv.com"); 
    } 

    @Test 
    public void testMethod2() { 
     invokeBrowser("http://www.facebook.com"); 

    } 

    private void invokeBrowser(String url) { 

    LocalDriverManager.getDriver().get(url); 

    } 

} 
+1

afterInvocation 및 beforeInvocation 메서드의 이름을 전환해야하는 것으로 보입니다. – Grasshopper

+0

이 줄에서 LocalDriverManager.getDriver(). get (url); 귀하의 코드에 따라 webDriver.get()을 반환하는 getDriver가 있으므로 LocalDriverManager.webDriver.get(). get (url)이되어 혼란 스럽습니다. 나는 문제가 여기에 있다고 생각한다. 또는 코드의이 부분을 넣어야합니다. WebDriver driver = null; LocalDriverFactory 클래스 바깥 –

답변

1

리스너 코드가 엉망 내 샘플 testcase.class입니다. 기본적으로 beforeInvocationafterInvocation의 순서가 잘못되었습니다. 여기

import org.openqa.selenium.WebDriver; 
import org.testng.IInvokedMethod; 
import org.testng.IInvokedMethodListener; 
import org.testng.ITestResult; 

public class WebDriverListener implements IInvokedMethodListener { 

    @Override 
    public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { 
     if (method.isTestMethod()) { 
      String browserName = method.getTestMethod().getXmlTest().getLocalParameters().get("browserName"); 
      WebDriver driver = LocalDriverFactory.createInstance(browserName); 
      LocalDriverManager.setWebDriver(driver); 
     } 
    } 

    @Override 
    public void afterInvocation(IInvokedMethod method, ITestResult testResult) { 
     if (method.isTestMethod()) { 
      WebDriver driver = LocalDriverManager.getDriver(); 
      if (driver != null) { 
       driver.quit(); 
      } 
     } 
    } 
} 

처럼 보였다해야하는 방법은 당신이 기본적으로 설정하여 afterInvocationbeforeInvocation 내에서 다음 스레드 로컬 변수로 webdriver (스레드 지역 변수의 컨텍스트에 webdriver 인스턴스를 밀어을) 것 메서드를 호출하면 웹 파일 인스턴스가 팝업되고 웹 서버 인스턴스가 정리됩니다 (quit() 호출). 귀하의 경우 귀하의 코드는 그 반대입니다.

자세한 내용은 내 블로그 게시물 here을 참조하십시오.