В этой статье мы рассмотрим паттер проектирования Facade применимо к Selenium Webdriver.
Этот паттерн предоставляет простой и легкий в использовании интерфейс для более сложного и комплексного кода, например, API.
Описание паттерна Facade
Если вам приходится иметь дело со сложным или плохо разработанным интерфейсом, вы иногда можете запутаться в доступном функционале. К тому же, довольно часто, при функциональном тестировании, вам не нужны все предусмотренные контролы. В этом случае для упрощения поддержки фреймворка все объявления объектов на странице и действия над ними выносятся за пределы фасада. Также у вас есть контроль над тем, как будет работать ваш фреймворк, так как использование дополнительных методов, объявленных в фасаде, может помочь избежать недопонимания или неправильного использования WebDriver. Если необходимо увеличить тестовое покрытие, – то для этого потребуется обновить фасад или добавлить новый.
Рассматриваемый пример
Пример кода расположен по ссылке. Для его написания использовался C# и вы можете его просто открыть в Visual Studio.
Рассмотрим используемый код. В этом примере установка WebDriver выполняется с помощью класса Constants с использованием enum Browsers.
В нашем фасаде используется только четыре метода Start, Stop, FindElement и ExecuteJavaScript. Также можно объявить другие методы для работы с WebDriver functionality, но небольшой пример не требует этого.
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 |
public class WebDriverFacade { private IWebDriver webDriver = null; private TimeSpan waitForElement = TimeSpan.FromSeconds(5); public WebDriverFacade() { webDriver = new FirefoxDriver(); } public void Start(string url) { webDriver.Url = url; webDriver.Navigate(); } public void Stop() { webDriver.Quit(); } public object ExecuteJavaScript(string script) { return ((IJavaScriptExecutor)webDriver).ExecuteScript("return " + script); } public IWebElement FindElement(By by) { try { WebDriverWait wait = new WebDriverWait(webDriver, waitForElement); return wait.Until(ExpectedConditions.ElementIsVisible(by)); } catch { return null; } } } |
Использованием фасада похоже на использование самого вебдрайвера:
1 2 3 4 5 6 7 |
WebDriverFacade webDriver = new WebDriverFacade(browser); webDriver.Start("http://autoqa.pp.ua/"); IWebElement element = webDriver.FindElement(By.CssSelector("notExisting")); element.Click(); webDriver.Stop(); |
Запустив этот пример, можно увидеть, что открывается консольное окно и запускается Chrome, в котором выполняется процесс поиска на тестовом сайте.
Повторюсь: если интерфейс довольно сложный, то использовать фасад не обязательно. Тем не менее, имея контроль над WebDriver при его использовании, - является хорошим подходом. В данном примере вы можете увидеть, что я использовал явное ожидание при поиске элементов на странице.