如何使用泛型和工厂设计来实例化 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
会更好
我正在用 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
会更好