无法在Java中的子类中访问父类对象属性

时间:2017-08-18 12:36:04

标签: java selenium selenium-webdriver

我的问题很简单 我有父类,我在那里创建了一个新的webdriver类驱动程序对象 在我的子类中,我能够访问驱动程序对象,但其值为null 我无法访问对象属性 我的父类是

public class BaseTest {

    public static  WebDriver driver;
    @BeforeTest
    @Parameters("browser")
    public void  VerifyPageTitle(String browser)
    {
        if(browser.equalsIgnoreCase("chrome")){
            System.setProperty("webdriver.chrome.driver","C://chromedriver_win32(1)//chromedriver_win32//chromedriver.exe");
             driver = new ChromeDriver();
        }
        if(browser.equalsIgnoreCase("IE")){
            System.setProperty("webdriver.ie.driver","C://IEDriverServer_x64_3.3.0//IEDriverServer.exe");
            driver = new InternetExplorerDriver();
        }
        driver.manage().window().maximize();
    }
}

在我的子类代码中

public class SignPageTest extends BaseTest{

    SignPage obj ;
    Boolean stu;
    @Test
    public void navigateToSignPage(){
    obj = new SignPage(driver);
    stu = obj.navigateToSignIn();
    }
    @Test(priority=2)
    public void getHandles(){
        stu = obj.handlingWindows();
    }

}

我得到空指针,因为我的驱动程序没有初始化 所以请告诉我简单地获取超类

的对象属性的方法

当我将驱动程序设置为静态时,我能够在其他所有类中访问其属性,但我不希望它是静态的

1 个答案:

答案 0 :(得分:1)

问题在于您的测试代码。

您正在通过WebDriver带注释的方法初始化@BeforeTest实例。 TestNG仅针对每个@BeforeTest标记 ONCE 调用<test>方法。所以下面的组合(猜测就是你所拥有的)将导致第二类NullPointerException方法中的@Test

  • 您已SignPageTest延长BaseTest,并假设您有另一个名为SomeFlowTest的课程,该课程也会延伸BaseTest
  • 您创建的<test>包含SignPageTestSomeFlowTest

这会导致@BeforeTest仅对SignPageTest(或)SomeFlowTest执行一次(具体取决于<test>标记中出现的顺序) ,因为这两个类都是从同一个基类扩展而来的。因此,一旦TestNG通过VerifyPageTitle()执行SignPageTest,它就不会通过SomeFlowTest执行相同的方法,因此WebDriver的{​​{1}}实例为空。

要解决此问题,请将SomeFlowTest更改为@BeforeTest(每个测试类执行一次)或@BeforeClass(每个@BeforeMethod方法执行一次)。