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

驱动程序的Selenium pageFactory NullPointerException

万俟穆冉
2023-03-14
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(位于org.openqa.selenium.support.pageFactor.defaultelementLocator.findElement(defaultelementLocator.java:69)(位于org.openqa.selenium.support.pageFactor.internal.locatingelementHandler.invoke(locatingelementHandler.java:38)(位于com.sun.proxy)。$proxy6.sendkeys(未知源)(位于ethodworker.invoketestmethods(testmethodworker.java:127)在org.testng.internal.testmethodworker.run(testmethodworker.java:111)在org.testng.testrunner.privaterun(testrunner.java:767)在org.testng.testrunner.run(testrunner.java:617)在org.testng.testrunner.run(testrunner.java:334)在org.testng.suiterunner.runtest

共有1个答案

阴凯歌
2023-03-14

你现在的方法似乎有点复杂。但是,在不深入研究您可以使用什么其他方法来修复总体设计的细节的情况下,这里有一个经过清理的代码版本,它应该可以工作。

这里的想法是,您只需要页面类(以*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();
    }
}
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();
    }

}
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();
    }
}
 类似资料:
  • 对于ex,当我的chrome放在Compand提示符中时,会给出路径-/applications/google\chrome.app system.setproperty(“webdriver.chrome.driver”,“/applications/google/chrome.app”);WebDriver driver=new ChromeDriver(); driver.get(“http

  • 搜索上下文是selenium中最超级的接口,它由另一个称为网络驱动程序的接口扩展。 -所有搜索上下文和Web驱动程序接口的抽象方法都在远程WebDriver类中实现。 -所有与浏览器相关的类,如Firefox驱动程序、Chrome驱动程序等,都扩展了远程Webdriver类。 根据上面的stmt,远程web驱动程序类如何为搜索上下文接口和web驱动程序接口中定义的所有抽象方法给出定义。因为功能驱动

  • 我试图通过网络驱动程序在“http://www.kayak.co.in/?ispredir=true”中选择入住和退房时间。无法选择任何日期。请帮帮我。

  • 我假设Selenium打开的chrome浏览会话将与google chrome本地安装相同。但是当我尝试在这个网站上搜索时,即使只是用selenium打开它并手动控制搜索过程,我会得到一个错误信息,当我使用常规chrome与我自己的个人资料或在incognito窗口中搜索结果返回良好。每当我搜索这个问题,我发现结果指出鼠标移动或点击模式提供它。但情况并非如此,因为我在打开浏览器后尝试手动控制。ht

  • 在Eclipse BIRT数据资源管理器中为查询生成器添加JDBC数据库连接: 选择“查询生成器的JDBC数据库连接” 就这样。我可以使用此数据源来使用数据集。 下一个。 我希望使用更灵活的“JDBC数据源”,而不是以前成功使用的“查询生成器的JDBC数据库连接”。哦,我看到MySQL没有驱动程序类-Derby和Sample只有两个默认条目。 似乎JDBC驱动程序的有效注册没有添加(或注册?)司机

  • 我尝试使用TNS URL、用户名和密码连接到Oracle 11i数据库。JNDI正在成功查找数据源,但我无法获得连接。相反,我看到下面的堆栈跟踪。 我的Maven设置如下。 我的Spring MVC应用程序已经部署到Tomcat 8。我的oracle jar文件位于位置。如下所示 我的web.xml配置 我不确定我做错了什么。我能够使用DriverManager API成功连接。我看了下面的帖子,

  • 我正在处理Spring Boot项目,突然遇到应用程序无法加载MySQL jdbc的问题。(我编译了一次这个项目,没有改变任何东西) 这是我的pom.xml: 这是我的application.properties: Logcat: MySQL数据库最初是使用hibernate创建的。这些配置工作正常,但我不确定这里的真正问题是什么 编辑:我删除了。m2文件夹并从一开始安装所有依赖项。

  • 我需要在Java中使用JDBC做一些简单的实验,我认为运行derby数据库应该是实现这一点的简单途径。 我已经安装了derby,并使用“ij”工具创建了一个表并将一些数据放入其中。我也可以用ij读回数据。 然而,当我试图使用实际的Java代码连接到此时,事情变得很糟糕。这是我尝试了几件事情的情况之一,每件事都以不同的方式失败,所以我希望你们都能原谅这有点模糊。但这些是我迄今为止尝试/失败的要点。