#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. Отлично! именно то, что я искал