2012-09-30 106 views
1

我正在使用Selenium進行自動化。挑戰是這樣的。根據輸入創建對象

FirefoxDriver driver = new FirefoxDriver(); 
InternetExplorerDriver driver = new InternetExplorerDriver(); 
ChromeDriver driver = new ChromeDriver(); 

所有這三個創建驅動程序對象。所有的驅動程序對象都有類似的方法。有一段代碼會在這些對象被實例化後運行。在程序的一次運行中,只有其中一個驅動程序被使用。我需要一些邏輯來做到這一點。由於沒有所有這些超級班3.我正在尋找其他方法。

回答

1

只需創建一個包裝這3個類的功能的超類。

public abstract class Browser { 
    public abstract Navigate(string link); 
} 

public class Firefox : Browser { 
    FirefoxDriver driver; 
    public Firefox(){ 
     driver = new FirefoxDriver(); 
    } 

    public abstract Navigate(string link){ 
     driver.GoTo(link); 
    } 
} 

public class Chrome : Browser { 
    ChromeDriver driver; 
    public Chrome(){ 
     driver = new ChromeDriver(); 
    } 

    public abstract Navigate(string link){ 
     driver.FollowLink(link); 
    } 
} 
+0

+1,這是我的做法。意味着你可以封裝你的所有邏輯。 – Arran

2

工廠方法模式可以快速解決您的問題。

//Define the interface with the common methods 
Interface ISuperDriver 
{ 
void run(); 
} 

//implement the interface on firefox 
class FireFoxDriver:ISuperDriver{ 
void run(){ 
//firefox driver 
} 
} 

//implement the interface on IE 
class InternetExplorerDriver:ISuperDriver{ 
void run(){ 
//ie driver 
} 
} 

//chrome 
class ChromeDriver:ISuperDriver{ 
void run(){ 
//chrome 
} 
} 

//create reference for the interface 
ISuperDriver Driver; 

if(<input 1>){ 
Driver= new FireFoxDriver();}//instantiate firefox 
else if(<input 2>){ 
Driver= new InternetExplorerDriver();}//IE 
else if(<input 3>){ 
Driver= new ChromeDriver();}//Chrome 

//Finally invoke your method 
Driver.Run(); 
+0

isnt驅動程序在elseif之後會失去範圍嗎? –

+0

否 - 它是在if/else塊之前聲明的。 – Tim

+0

沒有其上面的if和罰款 –

0

您可以使用以下類型的類:

public abstract class BrowserDriver { ... } 

public class InternetExplorerDriver : BrowserDriver { ... } 
public class FirefoxDriver : BrowserDriver { ... } 
public class ChromeDriver : BrowserDriver { ... } 

用法:

BrowserDriver driver = null; 

switch (BrowserType) // assuming BrowserType is a property of type Browser enum, holding the value from the set {InternetExplorer, Firefox, Chrome} 
{ 
    case Browser.InternetExplorer: 
     driver = new InternetExplorerDriver(); 
     break; 
    case Browser.Firefox: 
     driver = new FirefoxDriver(); 
     break; 
    case Browser.Chrome: 
     driver = new ChromeDriver(); 
     break; 
} 

SomeFunction(driver); 

// ... 

public void SomeFunction(BrowserDriver driver) 
{ 
    //... your code here 
} 
+0

這看起來很完美。但我有一個額外的限制,我需要照顧。我有一個需要運行的函數,需要上面創建的對象 –

+0

我已經編輯了代碼供您參考,您可以使用BrowserDriver對象調用任何函數。希望這可以幫助! –

0

策略的設計模式是解決這一問題的一個, 它將延遲的實例化對象到運行時。

click me

0

我知道這是遲到了。但這就是我最後爲自己工作的原因

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 

using OpenQA.Selenium.Internal; 
using OpenQA.Selenium.IE; 
using OpenQA.Selenium.Chrome; 
using OpenQA.Selenium.Firefox; 
using OpenQA.Selenium.Remote; 
using OpenQA.Selenium; 
using System.Collections.Specialized; 

enum Browser { ie, firefox, chrome }; 


namespace SearchandClickAds 
{ 
    class Program 
    { 


     public static RemoteWebDriver getRemoteDriver(Browser b) 
     { 

      switch (b) 
      { 
       case Browser.ie: 
        return new InternetExplorerDriver(
            InternetExplorerDriverService.CreateDefaultService(), 
            new InternetExplorerOptions(), 
            TimeSpan.FromMinutes(10) 
        ); 

       case Browser.firefox: 

        return new FirefoxDriver(
           new FirefoxBinary(), 
           new FirefoxProfile(), 
           TimeSpan.FromMinutes(10) 
        ); 

       case Browser.chrome: 

        return new ChromeDriver(
               ChromeDriverService.CreateDefaultService(), 
               new ChromeOptions(), 
               TimeSpan.FromMinutes(10) 
        ); 
      } 

      return null; 
     } 


     static void Main(string[] args) 
     { 

      string browser_s = args[0].ToLower(); 
      Browser browser; 

      if (browser_s == "ie") 
      { 
       browser = Browser.ie; 
      } 
      else if (browser_s == "chrome") 
      { 
       browser = Browser.chrome; 
      } 
      else if (browser_s == "firefox") 
      { 
       browser = Browser.firefox; 
      } 
      else 
      { 
       Console.WriteLine("Unknown browser. Must be ie, chrome, or firefox"); 
       return; 
      } 

      RemoteWebDriver driver = null; 

      while (true) 
      { 
       try 
       { 

        driver = getRemoteDriver(browser); 
        /* Do navigation here */ 
       } 
      } 

      Console.WriteLine("Done."); 
      Environment.Exit(0); 
      return; 

     } 
    } 
}