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

添加TestNG 7.8与jcommander 1.7依赖后Selenium报错Input must be set

解决添加TestNG和jcommander依赖后触发的IllegalArgumentException问题

问题现象

在IntelliJ IDEA中开发自动化测试,添加TestNG 7.8和jcommander 1.7依赖前代码运行正常,添加后抛出如下错误:

Exception in thread "main" java.lang.IllegalArgumentException: Input must be set
    at org.openqa.selenium.internal.Require.nonNull(Require.java:60)
    at org.openqa.selenium.support.ui.FluentWait.<init>(FluentWait.java:93)
    at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:74)
    at org.openqa.selenium.support.ui.WebDriverWait.<init>(WebDriverWait.java:43)
    at org.example.AbstractObjectsUsed.<init>(AbstractObjectsUsed.java:18)
    at org.example.SingleCheckBoxDemo.<init>(SingleCheckBoxDemo.java:16)
    at org.example.Main.main(Main.java:36)

问题根源

Java类的成员变量初始化顺序优先于构造方法执行。在AbstractObjectsUsed类中,WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(50));作为成员变量,会在构造方法给this.driver = driver;赋值前执行,此时driver还是null。

添加依赖后,Selenium(可能因TestNG依赖传递更新了版本)的Require.nonNull检查严格生效,直接抛出非空参数异常。之前无依赖时可能因版本兼容未触发该检查,导致问题被隐藏。

解决方案

方案1:将WebDriverWait初始化移至构造方法

修改AbstractObjectsUsed类,先声明wait变量,再在构造方法中完成初始化(此时driver已被正确赋值):

public class AbstractObjectsUsed {
    WebDriver driver;
    WebDriverWait wait;

    public AbstractObjectsUsed(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver,this);
        // 在构造方法内初始化wait,确保driver不为null
        wait = new WebDriverWait(driver, Duration.ofSeconds(50));
    }

    public void waitForElementToAppear(By findBy)
    {
        wait.until(ExpectedConditions.visibilityOfElementLocated(findBy));
    }
}

方案2:使用懒加载延迟初始化WebDriverWait

如果不想在构造方法中初始化,可通过懒加载方式,在第一次调用waitForElementToAppear时再创建WebDriverWait实例:

public class AbstractObjectsUsed {
    WebDriver driver;
    private WebDriverWait wait;

    public AbstractObjectsUsed(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver,this);
    }

    private WebDriverWait getWait() {
        if (wait == null) {
            wait = new WebDriverWait(driver, Duration.ofSeconds(50));
        }
        return wait;
    }

    public void waitForElementToAppear(By findBy)
    {
        getWait().until(ExpectedConditions.visibilityOfElementLocated(findBy));
    }
}

额外优化:移除子类冗余的driver变量

SingleCheckBoxDemo类中声明的WebDriver driver属于冗余变量,父类AbstractObjectsUsed已持有该实例,可直接删除:

public class SingleCheckBoxDemo extends AbstractObjectsUsed{

    public SingleCheckBoxDemo(WebDriver driver){
        super(driver);
        PageFactory.initElements(driver,this);
    }

    public void SingleCheckBoxDemoStart() {
        InputFormLink.click();
        CheckBoxLink.click();
    }

    public void SingleCheckBoxDemoDemo() {
        CheckBox1.click();
        waitForElementToAppear(VerificationMessage);
        System.out.println(SuccessMessage);
    }

    public void SingleCheckBoxDemoClose(String Validation) {
        System.out.println(Validation);
    }
}

内容的提问来源于stack exchange,提问作者KrispyJuicy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:55:41