Java selenium webdriver-TestNG-PageFactory中的空指针异常

Java selenium webdriver-TestNG-PageFactory中的空指针异常,java,selenium,selenium-webdriver,testng,Java,Selenium,Selenium Webdriver,Testng,我正在尝试使用SeleniumWebDriver、testng和page factory实现自动化。但我面临空指针异常 public class BrowserOpenClose extends Common { public WebDriver driver; @BeforeTest @Parameters("browser") public void initBrowser(String browser) { if (browser.equa

我正在尝试使用SeleniumWebDriver、testng和page factory实现自动化。但我面临空指针异常

public class BrowserOpenClose extends Common {
    public WebDriver driver;

    @BeforeTest
    @Parameters("browser")
    public void initBrowser(String browser) {
        if (browser.equalsIgnoreCase("FF")) {
            System.setProperty("webdriver.firefox.marionette", "./gecko/geckodriver.exe");
            driver = new FirefoxDriver();
            driver.manage().window().maximize();
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            driver.get("https://www.flipkart.com/");
        } else if (browser.equalsIgnoreCase("CH")) {
            System.setProperty("webdriver.chrome.driver", "./chrome/chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().maximize();
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            driver.get("https://www.flipkart.com/");
        }
    }

    @AfterTest
    public void closeBrowser() {
        waitUntil(10);
        driver.quit();
    }
}

    public class Login extends BrowserOpenClose {

    @FindBy(xpath = "//a[text()='Log In']")
    private WebElement loginLink;

    @FindBy(xpath = "//input[@class='_2zrpKA']")
    private WebElement username;

    @FindBy(xpath = "//input[@class='_2zrpKA _3v41xv']")
    private WebElement password;

    @FindBy(xpath = "//button[@class='_3zLR9i _1LctnI _36SmAs']")
    private WebElement loginButton;

    public Login(WebDriver driver) {
        PageFactory.initElements(driver, this);
        this.driver = driver;
    }

    public void openLoginDialog() {
        loginLink.click();
    }

    public void enterUsername(String name) {
        username.sendKeys(name);
    }

    public void enterPassword(String pass) {
        password.sendKeys(pass);
    }

    public void clickLogin() {
        loginButton.click();
    }

}

    public class SwitchTShirtPage extends BrowserOpenClose {
    WebDriver driver;
    Login login;

    @BeforeMethod
    public void initElements() {
        login = new Login(driver);
    }

    @Test
    public void switchToTShirt() {
        login.openLoginDialog();
        login.enterUsername("abc");
        login.enterPassword("xyz");
        login.clickLogin();
    }

}
错误跟踪日志:org.openqa.selenium.support.pagefactory.DefaultElementLocator.FinDelelement上的java.lang.NullPointerException(DefaultElementLocator.java:69) 在 org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38) 位于com.sun.proxy.$Proxy9。单击位于的(未知源) com.login.test.login.openLoginDialog(login.java:50)位于 com.homepage.test.SwitchTShirtPage.switchtotshirtpage(SwitchTShirtPage.java:28) 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 位于的sun.reflect.NativeMethodAccessorImpl.invoke(未知源) sun.reflect.DelegatingMethodAccessorImpl.invoke(未知源)位于 java.lang.reflect.Method.invoke(未知源代码)位于 org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:100) 位于org.testng.internal.Invoker.invokeMethod(Invoker.java:646) org.testng.internal.Invoker.invokeTestMethod(Invoker.java:811)位于 org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1129)位于 org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) 在 org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112) 位于org.testng.TestRunner.privateRun(TestRunner.java:746) org.testng.TestRunner.run(TestRunner.java:600)位于 org.testng.SuiteRunner.runTest(SuiteRunner.java:366)位于 org.testng.SuiteRunner.runsequential(SuiteRunner.java:361)位于 org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)位于 org.testng.SuiteRunner.run(SuiteRunner.java:268)位于 org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)位于 org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)位于 org.testng.testng.runSuitesSequentially(testng.java:1264)位于 org.testng.testng.runSuitesLocal(testng.java:1189)位于 org.testng.testng.runSuites(testng.java:1104)位于 org.testng.testng.run(testng.java:1076)位于 org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126) 位于org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:152) 位于org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:57)


WebDriver-driver
from
SwitchTShirtPage
从未初始化,并且始终为
null

您需要的是
browserverpunclose
中的声明,因此只需从
SwitchTShirtPage
中删除声明即可

然后,要小心,因为
驱动程序
是用一个
@BeforeTest
初始化的,该测试(类组)只运行一次。因此,只有
浏览器关闭
的第一个实例将初始化
驱动程序

考虑替换<代码> @ BeFordTest< <代码> >代码> @ BeReqLass<代码>。这应该解决这个问题。

您需要通过Suffer类(即<代码> BrowserOpenClose <代码> >代码> >代码< >代码> > <代码>
驱动程序
参考。它未初始化。因此,
java.lang.NullPointerException
。谢谢:)@atuldwidedijulien我处于初始阶段,因此在@BeforeTest之前使用,稍后将更改为各自的注释。谢谢你的帮助。