3

2 つの異なるクラスに含まれるステップを使用するシナリオがあるとします。IWebDriver両方が経由せずに同じインスタンスへのハンドルを持つ方法はありますScenarioContext.Current["webdriverVariableName"]か?

それはとても醜いです。よりクリーンな方法はありますか?

すべてのシナリオの開始時に割り当てられるプロパティを持つクラスを作成してpublic static IWebDriver、すべてのステップでそれを参照できるようにするつもりでしたが、並列実行を開始するとうまくいかないと思います。シナリオは、グローバル ドライバーを上書きします。

4

4 に答える 4

6

Specflow は Dependency Injection メカニズムを提供するため、Web ドライバー インスタンスをステップに挿入できます。

https://github.com/techtalk/SpecFlow/wiki/Context-Injectionを参照してください

「高度なオプション」セクションを参照してください。

于 2012-10-27T17:43:29.880 に答える
4

Specflow を使い始めたばかりですが、うまくいくようです。

  1. IObjectContainer をコンストラクターとして受け取り、WebDriver インスタンスを作成する BeforScenario メソッドを持つクラスを作成します。

    [Binding]
    public class WebDriverSupport
    {
        private readonly IObjectContainer _objectContainer;
    
        public WebDriverSupport(IObjectContainer objectContainer)
        {
            _objectContainer = objectContainer;
        }
    
        [BeforeScenario]
        public void InitializeWebDriver()
        {
            var webDriver = DriverFactory.CreateDriver();
            _objectContainer.RegisterInstanceAs<RemoteWebDriver>(webDriver);
        }
    }
    
  2. RemoteWebDriver を取るコンストラクターを使用してステップ クラスを作成します。

    [Binding]
    public class POCSteps
    {
        private readonly IdlWebDriver _driver;
    
        public POCSteps(IdlWebDriver driver)
        {
            _driver = driver;
        }
    }
    

ステップ ステップは、完全にインスタンス化された WebDriver オブジェクトにアクセスできるようになりました

于 2012-12-18T09:51:00.640 に答える
0

私のテストは、現在マルチスレッド Webdriver インスタンスを正常に実行しており、基本ステップ定義クラスを使用してドライバー インスタンスを保持しています。すべてのステップ定義はこれから継承されるため、ドライバーはすべてのステップで使用できます。

namespace Project.StepDefinitions
{
    [Binding]
    public class BaseStepDefinitions
    {
        private const string CurrentPageKey = "Current.Page";
        public static IWebDriver Driver { get; set; }

        protected LogonPageModel LogonPage
        {
            get { return (LogonPageModel)ScenarioContext.Current[CurrentPageKey]; }
            set { ScenarioContext.Current[CurrentPageKey] = value; }
        }

        protected RegisterPageModel RegisterPage
        {
            get { return (RegisterPageModel)ScenarioContext.Current[CurrentPageKey]; }
            set { ScenarioContext.Current[CurrentPageKey] = value; }
        }
    }
}

//////////////

namespace SpecDriver.StepDefinitions
{
    [Binding]
    public class LoginSteps : BaseStepDefinitions
    {
        [Given(@"I navigate to the homepage")]
        public void GivenINavigateToTheHomepage()
        {
            Driver.Navigate().GoToUrl(SettingsManager.BaseUrl);
        }
    }
}

などなど...

于 2012-11-13T11:48:27.257 に答える