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