Всем привет. Несколько дней назад мы рассмотрели базовую конструкцию паттерна Page Object. Но обновленная версия, которая будет рассмотрена далее, мне нравится тем, что наследует некоторые принципы SOLID.
Нам понадобится добавить следующие классы:
- Page Object Element Map (BingMainPageElementMap) – содержит свойства всех элементов на странице.
- Page Object Validator (BingMainPageValidator) – cодержит методы валидации.
- Page Object (BingMainPage) – реализует все действия, такие как поиск, навигацию. Также он предоставляет легкий доступ к двум предыдущим классам с помощью свойств. Вторым преимуществом модифицированного паттерна есть то, что элементы Element Map инкапсулируются в методах действий (обвертках), например, в методе Search().
- UI Tests (BingTests) – содержит сам тест.
Код класса карты элементов, как можно заметить, уже не требует поддержки библиотеки Selenium.Support, так мы не используем метод InitElements и аннотации FindsBy.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
using OpenQA.Selenium; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace POMWithoutInitFactory { public class BingMainPageElementMap { private readonly IWebDriver browser; public BingMainPageElementMap(IWebDriver browser) { this.browser = browser; } public IWebElement SearchBox { get { return this.browser.FindElement(By.Id("sb_form_q")); } } public IWebElement GoButton { get { return this.browser.FindElement(By.Id("sb_form_go")); } } public IWebElement ResultsCountDiv { get { return this.browser.FindElement(By.Id("b_tween")); } } } } |
Все методе вылидации помещаем в отдельный класс BingMainPageValidator:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace POMWithoutInitFactory { class BingMainPageValidator { private readonly IWebDriver browser; public BingMainPageValidator(IWebDriver browser) { this.browser = browser; } protected BingMainPageElementMap Map { get { return new BingMainPageElementMap(this.browser); } } public void ResultsCount(string expectedCount) { Assert.IsTrue(this.Map.ResultsCountDiv.Text.Contains(expectedCount), "The results DIV doesn't contains the specified text."); } } } |
Совмещаем вызовы двух классов в классе BingMainPage:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
using OpenQA.Selenium; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace POMWithoutInitFactory { class BingMainPage { private readonly IWebDriver browser; private readonly string url = @"http://www.bing.com/"; public BingMainPage(IWebDriver browser) { this.browser = browser; } protected BingMainPageElementMap Map { get { return new BingMainPageElementMap(this.browser); } } public BingMainPageValidator Validate() { return new BingMainPageValidator(this.browser); } public void Navigate() { this.browser.Navigate().GoToUrl(this.url); } public void Search(string textToType) { this.Map.SearchBox.Clear(); this.Map.SearchBox.SendKeys(textToType); this.Map.GoButton.Click(); } } } |
И сам тестовый класс, ничем не отличающийся от предыдущей реализации:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Support.UI; using OpenQA.Selenium.Firefox; namespace POMWithoutInitFactory { [TestClass] public class BingTests { public IWebDriver Driver { get; set; } public WebDriverWait Wait { get; set; } [TestInitialize] public void SetupTest() { this.Driver = new FirefoxDriver(); this.Wait = new WebDriverWait(this.Driver, TimeSpan.FromSeconds(30)); } [TestCleanup] public void TeardownTest() { this.Driver.Quit(); } [TestMethod] public void SearchTextInBing() { BingMainPage bingMainPage = new BingMainPage(this.Driver); bingMainPage.Navigate(); bingMainPage.Search("автоматизированное тестирование"); bingMainPage.Validate().ResultsCount("РЕЗУЛЬТАТЫ: 20,900"); } } } |
Конечная структура проекта:

Спасибо за внимание и подписывайтесь на рассылку 