改进的页面对象模式

在自动化测试中,页面对象模式(Page Object Model, POM)是一种常用的设计模式,它通过将页面元素和操作封装成对象,来提高测试代码的可维护性和可重用性。然而,标准的页面对象模式依赖于Selenium.Support NuGet包,这不仅增加了额外的代码依赖,而且限制了对元素定位的控制。本文将介绍一种改进的页面对象模式,它不依赖于Selenium.Support NuGet包,并且提供了对页面元素定位的完全控制。

测试案例

为了说明改进的页面对象模式,将以Bing首页为例。在这个页面上,主要的测试案例是输入搜索词并断言返回结果的数量。

页面对象的拆分

在改进的页面对象模式中,将BingMainPage类的定义分散在三个不同的文件中:

  • BingMainPage.cs - 包含构造函数和操作方法
  • BingMainPage.Map.cs - 存储所有Web元素的属性
  • BingMainPage.Asserter.cs - 包含所有的断言方法

这个文件包含了页面对象的构造函数和操作方法。与之前的版本相比,不再在构造函数中调用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); } } }

测试中的使用

在测试中使用页面对象的方式与之前相同。

在后续的文章中,将分享其他设计模式的修改,这些修改可以使测试更加可维护。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485