You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Appium结合PageFactory时遭遇java.lang.ExceptionInInitializerError问题

问题分析与解决办法

错误原因

java.lang.ExceptionInInitializerError 在这里的核心触发场景有以下几种:

  1. Driver未完成初始化就调用PageFactory:Login类的构造函数执行时,Appdrivers.getDriver()返回了null,导致AppiumFieldDecorator无法正常初始化代理对象。通常是因为测试代码中先实例化Login对象,后调用launchIFMIS方法初始化Driver。
  2. Appium Java Client与Selenium版本不兼容:ProxyFactory类依赖的字节码增强库(如CGLIB/ASM)版本冲突,或者Appium客户端与Selenium核心库版本不匹配,导致静态初始化块执行失败。
  3. 冗余的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:55:54