2016-08-15 14 views
3

現在実行中のテストの名前を追跡する静的な文字列プロパティを追加したいと思います。 WebDriverは私のページオブジェクト全体に渡って運ばれる唯一のオブジェクトであるため、これについての最良の方法はWebDriverを使うことでした。C#Extending Selenium Webdriverクラス

設定できる文字列プロパティを追加するために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

ようなことを何をすれば。

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)); 

あなたはFirefoxDriverにIWebDriverのインターフェイスのメソッドを委任されているが、適切なものは何でも追加追加することができますこの方法です。

+1

ありがとうございます。これは@LeonBarkanが提案した行に沿っていますが、これは最も正しい実装のようです。私はそれを実装し始めて、それが機能するかどうかを報告します。 – Milo

+0

私はこれを実装しようとしており、IntellisenseはすべてのIWebDriverメソッドを実装していましたが、本体として新しいNotImplementedException()をスローします。どのようにしてほとんどの場合、デフォルトのIWebDriverバージョンのメソッドを使用しますか?たとえば、FindElementメソッド: 'public IWebElement FindElement(By) { throw new NotImplementedException(); } – Milo

+0

MyWebDriverでIWebDriverを実装する必要はありません。そうしている場合、FindElement、navigateなどのすべてのインターフェイスメソッドを実装(書き込み)する必要があります。この例の –

-2

ただ、その親としてwebdriverをして​​いたサブクラスを使用します。

public class MyWebDriver : WebDriver 
{ 
    private string _currentTest; 
} 

次にあなたが使用することができますMyWebDriverどこにでもあり、必要に応じて_currentTestと設定します。

+0

WebDriverはIWebDriverインターフェイスを使用します。私は上記を試したが、WebDriverはIntelliSenseには表示されません.IWebInterfaceだけです。インターフェイスを拡張する方法はありますか?ありがとうございました。 – Milo

1

あなたはあなたが "デコ" デザインパターンを使用してwebdriverををラップする必要があります

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

実行

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

それは理にかなっています!私は何かを実装すると、私はやり直して報告します。ありがとう! – Milo

3

ここでは、標準のドライバで使用するようなすべての通常のメソッドを呼び出すことができるようになった後で、追加のCurrentTest変数を使用した後、半分の答えの練習をやめましょう。(それは汎用IWebDriverの完全な実装です。

最高の互換性のために、さらにコンストラクタを追加できます。

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で動作しないことです。 –