簡體   English   中英

selenium webdriver中的空指針異常 - TestNG - PageFactory

[英]Null pointer exception in selenium webdriver - TestNG - PageFactory

我正在嘗試使用selenium webdriver,testng和頁面工廠自動化。 但我面臨空指針異常。

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

}

錯誤跟蹤日志 :顯示java.lang.NullPointerException在org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)在org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java :38)at com.sun.proxy。$ Proxy9.click(未知來源)com.omein.test.Log.Logn.Logn.Datog(Login.java:50)com.homepage.test.SwitchTShirtPage.switchToTShirt(SwitchTShirtPage.java: 28)在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)在sun.reflect.NativeMethodAccessorImpl.invoke(未知來源)在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知來源)在java.lang.reflect.Method.invoke(未知來自org.testng.internal.InvokeTethod(Invoker.java:646)org.test.invoke.invokeTethod(Invoker.java:646)的org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:100)org.test.Invoker.invokeTestMethod(Invoker.java) :811)在org.testng.in的org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1129) ternal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)org.testng.TestMethodWorker.run(TestMethodWorker.java:112)atg.testng.TestRunner.privateRun(TestRunner.java:746)atg.testng.TestRunner .RUN(TestRunner.java:600)在org.testng.SuiteRunner.runTest(SuiteRunner.java:366)在org.testng.SuiteRunner.runSequentially(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.runSuitesLocally(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.mai N(RemoteTestNG.java:57)

來自SwitchTShirtPage WebDriver driver永遠不會被初始化並且始終為null

你想要的是來自BrowserOpenClose ,所以只需從SwitchTShirtPage刪除聲明SwitchTShirtPage

然后,要小心,因為driver是使用@BeforeTest初始化的,只能通過test(類組)運行一次。 因此,只有BrowserOpenClose的第一個實例才會初始化driver程序。 考慮用@BeforeClass替換@BeforeTest ,這應該解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM