2017-10-30 12 views
0

さまざまなブラウザでテストケース(xmlファイルのテストタグ)を並行して実行できるフレームワークを作成しようとしています。私はtestNGアノテーションのすべての組み合わせを使用しようとしましたが、ブログを読んだ後、これはtestNgのリスナーを使ってのみ達成できることが分かりました。スレッドセーフを維持するためにThreadLocalを使用しています。 LocalDriverManager.getDriver()行のテストケースクラスでWebdriverにアクセスしようとしたときにnullポインタ例外が発生しています。get(url);以下のシナリオでSelenium Webdriverインスタンスにアクセスしようとすると、NullPointerExceptionが発生します。

これはこれはこれはこれはWebDriverListner.class

である私の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"); 
    } 

} 

である私の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); 
    } 
} 

ある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; 
     } 

} 

です

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をインスタンスをプッシュする)だろうメソッドを呼び出すと、それをポップアウトし、webdriverインスタンスを(quit()を呼び出して)クリーンアップします。あなたの場合、あなたのコードは逆です。

詳細については、私のブログ記事hereを参照してください。

関連する問題