页面对象设计 - 当页面因用户而异时

Page Object Design - when page is different depending on user

我想知道什么是解决我遇到的问题的最佳设计

我的应用程序中有一个页面,在该页面上显示了一个表单,用户可以在其中输入数据。根据登录用户的类型,将有一些常见的文本框、下拉列表等和一些用户特定的输入数据字段。

因此,例如,对于内部用户,将显示所有输入字段,而对于外部用户,将仅显示有限的输入字段。

问题是应该根据用户显示 4-5 种不同的形式

目前我有一个基页,表单页继承了页页

public class BasePage
{
 PageFactory.InitElements(); etc.
}

Public class FormPage : Base Page
{
// All elements and methods for all types of forms
}

这是我不确定最佳方法的地方

我应该为每个表单类型创建单独的 类 并继承 FormPage 吗?

我在下面添加了一个示例,但我的应用程序非常复杂,但它应该能让您对设计有所了解

public class FormInternalUser : Form Page
{
 public void SubmitFormAction(string inputTextBox1, string inputTextBox2, string inputTextBox3, string inputTextBox4, string user)
{
// code
attachFile(user)
}

public override void attachFile(string user)
{
 //code
}
// other specific methods
}



public class FormExternalUser : Form Page
{
 public void SubmitFormAction(string inputTextBox1, string inputTextBox2, string user)
{
// code 
attachFile(user)
}
public override void attachFile(string user)
{
// code
}
// other specific methods
}

或者有更好的方法吗?也许是策略设计模式或类似的东西?

我想您当前在页面上的表单应该取决于 UserType,因此例如它可以是:

// type of users
public enum UserType {
    Type1,
    Type2,
    Type3
}

// the page from which you will be input the data
public class MainPage {
    public IUserDataForm UserDataFormComponent => GetUserDataForm();

// factory method to get the certain form depends on user type
    private IUserDataForm GetUserDataForm() {
        UserType userType = UserType.Type1; // get a value from somewhere (or pass it into constructor e.g.)

        switch(userType) {
            case Type1: return new User1DataForm(); break;
            case Type2: return new User2DataForm(); break;
            case Type3: return new User3DataForm(); break;
        }
    }
}

// user data class to pass the class instead count of variables the methods
public class UserData {
    string Text1;
    string Text2;
    string TextN;
}

// input data page interface
public interface IUserDateForm {
    void FillUserData(UserData data);
}

// base page for input data pages - needs if we have duplicated logic in the all other pages (could be removed if not)
public abstract UserDateForm :IUserDateForm{
    // common locators, etc.

    public override void FillUserData(UserData data) {
       // common input logic
    }
}
// implementation of 
public class User1DateForm : UserDateForm {

    public override void FillUserData(UserData data) {
       base().FillUserData(data);
       // input logic
    }
}

public class User2DateForm : UserDateForm {

    public override void FillUserData(UserData data) {
        base().FillUserData(data);
       // input logic
    }
}

public class User3DateForm : UserDateForm {

    public override void FillUserData(UserData data) {
       base().FillUserData(data);
       // input logic
    }
}

使用方法:

public void Test1 {
    UserData data = new UserData() { Text1 = "", Text2 = "", TextN = "" };
    MainPage main = new MainPage();
    main.UserDataFormComponent.FillUserData(data);
}