无法将变量(声明的WebElement)与Selenium中超类的最终关键字一起使用



我有一个超类,我的目的是将一个类中的WebElement声明为final,并在子类中使用它们。

下面是父类名ObjectRepo,我在其中声明了所有 WebElement 路径。我正在尝试使用子类中的元素,但我在运行时看到 Nullpointer 异常。

当所有driver.findElements都在代码中时,代码更早工作,但是当我将其分离到不同的类中时,问题就开始了。我可以弄清楚这是由于驱动程序为空,但无法修复它。

我在超类的第一行看到空指针错误——

final WebElement SignIn_SignUp_button = ObjectRepo.driver.findElement(By.xpath("//button[text()='SIGN IN / SIGN UP']"));

我尝试检查我的驱动程序是否在任何时候为空并修复它,但没有工作。

父类:

public class ObjectRepo {
static WebDriver driver;
public ObjectRepo()
{
// ------------- UIElement of the page ------
final WebElement SignIn_SignUp_button = ObjectRepo.driver.findElement(By.xpath("//button[text()='SIGN IN / SIGN UP']"));
final WebElement EmailField_OnSignIn =ObjectRepo.driver.findElement(By.xpath("//input[@type='email']"));
final WebElement ContinueButton_OnSignIn=ObjectRepo.driver.findElement(By.xpath("//button[text()='Continue']"));
final WebElement PasswordField_OnSignIn=ObjectRepo.driver.findElement(By.xpath("//input[@placeholder='Enter your password']"));
final WebElement ContinueButton_OnPasswordPage=ObjectRepo.driver.findElement(By.xpath("//button[@type='submit' and text()='Continue']"));

//Navbar Elements + MainPage Elements
final WebElement UsernameMenu_Navbar=ObjectRepo.driver.findElement(By.xpath("//div[@class='navbar-link']"));
final WebElement ManagementConsoleMenu_UnderNavbar=ObjectRepo.driver.findElement(By.xpath("//a[@class='navbar-link' and text()='Management Console']"));
final WebElement Logout_UnderNavbar=ObjectRepo.driver.findElement(By.xpath("//a[@class='navbar-link' and text()='Logout']"));
final WebElement StudentMenu=ObjectRepo.driver.findElement(By.xpath("//a[text()='Students']"));

//Management Console Elements 
final WebElement DivisionCard_OnManagementConsolePage=ObjectRepo.driver.findElement(By.xpath("//p[text()='Divisions, Classes & Groups']"));
}

My Subclass is as below:

public class CommonActions extends ObjectRepo 
{
ObjectRepo obj=new ObjectRepo();
public void LaunchUrl() throws InterruptedException, IOException
{
FileInputStream inputStream = new FileInputStream(syspath + "/InputData/InputData.xlsx");       
workbook=new XSSFWorkbook(inputStream);
UserCred=workbook.getSheet("UserCred");
Browser=workbook.getSheet("Browser");
Env=workbook.getSheet("Env");
StudentList=workbook.getSheet("StudentList");
os=System.getProperty("os.name").toLowerCase();
System.out.println(os);
if(driver == null)
{
if(Browser.getRow(0).getCell(1).getStringCellValue().contains("Chrome"))
{
if(os.contains("windows"))
{System.setProperty("webdriver.chrome.driver", syspath + "/Web Driver Exe/chromedriver.exe");}
else
{System.setProperty("webdriver.chrome.driver", syspath + "/Web Driver Exe/chromedriver");}
ChromeOptions options = new ChromeOptions();
options.addArguments("--use-fake-ui-for-media-stream=1");       
options.addArguments("--lang=en");              
driver = new ChromeDriver(options);
Thread.sleep(1000);
}
else if (Browser.getRow(0).getCell(1).getStringCellValue().contains("Firefox"))
{
if(os.contains("windows"))
{System.setProperty("webdriver.gecko.driver", syspath + "/Web Driver Exe/geckodriver.exe");}
else
{System.setProperty("webdriver.gecko.driver", syspath + "/Web Driver Exe/geckodriver");}
FirefoxOptions ffoptions= new FirefoxOptions();
ffoptions.addPreference("permissions.default.microphone", 1);
ffoptions.addPreference("permissions.default.camera", 1);   
ffoptions.addPreference( "intl.accept_languages", "en" ); 
ffoptions.addPreference("browser.download.folderList", 2);
ffoptions.addPreference("browser.download.dir", "syspath");
ffoptions.addPreference("browser.download.useDownloadDir", true);
ffoptions.addPreference("browser.helperApps.neverAsk.saveToDisk", "text/csv");

driver=new FirefoxDriver(ffoptions);
Thread.sleep(1000);
}
else
{
System.out.println("No Env selected");
}
}
//Launch Url
driver.navigate().to(Env.getRow(0).getCell(1).getStringCellValue());
driver.manage().window().maximize();
Thread.sleep(1000);
QuinnActualTitle=driver.getTitle();
}

public void InvokeExcel() throws IOException
{
FileInputStream inputStream = new FileInputStream(syspath + "/InputData/InputData.xlsx");       
workbook=new XSSFWorkbook(inputStream);
UserCred=workbook.getSheet("UserCred");
Browser=workbook.getSheet("Browser");
Env=workbook.getSheet("Env");
}
public void CloseExcel() throws IOException
{
FileOutputStream fileOut = new FileOutputStream(syspath + "/InputData/InputData.xlsx");
workbook.write(fileOut);
workbook.close();
fileOut.close();
}
public void Completed()
{
driver.close();
//driver.quit();
}
public void UniversityAdminLogin(int a, int b) throws InterruptedException, IOException
{
SignIn_SignUp_button.click();   //This is where i m trying to use the declared element
Thread.sleep(1000);
EmailField_OnSignIn.sendKeys(UserCred.getRow(a).getCell(b).getStringCellValue());
Thread.sleep(1000);
ContinueButton_OnSignIn.click();
Thread.sleep(2000);
PasswordField_OnSignIn.sendKeys(UserCred.getRow(a).getCell(b+1).getStringCellValue());
ContinueButton_OnPasswordPage.click();
Thread.sleep(2000);
}

But i see the error while instantiating :
[RemoteTestNG] detected TestNG version 7.0.0
org.testng.TestNGException: 
Cannot instantiate class SmokeRun.SmokeSuite
at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:30)
at org.testng.internal.InstanceCreator.instantiateUsingDefaultConstructor(InstanceCreator.java:193)
at org.testng.internal.InstanceCreator.createInstanceUsingObjectFactory(InstanceCreator.java:113)
at org.testng.internal.InstanceCreator.createInstance(InstanceCreator.java:79)
at org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:114)
at org.testng.internal.ClassImpl.getInstances(ClassImpl.java:172)
at org.testng.TestClass.getInstances(TestClass.java:102)
at org.testng.TestClass.initTestClassesAndInstances(TestClass.java:82)
at org.testng.TestClass.init(TestClass.java:74)
at org.testng.TestClass.<init>(TestClass.java:39)
at org.testng.TestRunner.initMethods(TestRunner.java:463)
at org.testng.TestRunner.init(TestRunner.java:342)
at org.testng.TestRunner.init(TestRunner.java:295)
at org.testng.TestRunner.<init>(TestRunner.java:226)
at org.testng.remote.support.RemoteTestNG6_12$1.newTestRunner(RemoteTestNG6_12.java:33)
at org.testng.remote.support.RemoteTestNG6_12$DelegatingTestRunnerFactory.newTestRunner(RemoteTestNG6_12.java:66)
at org.testng.SuiteRunner$ProxyTestRunnerFactory.newTestRunner(SuiteRunner.java:679)
at org.testng.SuiteRunner.init(SuiteRunner.java:196)
at org.testng.SuiteRunner.<init>(SuiteRunner.java:127)
at org.testng.TestNG.createSuiteRunner(TestNG.java:1265)
at org.testng.TestNG.createSuiteRunners(TestNG.java:1244)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1093)
at org.testng.TestNG.runSuites(TestNG.java:1032)
at org.testng.TestNG.run(TestNG.java:1000)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:23)
... 26 more
Caused by: java.lang.NullPointerException
at Sources.ObjectRepo.<init>(ObjectRepo.java:15)
at Sources.CommonActions.<init>(CommonActions.java:48)
at SmokeRun.SmokeSuite.<init>(SmokeSuite.java:12)
... 31 more

查看代码,我认为问题是当您通过以下方式构造新ObjectRepo时:ObjectRepo obj=new ObjectRepo(),驱动程序尝试查找这些最终元素,但它未能这样做,因为驱动程序初始化在您的子类的正下方完成。因此,从我所看到的来看,您对驱动程序null的假设是正确的。

我的建议是使用调试器,在失败的行处放置一个断点,并检查驱动程序是否null。我相信你正在使用某种IDE,所以看看这里:如果你正在使用eclipse,https://www.eclipse.org/community/eclipse_newsletter/2017/june/article1.php,或者这里:如果你使用IDEA,https://www.jetbrains.com/help/idea/debugging-code.html。

最新更新