我正在尝试使用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();
}
}
错误跟踪日志:org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)中的java.lang.NullPointerException,位于org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler . java:38)at com.sun.proxy . $ Proxy9.click(Unknown Source)at com.login.test.Login.openLoginDialog(Login.java:50)at com.homepage.test.SwitchTShirtPage.switchToTShirt(SwitchTShirtPage.java :28)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke( org.testng.internal.InvokeTestMethod(Invoker . )的org.test.invoke.invokeMethod(Invoker.java:646)中的org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:100)中的未知来源 . java:811)org.testng.i上的org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1129)在org.testng.TestRunner的org.testng.TestRunner.privateRun(TestRunner.java:746)的org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)上的nternal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) .run(TestRunner.java:600)org.testng.SuiteRunner.runTest(SuiteRunner.java:366)org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)atg.testng.SuiteRunner.privateRun(SuiteRunner . java:319)org.testng.SuiteRunner.run(SuiteRunner.java:268)org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)at org.testng.TestNG.runSuitesSequentially(TestNG.java:1264)org.testng.TestNG.runSuitesLocally(TestNG.java:1189)org.testng.TestNG.runSuites(TestNG.java:1104)atg.testng.TestNG .run(TestNG.java:1076)org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126)位于org.testng.remote的org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:152) . RemoteTestNG.ma在(RemoteTestNG.java:57)
1 回答
来自
SwitchTShirtPage
的WebDriver driver
永远不会被初始化,并始终是null
.你想要的是来自
BrowserOpenClose
的那个,所以只需从SwitchTShirtPage
删除声明 .然后,要小心,因为
driver
初始化为@BeforeTest
,它只能通过test(类组)运行一次 . 因此,只有BrowserOpenClose
的第一个实例才会初始化driver
. 考虑将@BeforeTest
替换为@BeforeClass
,这应解决问题 .