在下面的场景中,尝试访问Selenium Webdriver实例时获取NullPointerException。

在下面的场景中,尝试访问Selenium Webdriver实例时获取NullPointerException。,selenium,selenium-webdriver,testng,Selenium,Selenium Webdriver,Testng,我正在尝试创建一个框架,在这个框架中,我可以在不同的浏览器中并行运行xml文件中的测试用例ST标记。我尝试过使用testNG注释的所有组合,但在阅读了一篇博客后,我知道这只能通过使用testNG listners来实现。我正在使用ThreadLocal来确保我的驱动程序线程安全。尝试访问测试用例类中LocalDriverManager.getDriver.geturl行中的Webdriver时出现空指针异常 这是LocalBrowserFactory.Class package BrowserF

我正在尝试创建一个框架,在这个框架中,我可以在不同的浏览器中并行运行xml文件中的测试用例ST标记。我尝试过使用testNG注释的所有组合,但在阅读了一篇博客后,我知道这只能通过使用testNG listners来实现。我正在使用ThreadLocal来确保我的驱动程序线程安全。尝试访问测试用例类中LocalDriverManager.getDriver.geturl行中的Webdriver时出现空指针异常

这是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);
    }
}
这是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();
            }
        }
    }

}
这是我的示例testcase.class

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);

    }

}

您的侦听器代码乱七八糟。基本上,调用前和调用后的顺序是错误的

下面是它应该是什么样子

导入org.openqa.selenium.WebDriver; 导入org.testng.IInvokedMethod; 导入org.testng.IInvokedMethodListener; 导入org.testng.ITestResult; 公共类WebDriverListener实现IInvokedMethodListener{ @凌驾 调用之前的公共无效IINVokedMethod方法,ITestResult testResult{ if method.isTestMethod{ 字符串browserName=method.getTestMethod.getXmlTest.getLocalParameters.getbrowserName; WebDriver driver=LocalDriverFactory.createInstancebrowserName; LocalDriverManager.setWebDriverdriver; } } @凌驾 调用IINVokedMethod方法后的公共无效,ITestResult testResult{ if method.isTestMethod{ WebDriver-driver=LocalDriverManager.getDriver; 如果驱动程序!=null{ driver.quit; } } } } 基本上,您可以将webdriver设置到线程局部变量中,将webdriver实例从beforeInvocation中推到线程局部变量的上下文中,然后在afterInvocation方法中,将其弹出并通过调用quit清理webdriver实例。在您的情况下,您的代码正做相反的事情


有关更多详细信息,请参阅我的博文。

似乎afterInvocation和beforeInvocation方法需要切换名称…在这一行LocalDriverManager.getDriver.geturl;根据您的代码,有一个getDriver返回webDriver.get,因此它变成了LocalDriverManager.webDriver.get.geturl,这让我很困惑。我认为问题就在这里。或者您需要将这部分代码WebDriver=null;类外LocalDriverFactory
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);

    }

}