1

Selenium を使用して自動化を行っています。課題はこれです。

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

これら 3 つのすべてがドライバー オブジェクトを作成します。また、すべてのドライバー オブジェクトには同様のメソッドがあります。これらのオブジェクトがインスタンス化された後に実行されるコードがあります。プログラムの 1 回の実行中に、これらのドライバーの 1 つだけが使用されます。これを行うには、いくつかのロジックが必要です。これら3つのすべてのスーパークラスはないため、他の方法を探しています。

4

5 に答える 5

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();
于 2012-09-30T19:15:35.870 に答える
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);
    }
}
于 2012-09-30T19:06:23.710 に答える
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;

        }
    }
}
于 2013-02-23T20:43:29.723 に答える
0

ストラテジー デザイン パターンは、この問題を解決するものであり、オブジェクトのインスタンス化を実行時に遅らせます。

私をクリック

于 2012-09-30T20:51:59.977 に答える
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
}
于 2012-09-30T19:17:04.600 に答える