如何不重复字段声明(Selenium)

Posted

技术标签:

【中文标题】如何不重复字段声明(Selenium)【英文标题】:How to not duplicate fields declaration (Selenium) 【发布时间】:2021-12-08 22:58:47 【问题描述】:

网站由许多模态表单组成,所有模态表单都具有相同的输入字段,例如:姓名和姓氏,但是这些模态表单确实具有特定模态表单独有的元素,例如:

模态窗口 1 包括:姓名、姓氏和年龄 模态窗口 2 包括:姓名、姓氏和国家

当一个或另一个模态加载时,我将如何抽象名称和姓氏并同时使它们贪得无厌。我目前的方法是重复元素并使用页面工厂来实例化那些一旦创建模态对象。

模态 1

@FindBy(xpath = "//input[@placeholder='Name']")
private WebElement userName;

@FindBy(xpath = "//input[@placeholder='Surname']")
private WebElement userSurname;

@FindBy(xpath = "//input[@placeholder='Age']")
private WebElement age;

模态2

@FindBy(xpath = "//input[@placeholder='Name']")
private WebElement userName;

@FindBy(xpath = "//input[@placeholder='Surname']")
private WebElement userSurname;

@FindBy(xpath = "//input[@placeholder='Country']")
private WebElement country;

这两种模式都从基本页面扩展,以便调用父级并且页面工厂为我的字段创建对象

public class BasePage 

    public WebDriver driver;
    protected Wait wait;

    public BasePage(WebDriver driver) 
        initializePage(driver);
        this.wait = new Wait(driver);
    

    final protected void initializePage(WebDriver driver) 
        this.driver = driver;
        PageFactory.initElements(new AjaxElementLocatorFactory(driver, 20), this);
    

我不想重复字段并将它们抽象到某个地方,所以请有经验的人帮帮我。

【问题讨论】:

为什么不创建一个 BaseModal 来扩展 BasePage 并且可以作为更具体模型零件的父级? @AlexeyR 感谢您的回答,好吧,如果我不仅有模态,而且还有网络上的表格,该名字和姓氏又出现了怎么办? 【参考方案1】:

处理PageFactory 工具中的“字段重复”的唯一方法是构建类层次结构。喜欢:

class BaseModal extends BasePage
    @FindBy(xpath = "//input[@placeholder='Name']")
    protected WebElement userName;
    
    @FindBy(xpath = "//input[@placeholder='Surname']")
    protected WebElement userSurname;

如果您担心树过于复杂,您可以考虑使用单独的页面初始化机制,这样您就不会绑定到根页面类。喜欢:

class BaseModal 
    @FindBy(xpath = "//input[@placeholder='Name']")
    protected WebElement userName;
    
    @FindBy(xpath = "//input[@placeholder='Surname']")
    protected WebElement userSurname;


class SpecificModal extends BaseModal 
    @FindBy(xpath = "//input[@placeholder='Country']")
    protected WebElement country;


class PageInitializer 
    WedDriver driver;
    public PageInitializer(WebDriver driver)
       this.driver = driver;
    
    public void initializePage(Object page)
        PageFactory.initElements(new AjaxElementLocatorFactory(driver, 20), page);
    

这样您的代码将是:

PageInitializer initializer = new PageInitializer(driver);
SpecificPage  page = new SpecificPage();
initializer.initializePage(page);

【讨论】:

以上是关于如何不重复字段声明(Selenium)的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有chromedriver selenium python的情况下完全使用普通chrome不重复

如何在不调整窗口大小的情况下使用 Java 在 Selenium Webdriver 中捕获屏幕截图 [重复]

如何使用 Selenium/Python 获取由 JavaScript 编写的 html 内容 [重复]

phpunit selenium2重复测试不起作用

sql语句要select某字段不重复的数据应该如何写?

如何在 SQL 中的一个字段上选择不重复的记录?