Дизайн объекта страницы — когда страница отличается в зависимости от пользователя

#c# #selenium #selenium-webdriver #design-patterns #automation

Вопрос:

Мне интересно, какой был бы лучший дизайн для проблемы, с которой я сталкиваюсь

У меня в приложении есть страница, на которой отображается форма, на которой пользователь может вводить данные. В зависимости от типа пользователя, который входит в систему, будут некоторые общие текстовые поля, раскрывающиеся списки и т.д., А также некоторые поля входных данных, специфичные для пользователя.

Так, например, для внутреннего пользователя будут отображаться все поля ввода, а для внешних пользователей будет отображаться только ограниченное количество полей ввода.

Проблема в том, что в зависимости от пользователя должно отображаться 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
}
 

или есть лучший подход? Может быть, шаблон разработки стратегии или что-то подобное?

Ответ №1:

Я предполагаю, что ваша текущая форма на странице должна зависеть от типа пользователя, поэтому, например, она может быть такой:

 // 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);
}
 

Комментарии:

1. Отлично! именно то, что я искал