1

首先,这里使用的技术包括:Visual Studio、C#、Selenium WebDriver、Google Chrome 和 MS Excel。

我正在构建一个自动化框架来测试多个 Web 应用程序。我正在使用 Excel 电子表格来提取可变数据,以便其他测试人员可以更轻松地使用测试。在我们的冒烟测试期间,我们运行了几个我按顺序构建的单元测试。因此,我认为创建有序测试是个好主意。单独运行每个测试时,它们工作得很好。但是,一旦我开始运行有序测试,列表中的第一个测试将运行,但随后出现此错误:

System.Runtime.InteropServices.InvalidComObjectException:无法使用已与其基础 RCW 分离的 COM 对象。

我在一个名为 ReadFile 的类中创建了对我的 Excel 电子表格的引用:

static Excel.Application xlApp = new Excel.Application();
static Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"SPREADSHEET LOCATION");
static Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
static Excel.Range xlRange = xlWorksheet.UsedRange;

当我的测试通过或失败时,它们会调用 CleanUp 方法,该方法包括退出 chromedriver 并调用 ReadFile.Close() 方法:

xlWorkbook.Save();

xlWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);

xlApp.Quit();

GC.Collect();
GC.WaitForPendingFinalizers();

我做了很多研究,发现可能需要调用 Mashall.FinalReleaseComObject。我也尝试过使用它,但似乎没有什么不同。我还注意到 Excel 进程在第一次测试完成后继续运行几秒钟。所以我尝试让线程休眠,让它在下一次测试开始之前等待 Excel 完全关闭,但是当 Excel 被删除时它也会立即抛出异常(即使睡眠定时器还没有完成)。

无论如何,在这一点上,我正在寻找任何可能的指导,非常感谢。请记住,我不是任何这些技术的专家。

4

2 回答 2

0

除此之外,现在有很好的开源库(nuget 包)可以用来读取 excel 文件,几乎与使用 excel 互操作的方式相同,但没有 excel,从而避免了所有可能的 COM 障碍。例如,看看EPPlusExcelDataReader

于 2017-11-10T22:35:27.933 回答
0

您是否在调试模式下运行/测试它?如果是这样,则 GC 忽略了 COM 对象并且它没有被正确释放。这和我理解的差不多。我最近在另一个 SE 线程中找到了这个解决方案作为答案。如果我能找到线程,我会链接它。解决方案是在发布模式下运行,看看问题是否仍然存在。

编辑:是解释为什么调试模式会导致 GC 忽略某些事情的线程。

于 2017-11-09T20:48:36.983 回答