使用Appium结合PageFactory时遭遇java.lang.ExceptionInInitializerError问题
问题分析与解决办法
错误原因
java.lang.ExceptionInInitializerError 在这里的核心触发场景有以下几种:
- Driver未完成初始化就调用PageFactory:Login类的构造函数执行时,
Appdrivers.getDriver()返回了null,导致AppiumFieldDecorator无法正常初始化代理对象。通常是因为测试代码中先实例化Login对象,后调用launchIFMIS方法初始化Driver。 - Appium Java Client与Selenium版本不兼容:ProxyFactory类依赖的字节码增强库(如CGLIB/ASM)版本冲突,或者Appium客户端与Selenium核心库版本不匹配,导致静态初始化块执行失败。
- 冗余的Driver定义导致混淆:Baseclass中同时定义了静态
AndroidDriver和继承自Appdrivers的ThreadLocal Driver,两处Driver管理逻辑冲突,可能导致实际使用的Driver未正确设置。
解决步骤
1. 确保Driver初始化时机优先于PageFactory初始化
在测试类中,必须先调用launchIFMIS完成Driver的创建和上下文切换,再实例化Login对象:
// 测试类示例 public class Login_Test { @Test public void login() { Baseclass base = new Baseclass(); base.launchIFMIS(); // 先初始化Driver Login loginPage = new Login(); // 再创建页面对象 // 后续测试逻辑 } }
2. 统一Driver管理逻辑,移除冗余定义
删除Baseclass中的静态AndroidDriver,统一使用Appdrivers的ThreadLocal Driver,避免逻辑冲突:
public class Baseclass extends Appdrivers { public void launchIFMIS() { String androidVersion = "13"; String deviceName = "IFMIS"; String platformName = "Android"; try { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("VERSION", androidVersion); capabilities.setCapability("deviceName", deviceName); capabilities.setCapability("platformName", platformName); capabilities.setCapability("appPackage", "com.pixelvide.ifmis.finance"); capabilities.setCapability("autoGrantPermissions", true); capabilities.setCapability("appActivity", "com.pixelvide.ifmis.finance.MainActivity"); // 直接创建并设置到ThreadLocal AndroidDriver<MobileElement> driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); Appdrivers.setDriver(driver); Set<String> contextNames = driver.getContextHandles(); // 增加判断,避免数组越界(比如WEBVIEW未加载时) if (contextNames.size() > 1) { driver.context((String) contextNames.toArray()[1]); } } catch (Exception e) { Reporter.log(e.getMessage()); e.printStackTrace(); } } }
3. 检查并修复版本兼容性
确保Appium Java Client与Selenium版本匹配,例如:
- 如果使用Appium Java Client 8.x,需搭配Selenium 4.x(如
selenium-java:4.9.0对应appium-java-client:8.5.1) - 移除项目中冲突的ASM/CGLIB依赖,确保依赖树中只有一套字节码增强库
4. 优化PageFactory初始化逻辑
移除构造函数中的异常捕获,让错误直接暴露,同时增加Driver非空判断:
public class Login extends Baseclass { @FindBy(xpath = "//input[@placeholder='Enter Username']") public WebElement username; @FindBy(xpath = "(//*[@name='password'])[2]") public WebElement password; @FindBy(xpath = "//*[@type='submit']") public WebElement login; public Login() { WebDriver driver = Appdrivers.getDriver(); if (driver == null) { throw new IllegalStateException("Driver未初始化,请先调用launchIFMIS方法"); } PageFactory.initElements(new AppiumFieldDecorator(driver), this); } }
内容的提问来源于stack exchange,提问作者Karthik V T
相关产品推荐
相关产品推荐

