在Specflow / Selenium

时间:2016-10-10 08:11:02

标签: selenium specflow saucelabs

我有一个现有项目,它使用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"];

我认为这是问题,而不是使用之前已经处理过的测试版本ScenarioContexttestThreadCount获取新实例。

但我不明白为什么这会在另一个项目中起作用呢?

我正在使用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.我现在更新了这个以匹配并且它可以工作。

不确定这个值应该是多少。我认为它不应该是相同数量的测试,但是我如何解决我原来的共享驱动程序上下文问题?

1 个答案:

答案 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。