Selenium pageFactory NullPointerException
。任何帮助将不胜感激。它适用于setUp()
的登录,但在该驱动程序出现后为空。
public class TestBase {
public WebDriver driver;
String url = PropertiesFile.readPropertiesFile("autUrl");
public WebDriver getDriver() {
System.setProperty("webdriver.chrome.driver",
System.getProperty("user.dir") + "/driver/chromedriver.exe");
driver = new ChromeDriver();
return driver;
}
public void getUrl(String url) {
driver.get(url);
driver.manage().window().maximize();
}
public void init() {
getDriver();
getUrl(url);
}
}
public class LogInPage extends TestBase {
WebDriver driver;
@FindBy(id = "loginEmail")public WebElement userName_field;
@FindBy(name = "password")public WebElement password_field;
@FindBy(xpath = "//*[@id='main-content']/aside/div/form/input[2]")public WebElement SignMeIn_btn;
public LogInPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
// Login
public void logIn(String userName, String password) {
userName_field.sendKeys(userName);
password_field.sendKeys(password);
SignMeIn_btn.click();
}
}
public class LogIn extends TestBase {
LogInPage logInPage;
private String user = PropertiesFile.readPropertiesFile("user");
private String password = PropertiesFile.readPropertiesFile("password");
public LogIn(WebDriver driver) {
this.driver = driver;
}
public void setUp(){
init();
}
public void logIn(){
logInPage = new LogInPage(driver);
logInPage.logIn(user, password);
}
}
public class PortalsPage extends TestBase {
WebDriver driver;
@FindBy(id = "loginEmail") public WebElement userName_field;
@FindBy(xpath=".//*[@id='tabDetail']") public WebElement tenantPage_li;
@FindBy(id="tabDetail") public WebElement ownerPage_li;
@FindBy(xpath="//a[contains(@href,'tenant.action')]") public WebElement tenantPortal_link;
@FindBy(xpath="//a[contains(@href,'owner.action')]") public WebElement ownerPortal_link;
public PortalsPage(WebDriver driver){
this.driver = driver;
PageFactory.initElements(driver, this);
}
public void goToPortals(){
userName_field.sendKeys("a");
tenantPage_li.click();
}
}
public class Portals extends TestBase {
PortalsPage portals;
WebDriver driver;
@BeforeClass
public void setUp(){
LogIn login = new LogIn(driver);
login.setUp();
login.logIn();
}
@Test
public void goToPortal(){
portals = new PortalsPage(driver);
portals.goToPortals();
}
}
我得到以下例外:
失败:goToPortal java.lang.NullPointerException at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69) 在 org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38) 在com.sun.proxy。$ Proxy6.sendKeys(未知来源)at com.demo.pages.PortalsPage.goToPortals(PortalsPage.java:30)at com.demo.control.Portals.goToPortal(Portals.java:28)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)at sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)at java.lang.reflect.Method.invoke(未知来源)at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) 在org.testng.internal.Invoker.invokeMethod(Invoker.java:714)at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)at at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)at at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 在 org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 在org.testng.TestRunner.privateRun(TestRunner.java:767)at org.testng.TestRunner.run(TestRunner.java:617)at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)at at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)at at org.testng.SuiteRunner.run(SuiteRunner.java:240)at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)at at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)at at org.testng.TestNG.run(TestNG.java:1031)at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230) 在org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)
答案 0 :(得分:2)
您当前的方法似乎有点复杂。但是,如果不深入研究可以用来修复整体设计的其他方法的细节,这里有一个清理版本的代码,应该可以使用。
这里的想法是,您只需要页面类(以*Page
结尾的代表特定页面的页面类,并公开可以在该特定页面上执行的一些业务功能)和测试类,测试类本身从TestBase
所以这是类
<强> LoginPage.java 强>
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class LogInPage {
@FindBy(id = "loginEmail")
private WebElement userNameTextField;
@FindBy(name = "password")
private WebElement passwordTextField;
@FindBy(xpath = "//*[@id='main-content']/aside/div/form/input[2]")
private WebElement signInButton;
public LogInPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
public void logIn(String userName, String password) {
userNameTextField.sendKeys(userName);
passwordTextField.sendKeys(password);
signInButton.click();
}
}
<强> PortalsPage.java 强>
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class PortalsPage {
@FindBy(id = "loginEmail")
private WebElement usernameTextField;
@FindBy(xpath = ".//*[@id='tabDetail']")
private WebElement tenantPage;
@FindBy(id = "tabDetail")
private WebElement ownerPage;
@FindBy(xpath = "//a[contains(@href,'tenant.action')]")
private WebElement tenantPortalLink;
@FindBy(xpath = "//a[contains(@href,'owner.action')]")
private WebElement ownerPortalLink;
public PortalsPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
public void goToPortals() {
usernameTextField.sendKeys("a");
tenantPage.click();
}
}
<强> TestBase.java 强>
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class TestBase {
private WebDriver driver;
protected WebDriver getDriver() {
if (driver != null) {
return driver;
}
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "/driver/chromedriver.exe");
driver = new ChromeDriver();
return driver;
}
public void getUrl(String url) {
getDriver().get(url);
getDriver().manage().window().maximize();
}
}
<强> PortalsTest.java 强>
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class PortalsTest extends TestBase {
private PortalsPage portals;
private String user = PropertiesFile.readPropertiesFile("user");
private String password = PropertiesFile.readPropertiesFile("password");
private String url = PropertiesFile.readPropertiesFile("autUrl");
@BeforeClass
public void setUp() {
LogInPage login = new LogInPage(getDriver());
getUrl(url);
login.logIn(user, password);
}
@Test
public void goToPortal() {
portals = new PortalsPage(getDriver());
portals.goToPortals();
}
}