【发布时间】:2014-09-16 04:26:03
【问题描述】:
我正在将一堆 selenium 测试用例转换为 SpecFlow。一切都运行良好,但让我抓狂的是,我正在使用 after 场景来执行 driver.quit。执行时,我打开和关闭了大约 4-6 个浏览器。在查看任务管理器时,它正在杀死所有 chromedriver.exe(第二个在某处打开)并且 chrome.exe 成功处理,这很棒。如果我在 selenium 中运行相同的测试,我只有一个浏览器并且它会关闭。当 SpecFlow 现在运行时,它基本上会在我的运行中增加 10-20 秒,因为它会打开和关闭浏览器。
如果我将浏览器更改为 Firefox,我会得到同样的结果。一个浏览器打开,完成后,几个空白的 firefox 浏览器打开和关闭。
任何想法可能导致这种行为?我已经搜索过,除了我之外,似乎没有人经历过这种情况。
感谢您的帮助。
这里是拆解代码。我在 basetestobject 类中有它,它由 specflow 类继承。我试过删除 [TestCleanup] 但同样的结果适用。
BaseTestObject.cs
public class BaseTestObject
{
private IWebDriver seleniumDriver;
private IDriver testDriver;
[TestInitialize]
public virtual void Setup()
{
TestDriver.goToUrl(ConfigProperties.StartUrl);
}
[AfterScenario]
public void ScenarioTearDown()
{
TestDriver.Quit();
}
[TestCleanup]
public void CleanUp()
{
TestDriver.Quit();
}
public IWebDriver SeleniumDriver
{
get
{
if (seleniumDriver == null)
{
seleniumDriver = GetDriver();
}
return seleniumDriver;
}
}
public IDriver TestDriver
{
get
{
if (testDriver == null)
{
testDriver = new UiDriver(SeleniumDriver);
}
return testDriver;
}
}
public CurrentPageObjectScope On
{
get
{
return new CurrentPageObjectScope(TestDriver);
}
}
public static String GetTimestamp()
{
return DateTime.Now.ToString("yyyyMMddhhmmssfff");
}
public static String GetTimestamp2()
{
return DateTime.Now.ToString("M/d/yyyy");
}
private IWebDriver GetDriver()
{
switch (ConfigProperties.Browser.ToLower())
{
case "firefox":
return new FirefoxDriver();
case "chrome":
ChromeOptions options = new ChromeOptions();
ChromeDriverService service = ChromeDriverService.CreateDefaultService(@"../Chrome/");
service.SuppressInitialDiagnosticInformation = true;
service.HideCommandPromptWindow = true;
options.AddArguments("test-type");
options.AddArgument("--start-maximized");
return new ChromeDriver(service, options);
case "ie":
case "internetexplorer":
return new InternetExplorerDriver(@"../IE/");
default:
throw new NotImplementedException("Unknown browser string in Config properties " + ConfigProperties.Browser);
}
}
编辑 9.15.14
通过在我的 baseTestObject 中添加以下内容来解决。感谢您的帮助。
[AfterScenario]
public void CleanUp()
{
if (seleniumDriver != null)
{
SeleniumDriver.Dispose();
seleniumDriver = null;
}
}
【问题讨论】:
-
我也发现打开/关闭浏览器的时间成本很高。在我正在处理的项目中,我们不会杀死浏览器,我们会重复使用它,例如场景完成或完全刷新后导航到不同的起点。
-
谢谢本。不错的选择。奇怪的是,当我运行基本的谷歌测试时,我没有看到这种行为。我认为这是我的框架,但定期硒测试会立即关闭。我实际上禁用了 afterscenario 所以现在我手动关闭它。如果我运行整个套件,我会启用 afterscenario 并让它关闭它。不是一个很好的解决方法。
-
您能否在问题中包含您的 AfterScenario 代码?如果你也在使用它,还包括你的 BeforeScenario 钩子代码。
-
已添加到初始帖子中。感谢本的帮助。
-
你是否也得到了“TestDriver.Quit();”的代码那是你写的吗?正如 Sam 的建议答案中所提到的,如果您在每个场景之后都关闭浏览器,则不需要 TestCleanup。