簡體   English   中英

在 C# 中的步驟文件之間共享驅動程序

[英]Sharing Driver between Step files in C#

我在項目中的步驟文件之間共享我的驅動程序時遇到問題。 我在網上做了很多谷歌搜索,並提出了一個使用 IObjectContainer 的解決方案。 我認為哪個是正確的? 但是,它似乎不起作用。 它卡住了。 我不太明白 IObjectContainer 在哪里被實例化。 下面是我的 Hooks 文件和我的步驟文件之一的代碼:

掛鈎文件:

public class RDM_Hooks
    {

        private IObjectContainer _objectContainer;
        public RDM_Website<ChromeDriver> RDM_Website;

        public void WebDriverSupport(IObjectContainer objectContainer)
        {
            _objectContainer = objectContainer;
        }
        
        [BeforeScenario]
        public void InitWebDriver()
        {
            RDM_Website = new RDM_Website<ChromeDriver>();
            _objectContainer.RegisterInstanceAs<RDM_Website<ChromeDriver>>(RDM_Website);
        }
        
        [AfterScenario]
        public void DisposeWebDriver()
        {
            RDM_Website.SeleniumDriver.Quit();
            RDM_Website.SeleniumDriver.Dispose();
        }
    }

步驟文件:

    public class RDM_LoginSteps
    {
        private RDM_Website<ChromeDriver> RDM_Website;
        public RDM_LoginSteps(RDM_Website<ChromeDriver> rdm_website) 
        {
            RDM_Website = rdm_website;
        }

        [Given(@"I am on the homepage")]
        public void GivenIAmOnTheHomepage()
        {
            RDM_Website.RDM_Homepage.VisitHomePage();
        }
    }

我想我在某處遺漏了一些東西,但我在網上找到的任何信息都沒有比上面的 go 更進一步,我有點迷路了。

我只是希望我所有的步驟文件共享同一個瀏覽器,這樣我就可以使用一個文件來完成我的所有登錄步驟,並在另一個文件上執行其他操作。

這是我使用 UI 測試的 Hook 文件

[Binding]
internal sealed class WebHooks
{
    private readonly IObjectContainer _objectContainer;

    public WebHooks(IObjectContainer objectContainer)
    {
        _objectContainer = objectContainer;
    }

    [BeforeScenario("web")]
    public void BeforeWebScenario()
    {
        //HACK: 
        //https://stackoverflow.com/questions/43571119/loading-of-unpacked-extensions-is-disabled-by-the-administrator
        var options = new ChromeOptions();
        options.AddArgument("--start-maximized");
        options.AddAdditionalCapability("useAutomationExtension", false);
        options.AddArgument("--no-sandbox");
        options.AddArgument("--whitelisted-ips=''");


        //HACK: this fixes issue with not being able to find chromedriver.exe
        //https://stackoverflow.com/questions/47910244/selenium-cant-find-chromedriver-exe
        var webDriver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), options, TimeSpan.FromMinutes(15));
        webDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(40);

        _objectContainer.RegisterInstanceAs<IWebDriver>(webDriver);
    }


    [AfterScenario("web")]
    public void AfterWebScenario()
    {
        var webDriver = _objectContainer.Resolve<IWebDriver>();

        if (webDriver == null) return;

        webDriver.Close();
        webDriver.Dispose();
    }
}

看起來您缺少掛鈎 class 上的 [Binding] 屬性。

我也沒有看到您在完成后從容器中獲取引用以處置它。

我不知道 RDM_Website 在做什么,但我會只參考驅動程序而不是其他任何東西來讓你保持清醒。

然后在您的步驟 class 中引用它,例如

[Binding]
public class Steps
{
    private readonly IWebDriver _webDriver;

    public Steps(IWebDriver webDriver)
    {
        _webDriver = webDriver;
    }
}

BoDi 容器已經為您連接好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM