为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕姐8265434 2023-04-29 15:46:53
我正在用 c# 开发一个 selenium 框架。页面类使用工厂设计实例化以隐藏实例化逻辑,我希望能够使用 var myPageClass = HelperSelenium.Instance(MyPageClass)而不是实例化类var myPageClass = MyPageClass.Instance(driver)我已经尝试在 HelperSelenium 类中创建一个泛型函数,但我还不能完全理解泛型是如何工作的。PageObject 类示例(注意我使用 Instance 方法来实例化该类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 ActiveError   CS0119  'T' is a type parameter, which is not valid in the given context    InfrastructureSelenium  C:\testSelenium\Infrastructure\Helper\HelperSelenium.cs 140 Active
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

最后我通过使用修复:


        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 可以改善它


查看完整回答
反对 回复 2023-04-29
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信