我有一个现有项目,它使用Specflow和SpecRun对Sauce Labs运行一些测试。我有一个BeforeSenario
钩子,可以创建一个RemoteWebDriver
和一个AfterScenario
钩子来关闭它。
我现在已将此移动到另一个项目中(复制文件,只更改了命名空间)并且第一个测试运行正常,但后来出现以下错误:
类型' OpenQA.Selenium.WebDriverException'的例外情况发生在WebDriver.dll中但未在用户代码中处理
其他信息:意外错误。您刚刚发送的命令(POST元素)没有会话ID。
这通常是由测试框架试图在测试结束后运行命令引起的。
例如,您可能正在尝试捕获屏幕截图或检索服务器日志 在使用tearDown方法调用selenium.stop()或driver.quit()之后。 请确保在会话结束前完成此过程。
我已经比较了该项目及其使用相同版本的SpecFlow,相同的.Net版本。我看不出这两个项目之间有什么区别。
在我的步骤中,我有以下一行:
public static IWebDriver driver = (IWebDriver)ScenarioContext.Current["driver"];
我认为这是问题,而不是使用之前已经处理过的测试版本ScenarioContext
从testThreadCount
获取新实例。
但我不明白为什么这会在另一个项目中起作用呢?
我正在使用Github中的Specflow示例here
更新
看起来我发现了这个问题。在Default.srprofile中,OutputStream outputStream = result.getDriveContents().getOutputStream();
ByteArrayOutputStream bitmapStream = new ByteArrayOutputStream();
/* image is my Bitmap */
image.compress(Bitmap.CompressFormat.PNG, 100, bitmapStream);
try {
outputStream.write(bitmapStream.toByteArray());
} catch (IOException e1) {
Log.i(TAG, "Unable to write file contents.");
}
为1,而工作解决方案中的值为10.我现在更新了这个以匹配并且它可以工作。
不确定这个值应该是多少。我认为它不应该是相同数量的测试,但是我如何解决我原来的共享驱动程序上下文问题?
答案 0 :(得分:1)
TestThreadCount详细说明了SpecFlow + Runner(又名SpecRun)用于执行测试的线程数。 每个线程都是分开的。默认值是AppDomain隔离,因此每个线程都在一个单独的AppDomain中运行。
在SauceLab示例中,有7个场景,并且跑步者配置为使用10个线程。这意味着,每个场景都在具有自己的AppDomain的不同线程中执行。由于没有线程执行第二个场景,因此不会在示例
中出现此错误只有一个线程,你的线程正在执行多个场景,你就会遇到这个问题。
如果从字段中删除静态,最简单的修复方法就是。对于每个场景,您都会获得绑定类的新实例。你不必记住静态。
更好的例子如何使用Selenium和SpecFlow& SpecFlow +看看这里:https://github.com/techtalk/SpecFlow.Plus.Examples/tree/master/SeleniumWebTest
您必须调整WebDriver-类才能在RemoteWebDriver上使用SauceLabs。