我想单击网页上可用的许多链接,我写了一个代码,其中使用了下面给出的开关案例。因此,任何人都可以告诉我,我们可以使用枚举或任何其他方式单击特定链接。作为回报,它将给出pageObject。
我在开关情况下使用的代码带有两个链接,
public Object SelectMenu(string menuName)
{
Object result = null;
IWebElement menuTemp = driver.FindElement(By.XPath(".//a[contains(text(),'" + menuName + "')]"));
if (menuTemp.Enabled)
{
menuTemp.Click();
if (menu.ToUpper() == "COUNTRY")
{
result = new CountryPage(driver).Load();
}
else if (menu.ToUpper() == "PARTNER")
{
result = new PartnerPage(driver).Load();
}
您在寻找这样的东西吗?
string menu = "country";
switch (menu.ToUpper())
{
case "COUNTRY":
result = new CountryPage(driver).Load();
break;
case "PARTNER":
result = new PartnerPage(driver).Load();
break;
}
如果您不想输入您期望实例化的类并绑定到构造函数和负载方法。这种方法的一个例子是:
var menu = "Country";
var pageClass = (from asm in AppDomain.CurrentDomain.GetAssemblies()
from pageType in asm.GetTypes()
let ctor = pageType.GetConstructor(new [] {typeof(IWebDriver)})
let load = pageType.GetMethod("Load", Type.EmptyTypes)
where pageType.Name.EndsWith("Page")
&& pageType.Name.StartsWith(menu, StringComparison.InvariantCultureIgnoreCase)
&& ctor != null
&& load != null
select new { Constructor = ctor, Load = load}).Single();
var page = pageClass.Constructor.Invoke(new []{webdriver});
var result = pageClass.Load.Invoke(page, null);
// result has now your CountryPage instance
这是如何工作的:
通过调用getAssemblies,可以迭代所有程序集并调用GetTypes返回所有公共类型。
您需要您的页面类接受构造函数中的iWebdriver,因此每种类型都会使用GetConstructor调用询问。getMethod的负载需求完成了需求。
最后要做的是检查该类型的名称是否与页面结尾的约定与Menuname开始。
在最后一步中,单个(又一无所有)的项目被返回。从此,我们可以通过调用Invoke并随后为加载成员的调用方法创建类型。
返回最终结果。
请注意,如果您创建类型的countryCitypage,您会发现两种类型。我将其作为练习,供读者提出解决方案