Java/Selenium中页面类初始化出现this.driver空指针报错是什么原因?
问题根本原因
Java类的实例初始化优先级为:成员变量的初始化赋值操作 > 构造方法内的代码执行
你的代码中所有Select类型的成员变量,都是在定义时直接通过driver.findElement()完成初始化,此时构造方法还没有执行到this.driver = driver赋值行,driver还是默认的null值,调用driver.findElement()自然会抛出空指针异常。
修复方案
有两种常用的适配方案:
方案1:把Select变量的初始化移到构造方法内
修改后的核心代码逻辑如下:
public class FlightDetailsPage { WebDriver driver; // 仅声明Select变量,暂不初始化 Select passengersSelect; Select departFromSelect; Select departMonthSelect; Select departDaySelect; Select arriveInSelect; Select returningMonthSelect; Select returningDaySelect; Select airlineSelect; //using the PageFactory method public FlightDetailsPage (WebDriver driver) { this.driver = driver; PageFactory.initElements (driver, this); // driver赋值完成后,再初始化所有Select变量 passengersSelect = new Select (driver.findElement (By.cssSelector ("select[name='passCount']"))); departFromSelect = new Select (driver.findElement (By.cssSelector ( "select[name='fromPort']"))); departMonthSelect = new Select (driver.findElement (By.cssSelector ("select[name='fromMonth']"))); departDaySelect = new Select (driver.findElement (By.cssSelector ("select[name='fromDay']"))); arriveInSelect = new Select (driver.findElement (By.cssSelector ("select[name='toPort']"))); returningMonthSelect = new Select (driver.findElement (By.cssSelector ("select[name='toMonth']"))); returningDaySelect = new Select (driver.findElement (By.cssSelector ("select[name='toDay']"))); airlineSelect = new Select (driver.findElement (By.cssSelector ("select[name='airline']"))); } // 剩余@FindBy注解的元素、业务方法不需要改动 }
方案2:用@FindBy注解搭配PageFactory统一管理下拉框
PageFactory本身原生支持直接注入Select类型的元素,代码更简洁:
// 直接给下拉框元素加@FindBy注解,声明为Select类型即可,不需要手动new Select @FindBy(css = "select[name='passCount']") Select passengersSelect; @FindBy(css = "select[name='fromPort']") Select departFromSelect; // 其余所有下拉框都按照上述格式声明即可
该方案不需要手动调用driver.findElement初始化,PageFactory.initElements方法会自动完成所有元素(包括Select类型)的初始化操作。
内容的提问来源于stack exchange,提问作者Eden Ilan
相关产品推荐
相关产品推荐

