使用AppiumFieldDecorator与@AndroidFindBy触发ExceptionInInitializerError求助
问题描述
我是Appium新手,正在进行安卓App自动化测试。使用PageFactory.initElements(driver, this);配合@FindBy注解时代码可正常运行,但改用PageFactory.initElements(new AppiumFieldDecorator(driver), this);配合@AndroidFindBy注解时出现异常。
页面对象类代码
public class Page1 { // page object class public static AppiumDriver driver; public Page1(AppiumDriver driver) { PageFactory.initElements(new AppiumFieldDecorator(driver), this); this.driver = driver; } @AndroidFindBy(id = "com.tva.z5:id/homeIcon") public WebElement homeIcon; public void logo() { homeIcon.click(); } }
测试类代码
package appiumtests; // this is my test import org.testng.annotations.Test; import pages.Weyyak_Page1; import static pages.Weyyak_Page1.driver; public class Test1 { @Test public void test() throws InterruptedException { Page1 lg = new Page1(driver); lg.logo(); Thread.sleep(5000); } }
触发的异常信息
顶层异常栈
java.lang.ExceptionInInitializerError at io.appium.java_client.pagefactory.utils.ProxyFactory.getEnhancedProxy(ProxyFactory.java:53) at io.appium.java_client.pagefactory.utils.ProxyFactory.getEnhancedProxy(ProxyFactory.java:33) at io.appium.java_client.pagefactory.AppiumFieldDecorator.proxyForAnElement(AppiumFieldDecorator.java:209) at io.appium.java_client.pagefactory.AppiumFieldDecorator.access$000(AppiumFieldDecorator.java:61) at io.appium.java_client.pagefactory.AppiumFieldDecorator$1.proxyForLocator(AppiumFieldDecorator.java:100) at org.openqa.selenium.support.pagefactory.DefaultFieldDecorator.decorate(DefaultFieldDecorator.java:63) at io.appium.java_client.pagefactory.AppiumFieldDecorator.decorate(AppiumFieldDecorator.java:147) at org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:111) at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:103) at pages.Weyyak_Page1.<init>(Weyyak_Page1.java:15) at appiumtests.Weyyak_Test1.test(Weyyak_Test1.java:14) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139) at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:677) at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:221) at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50) at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:962) at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:194) at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148) at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.testng.TestRunner.privateRun(TestRunner.java:806) at org.testng.TestRunner.run(TestRunner.java:601) at org.testng.SuiteRunner.runTest(SuiteRunner.java:433) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:427) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:387) at org.testng.SuiteRunner.run(SuiteRunner.java:330) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1256) at org.testng.TestNG.runSuitesLocally(TestNG.java:1176) at org.testng.TestNG.runSuites(TestNG.java:1099) at org.testng.TestNG.run(TestNG.java:1067) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
嵌套异常(代码生成异常)
Caused by: net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InaccessibleObjectException-->Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @79698539 at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:464) at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:339) at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:96) at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:94) at net.sf.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at net.sf.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61) at net.sf.cglib.core.internal.LoadingCache.get(LoadingCache.java:34) at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:119) at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:294) at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:221) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:174) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:153) at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:73) ... 36 more
根因异常(模块访问权限问题)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @79698539 at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:200) at java.base/java.lang.reflect.Method.setAccessible(Method.java:194) at net.sf.cglib.core.ReflectUtils$1.run(ReflectUtils.java:61) at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) at net.sf.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:52) at net.sf.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:243) at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:332) ... 48 more
解决方案
原因分析
该异常是JDK9+模块化机制与旧版本cglib库不兼容导致的。Appium PageFactory依赖cglib生成动态代理,但旧版cglib无法在模块化JDK环境下访问java.lang.ClassLoader的保护方法。
解决步骤
- 升级Appium Java Client版本:使用支持JDK9+的最新稳定版(如8.0.0及以上),新版本已修复该兼容性问题,替换了依赖的cglib组件。
- 添加JVM启动参数:若暂时无法升级依赖,可在测试启动时添加以下参数开放模块访问权限:
在IDEA中可通过--add-opens java.base/java.lang=ALL-UNNAMEDRun/Debug Configurations-> 选择对应测试配置 ->VM options中添加该参数。 - 修复代码初始化问题:测试类中直接引用静态
driver可能存在未初始化就传入的问题,建议在测试类中先完成driver的初始化,再传入Page1构造方法。
内容的提问来源于stack exchange,提问作者user20372179
相关产品推荐
相关产品推荐

