我有很多 Page 类可以用于我的测试自动化。它们中的每一个都具有以下三个基本要素:
- 网络驱动程序
- 乌里
- 该页面的基本元素。
我决定为所有页面类创建一个基类,如下所示:
internal class Page
{
protected IWebDriver _webDriver;
protected string _uri;
protected By _essentialElementCriteria;
internal Page(IWebDriver driver, WebDriverPageType pageType, string uri, By criteria)
{
try
{
PageLoader.LoadPage(driver, _uri, new SearchAndWaitCriteria(_essentialElementCriteria));
this._webDriver = driver;
}
catch (Exception exc) { throw new PageLoadFailedException(pageType, exc); }
}
}
派生类如下所示:
internal class LoginPage : Page
{
internal LoginPage(IWebDriver driver)
: base (driver, WebDriverPageType.LoginPage, "loginpage_url", By.Id("xyz")) { }
// Other LoginPage specific methods like Login().
}
PageLoader 类如下:
internal class PageLoader
{
internal static void LoadPage(IWebDriver driver, string uri, SearchAndWaitCriteria criteria)
{
if (driver == null) throw new ArgumentNullException("WebDriver is null.");
driver.Navigate().GoToUrl(uri);
var waitElement = driver.WaitForElement(criteria.SearchCriteria, criteria.MaximumWaitSeconds, criteria.SleepMilliSecondsBetweenTwoSearches);
if (waitElement == null) throw new NotFoundException(String.Format("Failed to find the waitElement. Element details: {0}", criteria.SearchCriteria.ToString()));
}
internal static bool IsPageLoaded(IWebDriver driver, SearchAndWaitCriteria criteria)
{
IWebElement essentialElement = driver.GetElement(criteria.SearchCriteria);
return essentialElement != null;
}
}
我的基本想法是避免编写构建页面的相同代码,因为我将创建很多页面类。因此,在 PageLoader 类的帮助下,我将该代码“共享”到了基类中。我仍然认为有些地方不太对劲。我已经负责向基类抛出异常,这很好。但是,我需要将派生类的 PageType 作为参数提供给基类来做到这一点,这对我来说似乎并不好。
您可以在此设计中提出哪些改进建议?我应该消除基类,并改用组合吗?我想我也许可以合并 PageLoader 和 Page 类来实现这一点。不确定这个想法,只是一个想法。