当前位置: 首页 > 知识库问答 >
问题:

使用Selenium和Page对象模式测试NullPointerException

明正德
2023-03-14

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

java.lang.NullPoInterException(位于pages.userRegistrationPage.java:61)(位于userRegistrationPage.java:61)(位于sun.reflect.nativeMethodAccessorImpl.Invoke0(原生方法)(位于sun.reflect.nativeMethodAccessorImpl.java:62)(位于sun.reflect.nativeMethodAccessorImpl.Invoke(nativeMethodAccessorImpl.java:43)(位于:505)在org.testng.suiterunner.runtest(suiterunner.java:455)在org.testng.suiterunner.runsequency(suiterunner.java:450)在org.testng.suiterunner.runsequency(suiterunner.java:415)在org.testng.suiterunner.privaterun(suiterunner.java:415)在org.testng.suiterunner.run(suiterunner.java:364)在

初始化驱动程序,打开测试页,并在尝试填充字段时抛出异常。我的类:

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

}

我错过了什么?

共有1个答案

和和裕
2023-03-14

原因是:当您到达“UserRegistrationPage.FillName(”John“)”行时,“UserRegistration”页面的“Driver”成员仍然为空。

看到这个了吗

这是因为在调用UserRegistrationPage的构造函数之后,会调用“AbstractTest”测试内部的@BeforeSuite(方法

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

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

private UserRegistrationPage userRegistrationPage = new UserRegistrationPage(driver);

要解决这个问题,请更改“Open URL”中的“UserRegistrationPage”对象的初始化位置,如下所示

 类似资料:
  • 问题内容: 我开始使用Selenium IDE, 并尝试测试一个充满模式对话框()的Web应用程序。 记录测试似乎可以正常工作(除非弹出对话框时日志中没有任何内容),但是它们不能正确播放。该脚本实际上打开了窗口(通过单击按钮触发),但随后无限期地等待。 有什么建议? 问题答案: 从Selenium常见问题解答中,Selenium显然适用于某些类型的对话框,但不适用于其他类型的对话框: 我无法与弹出

  • 我有三个类。一个用于从网页中获取所有元素,一个用于使用这些元素执行操作,一个用于测试脚本。当我从测试脚本调用函数时,我得到一个空指针异常。我发现这是因为我使用了@FindBy注释,但我不知道如何解决这个问题。 元素类别: 操作类: 测试脚本: 当我将WebDriver对象从测试脚本传递到element类时,没有例外。由于没有WebDriver实例化,所以在使用用FindBy注释初始化的元素时会出现

  • 本文向大家介绍Python+Selenium使用Page Object实现页面自动化测试,包括了Python+Selenium使用Page Object实现页面自动化测试的使用技巧和注意事项,需要的朋友参考一下   Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium

  • 问题内容: 我正在尝试编写代码以检查单击SVG对象的功能-例如此URL上的美国状态 这可行,但是有更好的方法吗?有没有物理移动鼠标的东西? 问题答案: 在SVG中,显示的所有内容都是由坐标定义的块。在您的情况下,每个状态也是一个块,因此有一个XPath,您可以在Selenium代码中使用它。 使用浏览器开发工具分析页面代码,并找到与您要单击的状态相对应的块。 这是与加利福尼亚相对应的元素。 找到它

  • 主要内容:示例JSP page 的实质是 java.lang.Object 对象,相当于 Java 中的 this 关键字。page 对象是指当前的 JSP 页面本身,在实际开发中并不常用。 page 对象的常用方法如下: page 对象的常用方法 方  法 说  明 class getClass() 返回当前页面所在类 int hashCode() 返回当前页面的 hash 代码 String toStrin

  • page对象表示由JSP页面生成的Servlet类的对象实例本身。page对象实际上是Object类型的对象。但可以将page对象转换成相应的Servlet类型的对象。在下面的代码中输出了page对象的类型信息,并通过反射技术输出了由JSP生成的Servlet类中的所有public方法名。 <!-- page.jsp --> <%@ page language="java" pageEncod