Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有Selenium和页面对象模式的TestNG NullPointerException_Java_Selenium_Testng - Fatal编程技术网

Java 带有Selenium和页面对象模式的TestNG NullPointerException

Java 带有Selenium和页面对象模式的TestNG NullPointerException,java,selenium,testng,Java,Selenium,Testng,在尝试通过扩展抽象类和测试类来创建测试时,我遇到了NullPointerException。错误: 位于的java.lang.NullPointerException pages.UserRegistrationPage.fillName(UserRegistrationPage.java:61)位于 UserRegistrationpageTest.fillName(UserRegistrationpageTest.java:26) 位于的sun.reflect.NativeMethodAcc

在尝试通过扩展抽象类和测试类来创建测试时,我遇到了NullPointerException。错误:

位于的java.lang.NullPointerException pages.UserRegistrationPage.fillName(UserRegistrationPage.java:61)位于 UserRegistrationpageTest.fillName(UserRegistrationpageTest.java:26) 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.lang.reflect.Method.invoke(Method.java:498) org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124) 位于org.testng.internal.Invoker.invokeMethod(Invoker.java:571) org.testng.internal.Invoker.invokeTestMethod(Invoker.java:707)位于 org.testng.internal.Invoker.invokeTestMethods(Invoker.java:979)位于 org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) 在 org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) 位于org.testng.TestRunner.privateRun(TestRunner.java:648) org.testng.TestRunner.run(TestRunner.java:505)位于 org.testng.SuiteRunner.runTest(SuiteRunner.java:455)位于 org.testng.SuiteRunner.runsequential(SuiteRunner.java:450)位于 org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)位于 org.testng.SuiteRunner.run(SuiteRunner.java:364)位于 org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)位于 org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)位于 org.testng.testng.runSuitesSequentially(testng.java:1187)位于 org.testng.testng.runSuitesLocal(testng.java:1116)位于 org.testng.testng.runSuites(testng.java:1028)位于 org.testng.testng.run(testng.java:996)位于 org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)位于 org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

驱动程序被初始化,打开测试页面,尝试填充字段时抛出异常。 我的班级:

    public abstract class AbstractPage {
        private WebDriver driver;
        public AbstractPage(WebDriver driver){
            this.driver = driver;
        }
    }

    public class UserRegistrationPage extends AbstractPage{

        @FindBy(id = "input-firstname")
        private WebElement firstName;

        @FindBy(id = "input-lastname")
        private WebElement lastName;

        @FindBy(id = "input-email")
        private WebElement email;

        @FindBy(id = "input-telephone")
        private WebElement telephone;

        @FindBy(xpath = "//*[@id=\"input-fax\"]")
        private WebElement fax;

        @FindBy(id = "input-address-1")
        private WebElement address;

        @FindBy(id = "input-city")
        private WebElement city;

        @FindBy(id = "input-postcode")
        private WebElement postcode;

        @FindBy(id = "input-country")
        private WebElement country;

        @FindBy(id = "input-zone")
        private WebElement zone;

        @FindBy(id = "input-password")
        private WebElement password;

        @FindBy(id = "input-confirm")
        private WebElement passwordConfirm;

        @FindBy(css = "#content input[type=\"checkbox\"]:nth-child(2)")
        private WebElement agreeCheckbox;

        @FindBy (xpath = "//*[@id=\"content\"]/form/div/div/input[2]")
        private WebElement submitButton;

        public UserRegistrationPage(WebDriver driver) {
            super(driver);
        }


        public void fillName(String name){
            this.firstName.sendKeys(name);
        }
    }

public abstract class AbstractTest {

    protected WebDriver driver;
    @BeforeSuite
    public void setUpDriver(){
        driver = new FirefoxDriver();
    }
}

public class UserRegistrationpageTest extends AbstractTest{

    private UserRegistrationPage userRegistrationPage = new UserRegistrationPage(driver);


    @BeforeTest
    void openURL(){
        driver.get("http://88.119.151.54/opencartone/index.php?route=account/register");
    }

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

    @Test
    void fillName(){
        userRegistrationPage.fillName("John");
    }

}

这里缺少什么?

使用“PageFactory”时,需要初始化
WebElements
。将其添加到“AbstractPage”

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

使用“PageFactory”时,需要初始化
WebElements
。将其添加到“AbstractPage”

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

扩展
抽象页面的
UserRegistrationPage
使用
WebDriver
实例
驱动程序
。因此,您需要将构造函数定义为:

WebDriver driver;

//constructor
public UserRegistrationPage(WebDriver driver)
{
    this.driver=driver;
}

扩展
抽象页面的
UserRegistrationPage
使用
WebDriver
实例
驱动程序
。因此,您需要将构造函数定义为:

WebDriver driver;

//constructor
public UserRegistrationPage(WebDriver driver)
{
    this.driver=driver;
}

原因是,当您到达“userRegistrationPage.fillName”(“John”)行时,“UserRegistration”页面的“driver”成员保持为空

看到这个了吗

这是因为@BeforeSuite(位于“AbstractTest”测试中的方法在调用UserRegistrationPage的构造函数之后被调用

1) 抽象页面的构造函数。(此处您的驱动程序为空)

2) UserRegistrationPage的构造函数。(此处您的驱动程序为空)

3) @BeforeSuite的抽象测试。(在这里,您的驱动程序不会为null,但在此之前,您已经使用“UserRegistrationpageTest”类中的行初始化了“UserRegistrationPage”的对象

private UserRegistrationPage userRegistrationPage = new UserRegistrationPage(driver);
要解决此问题,请更改“openURL”中“UserRegistrationPage”对象的初始化位置,如下所示


原因是,当您到达“userRegistrationPage.fillName”(“John”)行时,“UserRegistration”页面的“driver”成员保持为空

看到这个了吗

这是因为@BeforeSuite(位于“AbstractTest”测试中的方法在调用UserRegistrationPage的构造函数之后被调用

1) AbstractPage的构造函数。(这里的驱动程序为空)

2) UserRegistrationPage的构造函数。(此处您的驱动程序为空)

3) @BeforeSuite的抽象测试。(在这里,您的驱动程序不会为null,但在此之前,您已经使用“UserRegistrationpageTest”类中的行初始化了“UserRegistrationPage”的对象

private UserRegistrationPage userRegistrationPage = new UserRegistrationPage(driver);
要解决此问题,请更改“openURL”中“UserRegistrationPage”对象的初始化位置,如下所示


奇怪,现在得到的是NullPointerException,但有点不同:
org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementElementHandler.java:38)位于com.sun.proxy.$Proxy9.sendKeys(未知源),位于pages.UserRegistrationPage.fillName(UserRegistrationPage.java:61),位于UserRegistrationpageTest.fillName(UserRegistrationpageTest.java:26),位于sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
@Sig尝试将其移动到
UserRegistrationPage
构造函数。运气不好,但是如果我用Junit替换TestNG,有什么奇怪的吗一切都很好。@Sig我对这些平台不太熟悉,无法帮助您。发布一个新的问题,并提供相关信息。@Sig-您的测试类中有多少个
@Test
方法?
@BeforeSuite
被构建为每个
只执行一次,而
@BeforeTest
被构建为每个
标记只执行一次。因此,如果您需要在每个测试类的基础上执行它,您应该使用
@BeforeClass
,如果您需要在每个
@test
方法的基础上创建这个webdriver,那么您应该我会使用
@BeforeMethod
。但请记住,当您构建测试时,所有测试都在每个类的基础上共享驱动程序对象,您将自己限制为顺序执行。奇怪的是,现在得到的是NullPointerException