无法访问Java中子类中的父类对象属性
我的问题很简单 我有一个父类,我在那里创建了一个webdriver类的新驱动程序对象 在我的子类中,我可以访问driver对象,但其值为null 我无法访问对象属性 我的家长班是无法访问Java中子类中的父类对象属性,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我的问题很简单 我有一个父类,我在那里创建了一个webdriver类的新驱动程序对象 在我的子类中,我可以访问driver对象,但其值为null 我无法访问对象属性 我的家长班是 public class BaseTest { public static WebDriver driver; @BeforeTest @Parameters("browser") public void VerifyPageTitle(String browser) {
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();
}
}
由于我的驱动程序未初始化,我得到的是空指针
所以,请告诉我如何简单地访问超类的对象属性
当我将驱动程序设置为静态时,我可以在所有其他类中访问它的属性,但我不希望它是静态的,问题在于测试代码 您正在通过
@BeforeTest
注释方法初始化WebDriver
实例。TestNG仅对每个
标记调用@BeforeTest
方法一次。因此,下面的组合(我猜是您拥有的)将在第二类的@Test
方法中导致NullPointerException
- 您有
extendSignPageTest
,假设您有另一个名为BaseTest
的类,它也扩展了SomeFlowTest
BaseTest
- 您已经创建了一个
,其中包括
和SignPageTest
SomeFlowTest
@BeforeTest
对于SignPageTest
(或)SomeFlowTest
(取决于它们在
标记中出现的顺序)只执行一次,因为这两个类都从相同的基类扩展而来。因此,一旦TestNG通过SignPageTest
执行VerifyPageTitle()
,它将不会通过SomeFlowTest
执行相同的方法,因此SomeFlowTest
的WebDriver
实例为空
要解决此问题,请将
@BeforeTest
更改为@BeforeClass
(每个测试类执行一次)或@beforethod
(为每个@test
方法执行一次).在哪一行出现空指针异常?请看,我在子类中能够访问的驱动程序甚至还没有初始化,当该对象被用于执行任何操作时,就会出现空指针。在我的情况下,它在我的页面类中可能重复您的操作是100%正确的,你已经准确地告诉了问题,我也试过了,但是这种做法有一个问题,你的新驱动程序每次都会被创建,所以在这种情况下,每个类或方法都会创建新的浏览器,我不希望创建新的浏览器,我想使用相同的webdriver。@abishekkachroo-如果您想创建一次webdriver实例并在其他地方共享,那么您应该尝试利用Singleton模式,其中对它的第一次调用将导致浏览器被实例化,其余所有调用将只使用已创建的实例。创建调用可以从@BeforeTest
方法中触发,其余代码只需调用getter()
方法即可。