执行我的测试时获得 java.lang.ExceptionInInitializerError
Getting java.lang.ExceptionInInitializerError when executing my Test
这是我为 table
中的所有记录查找 WebElement 的代码
private final static List<WebElement> listOfJobs =
(List<WebElement>) By.xpath("//*[@id='resultTable']//tbody/tr//a");
我的 getter 访问私有 WebElement 的方法
public static List<WebElement> getListOfJobs()
{
return listOfJobs;
}
这是我创建的函数,用于收集列表 table 中的所有记录
@SuppressWarnings("null")
public static List<String> listOfJobs()
{
List<String> jobs = null;
for(int i=0; i < OrangeHRMAddJobCategories.getListOfJobs().size(); i++)
{
jobs.add(OrangeHRMAddJobCategories.getListOfJobs().get(i).getText());
}
return jobs;
}
这是我的测试执行
OrangeHRMAddJobCategories jobCategories = new OrangeHRMAddJobCategories();
jobCategories.clickJobTab().clickJobCategoires().clickAdd().setJobCategoryName(map.get("categoryname")).saveJobCategory();
Assertions.assertThat(UsefulFunctionUtils.listOfJobs().contains(map.get("categoryname")));
现在我在创建对象 jobCategories 时遇到错误 java.lang.ExceptionInInitializerError。我的 WebElement 声明有问题吗?因为当我这样写我的代码时它执行成功了,但我不想这样做,我想使用 By abstract class
public static List<WebElement> listOfJobs = driver.findElements(By.xpath(("//*[@id='resultTable']//tbody/tr//a")));
public static List<WebElement> getListOfJobs()
{
return listOfJobs;
}
完整的堆栈跟踪
java.lang.ExceptionInInitializerError
at com.digicorp.testcases.TC_AddJobCategory.testAddJobCategory(TC_AddJobCategory.java:27)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:598)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at org.testng.TestRunner.privateRun(TestRunner.java:794)
at org.testng.TestRunner.run(TestRunner.java:596)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:377)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332)
at org.testng.SuiteRunner.run(SuiteRunner.java:276)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1134)
at org.testng.TestNG.runSuites(TestNG.java:1063)
at org.testng.TestNG.run(TestNG.java:1031)
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.ClassCastException: class org.openqa.selenium.By$ByXPath cannot be cast to class java.util.List (org.openqa.selenium.By$ByXPath is in unnamed module of loader 'app'; java.util.List is in module java.base of loader 'bootstrap')
at com.digicorp.pageobjects.OrangeHRMAddJobCategories.<clinit>(OrangeHRMAddJobCategories.java:19)
... 29 more
解释在异常堆栈跟踪中:
class org.openqa.selenium.By$ByXPath cannot be cast to class java.util.List
错误在类型转换中:
private final static List<WebElement> listOfJobs =
(List<WebElement>) By.xpath("//*[@id='resultTable']//tbody/tr//a");
您不能将定位器转换为 List
。类型不相关。
相反,您需要在 By.xpath(...)
定位器上调用 driver.findElements
。如此处所述:
但是 driver
值可能不可用,所以这意味着这不能在静态初始化时完成。这反过来意味着 listOfJobs
不能是 static final
.
我的建议...是避免对这种事情使用 static
字段和方法。
Caused by: java.lang.ClassCastException: class
org.openqa.selenium.By$ByXPath cannot be cast to class java.util.List
您正在将 List
转换为 WebElement
,这是不可接受的。
您的代码:
private final static List<WebElement> listOfJobs =
(List<WebElement>) By.xpath("//*[@id='resultTable']//tbody/tr//a");
Why do you want to cast List
class?
我们有 findElements
方法来 return 元素列表,因此您可以使用它。
更新代码:
private final static List<WebElement> listOfJobs =
driver.findElements(By.xpath("//*[@id='resultTable']//tbody/tr//a"));
这是我为 table
中的所有记录查找 WebElement 的代码private final static List<WebElement> listOfJobs =
(List<WebElement>) By.xpath("//*[@id='resultTable']//tbody/tr//a");
我的 getter 访问私有 WebElement 的方法
public static List<WebElement> getListOfJobs()
{
return listOfJobs;
}
这是我创建的函数,用于收集列表 table 中的所有记录
@SuppressWarnings("null")
public static List<String> listOfJobs()
{
List<String> jobs = null;
for(int i=0; i < OrangeHRMAddJobCategories.getListOfJobs().size(); i++)
{
jobs.add(OrangeHRMAddJobCategories.getListOfJobs().get(i).getText());
}
return jobs;
}
这是我的测试执行
OrangeHRMAddJobCategories jobCategories = new OrangeHRMAddJobCategories();
jobCategories.clickJobTab().clickJobCategoires().clickAdd().setJobCategoryName(map.get("categoryname")).saveJobCategory();
Assertions.assertThat(UsefulFunctionUtils.listOfJobs().contains(map.get("categoryname")));
现在我在创建对象 jobCategories 时遇到错误 java.lang.ExceptionInInitializerError。我的 WebElement 声明有问题吗?因为当我这样写我的代码时它执行成功了,但我不想这样做,我想使用 By abstract class
public static List<WebElement> listOfJobs = driver.findElements(By.xpath(("//*[@id='resultTable']//tbody/tr//a")));
public static List<WebElement> getListOfJobs()
{
return listOfJobs;
}
完整的堆栈跟踪
java.lang.ExceptionInInitializerError
at com.digicorp.testcases.TC_AddJobCategory.testAddJobCategory(TC_AddJobCategory.java:27)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:598)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at org.testng.TestRunner.privateRun(TestRunner.java:794)
at org.testng.TestRunner.run(TestRunner.java:596)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:377)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332)
at org.testng.SuiteRunner.run(SuiteRunner.java:276)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1134)
at org.testng.TestNG.runSuites(TestNG.java:1063)
at org.testng.TestNG.run(TestNG.java:1031)
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.ClassCastException: class org.openqa.selenium.By$ByXPath cannot be cast to class java.util.List (org.openqa.selenium.By$ByXPath is in unnamed module of loader 'app'; java.util.List is in module java.base of loader 'bootstrap')
at com.digicorp.pageobjects.OrangeHRMAddJobCategories.<clinit>(OrangeHRMAddJobCategories.java:19)
... 29 more
解释在异常堆栈跟踪中:
class org.openqa.selenium.By$ByXPath cannot be cast to class java.util.List
错误在类型转换中:
private final static List<WebElement> listOfJobs =
(List<WebElement>) By.xpath("//*[@id='resultTable']//tbody/tr//a");
您不能将定位器转换为 List
。类型不相关。
相反,您需要在 By.xpath(...)
定位器上调用 driver.findElements
。如此处所述:
但是 driver
值可能不可用,所以这意味着这不能在静态初始化时完成。这反过来意味着 listOfJobs
不能是 static final
.
我的建议...是避免对这种事情使用 static
字段和方法。
Caused by: java.lang.ClassCastException: class org.openqa.selenium.By$ByXPath cannot be cast to class java.util.List
您正在将 List
转换为 WebElement
,这是不可接受的。
您的代码:
private final static List<WebElement> listOfJobs =
(List<WebElement>) By.xpath("//*[@id='resultTable']//tbody/tr//a");
Why do you want to cast
List
class?
我们有 findElements
方法来 return 元素列表,因此您可以使用它。
更新代码:
private final static List<WebElement> listOfJobs =
driver.findElements(By.xpath("//*[@id='resultTable']//tbody/tr//a"));