如何使用泛型和工厂设计来实例化 PageObject 类

How to use generics and factory design to instantiate PageObject classes

我正在用 c# 开发一个 selenium 框架。页面 classes 使用工厂设计实例化以隐藏实例化逻辑,我希望能够实例化 class 使用 var myPageClass = HelperSelenium.Instance(MyPageClass) 而不是 var myPageClass = MyPageClass.Instance(driver)

我已经尝试在 HelperSelenium class 中创建泛型函数,但我还不能完全理解泛型的工作原理。

PageObject class 示例(注意我使用 Instance 方法来实例化 class

public class HomePage : BasePage
{       
    private HomePage(IWebDriver driver, CountryEnum enum) : base(driver) { }

    private static HomePage homePage { get; set; }

    public static HomePage Instance(IWebDriver driver, CountryEnum enum)
    {
        switch (enum)
        {
             case CountryEnum.Sweden:
                 HomePage = new HomePage_SWE(driver);
                 break;
             case CountryEnum.Germany:
                 HomePage = new HomePage_GER(driver);
                 break;
             case CountryEnum.Italy:
                 HomePage = new HomePage_ITA(driver);
                 break;
             default:
                 HomePage = new HomePage_UK(driver);
                 break;
        }

        return homePage;
    }

...
}
public T InstancePage<T>() where T : BasePage
{
    return (T).Instance(WebDriver, CountryEnum.Sweden);
}
Error   CS0119  'T' is a type, which is not valid in the given context  InfrastructureSelenium  C:\testSelenium\Infrastructure\Helper\HelperSelenium.cs 140 Active
Error   CS0119  'T' is a type parameter, which is not valid in the given context    InfrastructureSelenium  C:\testSelenium\Infrastructure\Helper\HelperSelenium.cs 140 Active

最后我通过使用修复:

        public T InstantiatePage<T>() where T : class
    {
        // COUNTRY code as defined in
        // https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements
        var className = string.Format("{0}_{1}", typeof(T).FullName, getCulture()); 

        // T will be base class if no derived class with COUNTRY code suffix is found 
        var classType = Type.GetType(className) ?? typeof(T);

        // Instantiate the page
        var instance = Activator.CreateInstance(classType, new object[] { WebDriver });

        return (T)instance;
    }

我很确定使用 PageObject.PageFactory

会更好