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



核心实现代码
通用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
相关产品推荐
相关产品推荐

