【问题标题】:Page Object Design - when page is different depending on user页面对象设计 - 当页面因用户而异时
【发布时间】:2021-09-25 06:29:59
【问题描述】:

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

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

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

问题是应该根据用户显示 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
}

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

【问题讨论】:

    标签: c# selenium selenium-webdriver design-patterns automation


    【解决方案1】:

    我猜你当前在页面上的表单应该依赖于 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);
    }
    

    【讨论】:

    • 太棒了!正是我要找的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2014-03-29
    • 2022-01-18
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多