Selenium PageFactory如何抽象复用模态框公共字段避免重复声明
实现方案
你可以在BasePage和具体模态类之间新增一个抽象的公共模态父类,把所有模态通用的字段、通用操作都封装在这个类里,PageFactory的初始化逻辑会自动递归处理父类的@FindBy注解字段,不需要修改原有初始化逻辑。
步骤1:新增抽象公共模态父类BaseModal
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; public abstract class BaseModal extends BasePage { // 所有模态公共字段统一声明在这里,权限改为protected供子类访问 @FindBy(xpath = "//input[@placeholder='Name']") protected WebElement userName; @FindBy(xpath = "//input[@placeholder='Surname']") protected WebElement userSurname; // 通用的字段操作方法也可以放在这里,比如填充基础信息的公共方法 public void fillBasicInfo(String name, String surname) { userName.sendKeys(name); userSurname.sendKeys(surname); } // 继承父类的构造方法,保持原有初始化逻辑 public BaseModal(WebDriver driver) { super(driver); } }
步骤2:修改具体模态类,继承BaseModal去掉重复字段
模态1修改后代码
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; public class Modal1 extends BaseModal { // 只保留模态独有的字段 @FindBy(xpath = "//input[@placeholder='Age']") private WebElement age; public Modal1(WebDriver driver) { super(driver); } // 模态1的独有操作方法,公共字段可直接调用 public void submitForm(String name, String surname, int ageVal) { fillBasicInfo(name, surname); age.sendKeys(String.valueOf(ageVal)); // 省略提交逻辑 } }
模态2修改后代码
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; public class Modal2 extends BaseModal { // 只保留模态独有的字段 @FindBy(xpath = "//input[@placeholder='Country']") private WebElement country; public Modal2(WebDriver driver) { super(driver); } // 模态2的独有操作方法 public void submitForm(String name, String surname, String countryVal) { fillBasicInfo(name, surname); country.sendKeys(countryVal); // 省略提交逻辑 } }
方案说明
- 原有
BasePage的初始化逻辑完全不需要修改,PageFactory.initElements会自动扫描当前类以及所有父类中标记了@FindBy注解的字段并完成实例化 - 后续如果有其他通用字段、通用操作,直接加在
BaseModal里即可,所有子类都能直接复用 - 如果后续出现部分模态的公共字段定位有差异的情况,可配合
@FindAll注解兼容多场景,无需修改整体架构
内容的提问来源于stack exchange,提问作者Prozorov
相关产品推荐
相关产品推荐

