首先,这里使用的技术包括:Visual Studio,C#,Selenium WebDriver,Google Chrome和MS Excel。
我正在构建自动化框架以测试多个Web应用程序。我使用Excel电子表格提取可变数据,以便其他测试人员可以更轻松地使用测试。在我们的烟雾测试期间,我们会按顺序完成几个单元测试。因此,我认为创建有序测试是个好主意。当单独运行每个测试时,它们工作得很好。但是,一旦我开始运行Ordered Tests,列表中的第一个测试就会运行,但后来我收到了这个错误:
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时它也会立即抛出异常(即使睡眠定时器还没有完成)。
无论如何,此时我正在寻找任何可能的指导,非常感谢。请记住,我不是这些技术的专家。
答案 0 :(得分:0)
您是否在调试模式下运行/测试?如果是这样,GC将忽略COM对象并且未正确释放。这和我理解的一样。我最近在另一个SE线程中找到了这个解决方案。如果我能找到线程,我会链接它。解决方案是在发布模式下运行,看看问题是否仍然存在。
编辑:Here是解释为什么调试模式导致GC忽略某些事情的线程。
答案 1 :(得分:0)
除此之外,现在有很好的开源库(nuget包)可以用来读取excel文件,几乎和excel互操作一样,但没有excel,因此避免了所有可能的COM障碍。例如,请查看EPPlus或ExcelDataReader。