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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:27:04