You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpecFlow报错objectContainer不存在 如何正确初始化ObjectContainer

SpecFlow UI自动化测试TFS流水线执行异常问题
  • 异常表现:使用SpecFlow框架运行UI自动化测试时,本地环境直接执行测试无任何报错,将测试项目上传至TFS流水线执行时触发错误。
  • 本地复现结果:调整配置后已在本地复现该问题,错误定位在自动生成的NUnit.Assembly文件中,错误提示为:"objectContainer"不存在于当前上下文。
  • 错误参考截图:
    TFS流水线执行错误截图1
    TFS流水线执行错误截图2
    本地复现错误详情截图
核心实现代码

通用Hook(General Hook)实现代码

using BoDi;
using InternetBanking.Tests.Helpers;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Edge;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using System;
using System.Configuration;
using System.IO;
using TechTalk.SpecFlow;

namespace InternetBanking.Tests
{

    [Binding]
    public class HookGeral
    {
        private IWebDriver _driver;
        public string _IBUITestsUri;
        public string _urlLogin;
        public string _urlLogout;
        public string _urlHome;
        public string _userName;
        public string _password;
        public string _newPassword;
        private ScenarioContext _scenarioContext;
        private IObjectContainer _objectContainer;

        public string Browser { get; } = ConfigurationManager.AppSettings.Get("Browser");
        public string IBUITestsUri { get; } = $"{ConfigurationManager.AppSettings.Get("IB-uitests-uri")}";
        public string UrlLogin { get; } = $"{ConfigurationManager.AppSettings.Get("IB-uitests-uri")}/usuario/login";
        public string UrlLogout { get; } = $"{ConfigurationManager.AppSettings.Get("IB-uitests-uri")}/usuario/logout";
        public string UrlHome { get; } = $"{ConfigurationManager.AppSettings.Get("IB-uitests-uri")}/home";
        public string UserName { get; } = ConfigurationManager.AppSettings.Get("Username");
        public string Password { get; } = ConfigurationManager.AppSettings.Get("Password");
        public string NewPassword { get; } = ConfigurationManager.AppSettings.Get("NewPassword");
        public string Login { get; } = ConfigurationManager.AppSettings.Get("Login");

        public HookGeral(ScenarioContext scenarioContext, IObjectContainer objectContainer)
        {
            _scenarioContext = scenarioContext;
            _objectContainer = objectContainer;
        }


        [BeforeScenario]
        public void BeforeScenario()
        {
            DefineBrowserDriver();
            _scenarioContext.Add("driver", _driver);
            _scenarioContext.Add("IB-uitests-uri", IBUITestsUri);
            _scenarioContext.Add("UrlLogin", UrlLogin);
            _scenarioContext.Add("UrlLogout", UrlLogout);
            _scenarioContext.Add("UrlHome", UrlHome);
            _scenarioContext.Add("Username", UserName);
            _scenarioContext.Add("Password", Password);
            _scenarioContext.Add("NewPassword", NewPassword);
            _scenarioContext.Add("Login", Login);
        }

        [AfterScenario]
        public void AfterScenario()
        {
            try
            {
                string path = "C:\\IBNet-AutoTests-Pics\\";
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                Screenshot ss = ((ITakesScreenshot)_driver).GetScreenshot();
                string sstitle = _scenarioContext.ScenarioInfo.Title.ToString();
                ss.SaveAsFile($"{path}{sstitle}.jpg", ScreenshotImageFormat.Jpeg);
            }
            catch (Exception)
            {
            }
            finally
            {
                IWebDriver driver = _objectContainer.Resolve<IWebDriver>();

                driver.Quit(); // 关闭用于启动Chrome窗口的控制台程序
                driver.Dispose(); // 关闭chromedriver.exe进程
            }
        }

        public class WebDriverController : IDisposable
        {
            public IWebDriver Driver;
            public void Dispose()
            {
                Driver.Dispose();
            }
        }

        private void DefineBrowserDriver()
        {
            EBrowser browser;
            Enum.TryParse(Browser, true, out browser);
            switch (browser)
            {
                case EBrowser.IE:
                    _driver = new InternetExplorerDriver();
                    break;
                case EBrowser.Edge:
                    _driver = new EdgeDriver();
                    break;
                case EBrowser.Firefox:
                    _driver = new FirefoxDriver();
                    break;
                default:

                    ChromeOptions options = new ChromeOptions();
                    options.AddArgument("--start-maximized");
                    options.AddArgument("--disable-infobars");
                    options.AddArgument("--disable-extensions");
                    options.AddArgument("--disable-gpu");
                    options.AddArgument("--disable-dev-shm-usage");
                    options.AddArgument("--no-sandbox");
                    options.AddArgument("--ignore-certificate-errors");
                    options.AddArgument("--headless");
                    options.AcceptInsecureCertificates = true;

                    _driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), options, TimeSpan.FromMinutes(3));
                    _driver.Manage().Timeouts().PageLoad.Add(TimeSpan.FromSeconds(30));
                    break;
            }
            _objectContainer.RegisterInstanceAs(_driver);

        }

    }
}

StepsBase基类实现代码

using BoDi;
using InternetBanking.Tests.Helpers;
using NUnit.Framework;
using OpenQA.Selenium;
using System;
using TechTalk.SpecFlow;

namespace InternetBanking.Tests.Steps
{
    [Binding]
    public class StepsBase
    {
        public IWebDriver _driver;
        public string _IBUITestsUri;
        public string _urlLogin;
        public string _urlLogout;
        public string _urlHome;
        public string _userName;
        public string _password;
        public string _newPassword;
        public ScenarioContext _scenarioContext;
        public IObjectContainer _objectContainer;

        public StepsBase(ScenarioContext scenarioContext)
        {
            _scenarioContext = scenarioContext;

            _driver = _scenarioContext["driver"] as IWebDriver;
            _objectContainer.RegisterInstanceAs(_driver);
            _IBUITestsUri = _scenarioContext["IB-uitests-uri"] as string;
            _urlLogin = _scenarioContext["UrlLogin"] as string;
            _urlLogout = _scenarioContext["UrlLogout"] as string;
            _urlHome = _scenarioContext["UrlHome"] as string;
            _userName = _scenarioContext["Username"] as string;
            _password = _scenarioContext["Password"] as string;
            _newPassword = _scenarioContext["NewPassword"] as string;
            WDCustomFunctions.DefineDriver(_driver);
        }

提前感谢各位提供可行的排查思路与解决方案。


内容的提问来源于stack exchange,提问作者Thiago De Vargas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:09:19