Selenium脚本调用log4j Logger.info报空指针异常问题求助
Selenium自动化测试log4j日志空指针异常排查
前置已完成配置
- pom文件中已引入log4j的Maven依赖
- log4j配置文件已放置在项目主目录下
报错信息
java.lang.NullPointerException: Cannot invoke "org.apache.log4j.Logger.info(Object)" because "blocknet_maven_hybird_framework_v1.testcases.TC_login.logger" is null
根因分析
核心问题是变量作用域混淆:
- 你的
TC_login类中定义了名为logger的类成员变量,但在驱动初始化代码块中,重新写了Logger logger = Logger.getLogger(TC_login.class);,这行代码实际声明了一个和类成员同名的局部变量 - 初始化赋值操作只作用于方法内的局部
logger变量,类层面的成员变量logger从未被赋值,始终为null - 后续登录流程中调用
logger.info()时,JVM优先访问类成员变量,拿到null值就触发了空指针异常
额外发现一处逻辑错误:代码中设置的隐式等待implicitlyWait(3000,TimeUnit.SECONDS)代表等待3000秒(约50分钟),属于单位和数值匹配错误,正常3秒隐式等待应写为implicitlyWait(3,TimeUnit.SECONDS)。
修复步骤
- 调整logger变量的赋值逻辑,不要在初始化方法内声明同名局部变量,直接给类成员变量赋值,修正后的代码参考:
public class TC_login { // 类层面统一声明成员变量 WebDriver driver; Logger logger; // 驱动初始化方法(对应@BeforeTest/setup注解修饰的初始化逻辑) public void initDriver() { driver = new ChromeDriver(); // 去掉前面的Logger类型声明,直接给类成员变量赋值 logger = Logger.getLogger(TC_login.class); PropertyConfigurator.configure("Log4j.properties"); // 修正隐式等待参数 driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); } // 登录测试用例逻辑 public void testLogin() { login_page lp = new login_page(driver); lp.setUserName(username); logger.info("username entered"); lp.setPassword(password); lp.clickSubmit(); Assert.assertEquals(driver.getTitle(), "EveryCred"); } }
- 编译项目后确认
Log4j.properties文件被打包到类加载路径下,避免配置文件读取失败的衍生问题。
内容的提问来源于stack exchange,提问作者maxl
相关产品推荐
相关产品推荐

