将驱动程序/对象传递给其他页面/类 - java.lang.NullPointerException

时间:2016-01-30 15:38:10

标签: java selenium testing selenium-webdriver

我无法将驱动程序/对象传递给下一个类/页面,并且在第一个/开始类中具有相同的NullPointerException。

PageObject类 - SearchResultsPage:

public class SearchResultsPage extends BasePage{

    @FindBy(xpath = "//*[@data-original-title=\"Compare this Product\"]")
    List <WebElement> compareButton;

    @FindBy(partialLinkText = "Product Compare")
    WebElement urlComparePage;

    public SearchResultsPage(WebDriver driver) {
        super(driver);
        PageFactory.initElements(driver, this);
    }   
    public void compareItems(){
        for(WebElement compareButtons: compareButton){
            compareButtons.click();
        }
    }

    public void goToComparePage(){
        urlComparePage.click();

    }
}

PageObject类主页:

public class HomePage extends BasePage{

    public HomePage(WebDriver driver) {
        super(driver);
        PageFactory.initElements(driver, this);
    }
    public String PAGE_TITLE = "Your Store";
    WebDriver driver;   
    @FindBy(className = "input-lg")
    WebElement inputSearch; 
    @FindBy(className = "btn-lg")
    WebElement searchButton;        

    public void isHomePage(){
        String pageTitle = driver.getTitle();
        Assert.assertEquals(pageTitle, PAGE_TITLE);
    }

    public void inputIntoSearch(){
        String itemName = "ipod";
        inputSearch.sendKeys(itemName);
    }

    public  SearchResultsPage clickSearchButton(){
        searchButton.click();
        return PageFactory.initElements(driver, SearchResultsPage.class);
    }
}

测试类:

public class MainPage {
    HomePage hp;
    TopNavigation topNav;
    ComparePage cp;
    SearchResultsPage srp;

    @BeforeTest
    public void setUp(){
    WebDriver driver = new FirefoxDriver();
    driver.get("http://demo.opencart.com/");
    driver.manage().window().maximize();
    hp =  PageFactory.initElements(driver, HomePage.class);
    topNav = PageFactory.initElements(driver, TopNavigation.class);
    cp = PageFactory.initElements(driver, ComparePage.class);
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    }

    @Test(priority = 0)
    public void checkIsHomePage(){
        hp.isHomePage();
    }

    @Test
    public void changeCurrency(){
        topNav.clickButtonChangeCurrency();
        topNav.setCurrency();
    }
    @Test
    public void searchProducts(){
        hp.inputIntoSearch();
        hp.clickSearchButton();
    }
    @Test
    public void addToCompare(){
        srp.compareItems();
    }
}

我有2个问题:

1.当我运行测试checkIsHomePage() - FAILS(NullPointerException) 和changeCurrency()通过。我不知道如果这两个方法在同一个PageObiect类 - HomePage中,为什么第一次测试失败。有什么问题?

2.当searchProduct方法通过我想使用addToCompare()比较产品,但我不知道如何使用PageFactory.initelements在页面上进行搜索结果的测试。我该怎么做?

---------------------------------------修订------- --------------------- 好吧,我知道它不起作用的原因。它的基类(BasePage)。我用PageObjest和构造函数和超级(驱动程序)扩展了所有类。当我在PageObject类中删除“extends”和“super”并使用(this.driver = driver)时,它现在正在工作。但是我用这个基类做了什么呢?

--------------------------------------------- UPDATED- ------------------------------ 我的BasePage现在很差:

public class BasePage {
 WebDriver driver;
 public BasePage(WebDriver driver){
        this.driver=driver;
 }

}

1 个答案:

答案 0 :(得分:1)

根本问题是,HomePage显然是为了推迟BasePage(尽管你在代码段中也称它为MainPage):它的构造函数传递WebDriver实例到super(),但它有自己的WebDriver driver成员变量永远不会被设置,并且在调用isHomePage()时它将为null。您应该使用父类中的WebDriver实例,并从子类中删除“masking”声明。