【问题标题】:What am i missing here in pagefactory during initializing the page objects? Getting NullpointerException during element identification在初始化页面对象期间,我在 pagefactory 中缺少什么?在元素识别期间获取 NullpointerException
【发布时间】:2019-02-19 11:02:11
【问题描述】:

我已设置页面对象模型并尝试使用 PageFactory 初始化 Web 对象。

我已经在 testBase 中初始化了我的驱动程序,并将页面类扩展到这个 testbase。当我尝试运行我的测试用例时,会抛出以下 nullpointerexeception

TestBase.java

public class testBase {
    public  WebDriver driver;
    public static Properties prop;
    public FlightBookingPage FBPage;

    public testBase(){
        try {
            prop = new Properties();
            FileInputStream ip = new FileInputStream(System.getProperty("user.dir")+ "/src/main/java"
                    + "/Config/config.properties");
            prop.load(ip);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void setDriverPath() {
        if (PlatformUtil.isMac()) {
            System.setProperty("webdriver.chrome.driver", "chromedriver");
            driver = new ChromeDriver();
        }
        if (PlatformUtil.isWindows()) {
            System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
            driver = new ChromeDriver();
        }
        if (PlatformUtil.isLinux()) {
            System.setProperty("webdriver.chrome.driver", "chromedriver_linux");
            driver = new ChromeDriver();
        }
        driver.manage().window().maximize();
        driver.manage().deleteAllCookies();
        driver.manage().timeouts().pageLoadTimeout(testUtil.PAGE_LOAD_TIMEOUT, TimeUnit.SECONDS);
        driver.manage().timeouts().implicitlyWait(testUtil.IMPLICIT_WAIT, TimeUnit.SECONDS);
    }

下面的代码是实际的测试类,它从页面类中调用适当的函数和变量

public class FlightBookingTest extends testBase {

    @BeforeMethod
    public void setup() {

        FBPage = new FlightBookingPage();
        setDriverPath();
        driver.get(prop.getProperty("url"));

    }

    @Test
    public void testThatResultsAppearForAOneWayJourney() {

        FBPage.clickOneWayBtn();
        FBPage.typeOriginCity("Bangalore");
        FBPage.selectOriginCityfromList("Bangalore");
        FBPage.typeDestinCity("Delhi");
        FBPage.selectDestinCityfromList("Delhi");
        FBPage.selectDate();
        FBPage.clickSearch();
        // verify that result appears for the provided journey search

            Assert.assertTrue(isElementPresent(By.className("searchSummary")));

    }

    @AfterMethod
    public void tearDown() {
        // close the browser
        driver.quit();
    }

下面是上面测试的页面类

public class FlightBookingPage extends testBase {

    // Page Factory - OR:
    @FindBy(id = "OneWay")
    public WebElement oneWayRdBtn;

    @FindBy(id = "FromTag")
    public WebElement fromCitytxtbox;

    @FindBy(xpath = "//*[@id='ui-id-1']/li")
    public List<WebElement> originOptionList;

    @FindBy(id = "toTag")
    public WebElement toCitytxtbox;

    @FindBy(xpath = "//*[@id='ui-id-2']/li")
    public List<WebElement> destinOptionList;

    @FindBy(xpath = "//*[@id='ui-datepicker-div']/div[1]/table/tbody/tr[3]/td[7]/a")
    public WebElement date;

    @FindBy(id = "SearchBtn")
    public WebElement searchBtn;

    @FindBy(className = "searchSummary")
    public WebElement searchResultsHeadertxt;


    // Initializing the Page Objects:
    public FlightBookingPage(){
        PageFactory.initElements(driver, this);
    }

    public void clickOneWayBtn() {
        oneWayRdBtn.click();
    }

    public void typeOriginCity(String origin) {
        fromCitytxtbox.clear();
        fromCitytxtbox.sendKeys(origin);
    }

    public void selectOriginCityfromList(String origin) {
        for (WebElement list : originOptionList) {
            if (list.getText().contains(origin)) {
                list.click();
                break;
            }
        }
    }

    public void typeDestinCity(String destin) {
        toCitytxtbox.clear();
        toCitytxtbox.sendKeys(destin);
    }

    public void selectDestinCityfromList(String destin) {
        for (WebElement list : destinOptionList) {
            if (list.getText().contains(destin)) {
                list.click();
                break;
            }
        }
    }

    public void selectDate() {
        date.click();
    }

    public void clickSearch() {
        searchBtn.click();
    }

    public WebElement verifySearchSummaryHeader() {
        return searchResultsHeadertxt;
    }

}

当焦点转到此块时,我会收到以下错误消息

public void clickOneWayBtn() {
        oneWayRdBtn.click();
    }
java.lang.NullPointerException
    at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
    at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
    at com.sun.proxy.$Proxy9.click(Unknown Source)
    at Pages.FlightBookingPage.clickOneWayBtn(FlightBookingPage.java:45)
    at FlightBookingTest.testThatResultsAppearForAOneWayJourney(FlightBookingTest.java:24)

【问题讨论】:

    标签: java selenium-webdriver page-factory


    【解决方案1】:

    请更改 testBase 类中的以下代码行

    public  WebDriver driver;
    

    public static WebDriver driver;
    

    在 Page 类中尝试以下操作:

    请在您的页面类中创建一个构造函数

    WebDriver driver;
    
    public FlightBookingPage(WebDriver driver) {
        this.driver = driver;
    }
    

    【讨论】:

    • 这已经尝试过但失败了。使用静态驱动程序时遇到相同的错误。
    • 在页面类中创建构造函数并传递驱动程序。代码已更新。
    • 这是一个非常糟糕的建议,不要让事情变得一成不变,它会产生深远的影响。
    • 至于通知的第二点,Page 对象扩展了 testBase 并因此继承了驱动程序对象。你不需要传递通过构造函数继承的东西。
    【解决方案2】:

    交换了新的 FlightBookingPage 和 setDriverPath() 的启动位置。它奏效了。

    更新代码如下:

    @BeforeMethod
        public void setup() {
            setDriverPath();
            FBPage = new FlightBookingPage();
            driver.get(prop.getProperty("url"));
    }
    

    【讨论】:

    • 这是因为方法 setDriverPath 正在实例化您的驱动程序对象。您的 FBPage 方法需要预先实例化驱动程序对象,因为它将驱动程序对象绑定到页面工厂类。如果您在创建 Page 对象的新实例之前没有调用 setDriverPath,那么您实际上是在尝试将空驱动程序对象绑定到将引发异常的页面工厂类。
    【解决方案3】:

    请尝试更换您的 FBPage = new FlightBookingPage();setDriverPath(); 以便实例化驱动程序的值。

    将您的代码更改为:

        @BeforeMethod
        public void setup() {
            setDriverPath();    
            FBPage = new FlightBookingPage();
            driver.get(prop.getProperty("url"));
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 2011-12-22
      • 2023-03-28
      相关资源
      最近更新 更多