2016-08-15 5 views
3

Я хотел бы добавить статическое свойство строки, которое будет отслеживать имя текущего запуска теста. Я решил, что лучше всего использовать WebDriver, поскольку это единственный объект, который переносится на все мои объекты страницы.C# Расширение Selenium Webdriver Class

Есть ли способ расширить класс WebDriver, чтобы добавить свойство строки, которое я могу установить?

EDIT: Поскольку WebDriver использует интерфейс IWebDriver, я бы мог расширить интерфейс?

EDIT # 2: Добавление пример того, что я в настоящее время, чтобы загрузить мой WebDriver:

protected static NLog.Logger _logger = LogManager.GetCurrentClassLogger(); 
protected static IWebDriver _driver; 

/// <summary> 
/// Spins up an instance of FireFox webdriver which controls the browser using a 
/// FireFox plugin using a stripped down FireFox Profile. 
/// </summary> 
protected static void LoadDriver() 
{ 
    ChromeOptions options = new ChromeOptions(); 
    try 
    { 
     var profile = new FirefoxProfile(); 
     profile.SetPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream doc xls pdf txt"); 

     _driver = new FirefoxDriver(profile); 
     _driver.Navigate().GoToUrl("http://portal.test-web01.lbmx.com/login?redirect=%2f"); 
    } 
    catch(Exception e) 
    { 
     Console.WriteLine(e.Message); 
     throw; 
    } 
} 
+0

Можете ли вы привести пример? –

+0

Добавлен пример того, что мне нужно загрузить WebDriver. Это находится в абстрактном классе, который заботится об установке/очистке/использовании тестов. – Milo

+0

Почему бы не начать статическую строку в вашей функции выполнения? –

ответ

2

Вам нужно будет обернуть WebDriver с помощью "декоратор" шаблон проектирования.

public class MyWebDriver : IWebDriver 
{ 
    private IWebDriver webDriver; 
    public string CurrentTest { get; set; } 

    public MyWebDriver(IWebDriver webDriver) 
    { 
     this.webDriver = webDriver 
    } 

    public Method1() 
    { 
     webDriver.Method1(); 
    } 

    public Method2() 
    { 
     webDriver.Method2(); 
    } 

    ... 
} 

И затем передайте, какой бы водитель вы не использовали в то время.

var profile = new FirefoxProfile(); 
MyWebDriver driver = new MyWebDriver(new FirefoxDriver(profile)); 

Таким образом, вы делегируя методы интерфейса из IWebDriver в FirefoxDriver, но может добавить любые дополнения уместны.

+1

Спасибо. Это похоже на то, что предложил @LeonBarkan, но это похоже на наиболее правильную реализацию. Я начал реализовывать его и будет отчитываться, если я получу его работу. – Milo

+0

Я пытаюсь реализовать это, и Intellisense мне удалось реализовать все методы IWebDriver с помощью «throw new NotImplementedException()» в качестве своих тел. Как использовать стандартную версию метода IWebDriver в большинстве случаев?Например, метод FindElement: 'public IWebElement FindElement (By by) { throw new NotImplementedException(); } ' – Milo

+0

вам не нужно внедрять IWebDriver в MyWebDriver, или если вы это делаете, вы должны реализовать (написать) все интерфейсы. Такие методы, как FindElement, navigate и многое другое ... –

-2

Просто использовать класс к югу, который имеет WebDriver в качестве родителя:

public class MyWebDriver : WebDriver 
{ 
    private string _currentTest; 
} 

Затем вы можете использовать MyWebDriver всюду и установить _currentTest по мере необходимости.

+0

WebDriver использует интерфейс IWebDriver. Я попробовал выше, но WebDriver не отображается в IntelliSense, только IWebInterface. Есть ли способ расширить интерфейс? Спасибо. – Milo

1

, что если вы делаете что-то вроде

class MyWebDriver 
{ 
    private IWebDriver driver; 
    private static string CurrentTest; 
    .... 
    //make constractors/getters, setters 
} 

исполнения

MyWebDriver d = new MyWebDriver(....) 
... 
+1

Это имеет смысл! Я попробую и отчитаюсь, когда я что-то реализую. Благодаря! – Milo

3

Хорошо, давайте остановим половину практики ответа (это полная реализация универсального IWebDriver), после чего вы можете вызвать все обычные методы, как вы используете в стандартном драйвере +, у вас есть дополнительная переменная CurrentTest.

вы можете добавить больше конструкторов для лучшей совместимости.

class MyWebDriver<T> where T : IWebDriver, new() 
{ 
    IWebDriver driver; 
    public string CurrentTest { get; set; } 

    public MyWebDriver() 
    { 
     driver = new T(); 
    } 

    public void Dispose() 
    { 
     this.driver.Dispose(); 
    } 

    public IWebElement FindElement(By by) 
    { 
     return this.driver.FindElement(by); 
    } 

    public ReadOnlyCollection<IWebElement> FindElements(By by) 
    { 
     return this.driver.FindElements(by); 
    } 

    public void Close() 
    { 
     this.driver.Close(); 
    } 

    public void Quit() 
    { 
     this.driver.Quit(); 
    } 

    public IOptions Manage() 
    { 
     return this.driver.Manage(); 
    } 

    public INavigation Navigate() 
    { 
     return driver.Navigate(); 
    } 

    public ITargetLocator SwitchTo() 
    { 
     return this.SwitchTo(); 
    } 

    public string Url 
    { 
     get 
     { 
      return this.driver.Url; 
     } 
     set 
     { 
      this.driver.Url = value; 
     } 
    } 

    public string Title 
    { 
     get 
     { 
      return this.driver.Title; 
     } 
    } 

    public string PageSource 
    { 
     get 
     { 
      return this.driver.PageSource; 
     } 
    } 

    public string CurrentWindowHandle 
    { 
     get 
     { 
      return this.driver.CurrentWindowHandle; 
     } 
    } 

    public ReadOnlyCollection<string> WindowHandles 
    { 
     get 
     { 
      return this.WindowHandles; 
     } 
    } 
} 

public class MyTest 
{ 
    public void main() 
    { 
     MyWebDriver<FirefoxDriver> driver = new MyWebDriver<FirefoxDriver>(); 
     driver.CurrentTest = "Entering to google website with Firefox Driver"; 
     driver.Navigate().GoToUrl("www.google.com"); 
    } 
} 
+0

Спасибо за прямой ответ @LeonBarkan! – Milo

+0

Добро пожаловать, рад помочь. –

+0

Отличный ответ! Единственным недостатком является то, что он не будет работать с RemoteWebDriver, потому что его конструктор принимает аргументы ... –

Смежные вопросы