我的问题很简单 我有父类,我在那里创建了一个新的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();
}
}
我得到空指针,因为我的驱动程序没有初始化 所以请告诉我简单地获取超类
的对象属性的方法当我将驱动程序设置为静态时,我能够在其他所有类中访问其属性,但我不希望它是静态的
答案 0 :(得分:1)
问题在于您的测试代码。
您正在通过WebDriver
带注释的方法初始化@BeforeTest
实例。 TestNG仅针对每个@BeforeTest
标记 ONCE 调用<test>
方法。所以下面的组合(猜测就是你所拥有的)将导致第二类NullPointerException
方法中的@Test
。
SignPageTest
延长BaseTest
,并假设您有另一个名为SomeFlowTest
的课程,该课程也会延伸BaseTest
<test>
包含SignPageTest
和SomeFlowTest
。这会导致@BeforeTest
仅对SignPageTest
(或)SomeFlowTest
执行一次(具体取决于<test>
标记中出现的顺序) ,因为这两个类都是从同一个基类扩展而来的。因此,一旦TestNG通过VerifyPageTitle()
执行SignPageTest
,它就不会通过SomeFlowTest
执行相同的方法,因此WebDriver
的{{1}}实例为空。
要解决此问题,请将SomeFlowTest
更改为@BeforeTest
(每个测试类执行一次)或@BeforeClass
(每个@BeforeMethod
方法执行一次)。