添加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
相关产品推荐
相关产品推荐

