在自动化测试中,页面对象模式(Page Object Model, POM)是一种常用的设计模式,它通过将页面元素和操作封装成对象,来提高测试代码的可维护性和可重用性。然而,标准的页面对象模式依赖于Selenium.Support NuGet包,这不仅增加了额外的代码依赖,而且限制了对元素定位的控制。本文将介绍一种改进的页面对象模式,它不依赖于Selenium.Support NuGet包,并且提供了对页面元素定位的完全控制。
为了说明改进的页面对象模式,将以Bing首页为例。在这个页面上,主要的测试案例是输入搜索词并断言返回结果的数量。
在改进的页面对象模式中,将BingMainPage类的定义分散在三个不同的文件中:
这个文件包含了页面对象的构造函数和操作方法。与之前的版本相比,不再在构造函数中调用PageFactory.InitElements(browser, this)。
using OpenQA.Selenium;
namespace HuddlePageObjectsElementsStringProperties.ImprovedVersion
{
public partial class BingMainPage
{
private readonly IWebDriver _driver;
private readonly string url = @"http://www.bing.com/";
public BingMainPage(IWebDriver browser)
{
_driver = browser;
}
public void Navigate()
{
_driver.Navigate().GoToUrl(url);
}
public void Search(string textToType)
{
SearchBox.Clear();
SearchBox.SendKeys(textToType);
GoButton.Click();
}
}
}
这个文件存储了所有Web元素的属性。与之前的版本的主要区别在于,通过WebDriver的FindElement方法定位元素,而不是使用FindsBy属性。
using OpenQA.Selenium;
namespace HuddlePageObjectsElementsStringProperties.ImprovedVersion
{
public partial class BingMainPage
{
public IWebElement SearchBox
{
get
{
return _driver.FindElement(By.Id("sb_form_q"));
}
}
public IWebElement GoButton
{
get
{
return _driver.FindElement(By.Id("sb_form_go"));
}
}
public IWebElement ResultsCountDiv
{
get
{
return _driver.FindElement(By.Id("b_tween"));
}
}
}
}
这个文件包含了所有的断言方法。
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace HuddlePageObjectsElementsStringProperties.ImprovedVersion
{
public partial class BingMainPage
{
public void AssertResultsCount(string expectedCount)
{
Assert.AreEqual(ResultsCountDiv.Text, expectedCount);
}
}
}
在测试中使用页面对象的方式与之前相同。
在后续的文章中,将分享其他设计模式的修改,这些修改可以使测试更加可维护。