Что мне не хватает здесь в pagefactory во время инициализации объектов страницы?Получение NullpointerException при идентификации элемента - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть объектная модель страницы установки и я пытаюсь инициализировать веб-объекты с помощью PageFactory.

Я инициализировал мой драйвер в 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)

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Поменялись местами инициации новой FlightBookingPage и setDriverPath ().Это сработало.

Обновлен код ниже:

@BeforeMethod
    public void setup() {
        setDriverPath();
        FBPage = new FlightBookingPage();
        driver.get(prop.getProperty("url"));
}
0 голосов
/ 19 февраля 2019

Пожалуйста, попробуйте поменять местами FBPage = new FlightBookingPage(); и setDriverPath();, чтобы было установлено значение драйвера.

Измените код на:

    @BeforeMethod
    public void setup() {
        setDriverPath();    
        FBPage = new FlightBookingPage();
        driver.get(prop.getProperty("url"));
    }
0 голосов
/ 19 февраля 2019

Пожалуйста, измените приведенную ниже строку кода в классе testBase

public  WebDriver driver;

На

public static WebDriver driver;

Попробуйте ниже в классе страницы:

В классе вашей страницы любезно создайте конструктор

WebDriver driver;

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