Visual Studio 2008 中的 WatiN - 第二个测试方法失败

2023-11-23

当尝试在 Visual Studio 2008 中运行一个非常简单的 WatiN 2.0 (CTP3) 测试时,我发现第一个测试总是执行得很好。第二个测试方法似乎破坏了 IE 对象中的某些内容,产生以下异常:

测试方法 testProject.WatinTest.testTwo 抛出 例外: System.Runtime.InteropServices.InvalidComObjectException: 已分离的COM对象 从其底层 RCW 不能 用过的..

示例代码如下。由于初始化方法在 VS2008 中的工作方式,浏览器变量必须定义为static我认为这可能是问题的关键。不幸的是,除非以通用方法打开浏览器,否则这意味着每个测试都有一个单独的窗口,这并不理想

如果有任何关于如何解决这个问题的想法,我将非常感激。 Google 搜索和 SO 搜索没有产生任何有用的结果,所以我希望这个问题的一个好的答案能够帮助社区。非常感谢,


    private static IE ie

    [ClassInitialize]
    public static void testInit(TestContext testContext)
    {
        ie = new IE("http://news.bbc.co.uk");
    }

    [TestMethod]
    public void testOne()
    {
        Assert.IsTrue(ie.ContainsText("Low graphics"));
    }

    [TestMethod]
    public void testTwo()
    {
        Assert.IsTrue(ie.ContainsText("Low graphics"));
    }

我以前听说过这个问题,并打算对此进行一段时间的调查。现在 WatiN 2.0 beta 1 已经可用,我坐下来创建了一个帮助器类来使用 Visual Studios 测试运行器解决这个问题。继助手类和修改后的测试类之后。我也blogged关于此解决方案,以使其获得更多曝光。

public class IEStaticInstanceHelper
{
    private IE _ie;
    private int _ieThread;
    private string _ieHwnd;

    public IE IE
    {
        get
        {
            var currentThreadId = GetCurrentThreadId();
            if (currentThreadId != _ieThread)
            {
                _ie = IE.AttachToIE(Find.By("hwnd", _ieHwnd));
                _ieThread = currentThreadId;
            }
            return _ie;
        }
        set
        {
            _ie = value;
            _ieHwnd = _ie.hWnd.ToString();
            _ieThread = GetCurrentThreadId();
        }
    }

    private int GetCurrentThreadId()
    {
        return Thread.CurrentThread.GetHashCode();
    }
}

以及使用此助手的测试类:

[TestClass]
public class UnitTest 
{
    private static IEStaticInstanceHelper ieStaticInstanceHelper;

    [ClassInitialize]
    public static void testInit(TestContext testContext)
    {
        ieStaticInstanceHelper = new IEStaticInstanceHelper();
        ieStaticInstanceHelper.IE = new IE("http://news.bbc.co.uk");
    }

    public IE IE
    {
        get { return ieStaticInstanceHelper.IE; }
        set { ieStaticInstanceHelper.IE = value; }
    }

    [ClassCleanup]
    public static void MyClassCleanup()
    {
        ieStaticInstanceHelper.IE.Close();
        ieStaticInstanceHelper = null;
    }

    [TestMethod]
    public void testOne()
    {
        Assert.IsTrue(IE.ContainsText("Low graphics"));
    }

    [TestMethod]
    public void testTwo()
    {
        Assert.IsTrue(IE.ContainsText("Low graphics"));
    }
}

哈特哈, 杰罗恩

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio 2008 中的 WatiN - 第二个测试方法失败 的相关文章

  • 如何使用 Visual Studio 将文件版本嵌入 MSI 文件中?

    我的 C 程序有一个安装项目 该安装项目的属性中有一个版本 我希望生成的 MSI 文件嵌入此版本 这样我就可以在资源管理器中将鼠标悬停在该文件上并查看该文件的版本 我用的是VS2008 我怎样才能做到这一点 如果您只是将 版本 1 5 0
  • Selenium 中的断言和验证

    有人可以解释一下断言和验证之间的区别吗 我知道验证意味着它检查它是否存在 如果不存在 则测试失败并停止在那里 正确吗 那么 即使断言失败了 断言还会继续吗 我已经阅读了文档 但仍然无法理解它 不 你已经搞反了 在 Selenium IDE
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi
  • Visual Studio 的 C# 智能感知是否可以提示先显示某个方法重载?

    我有两个互相重载的方法 public class Car public int GetPrice string vinNumber string make Database GetMake vinNumber expensive opera
  • 为什么 Visual Studio 2008 总是重建我的整个项目?

    我有一个包含大约 60 个 C 源文件的 Visual Studio 项目 我可以进行构建 并且它可以毫无错误地完成 但如果我立即再次按 F7 它总是会重新编译大约 50 个源文件 它不会重新编译所有文件 这很奇怪 我设置了 启用最小重建
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 如果 CMAKE_RUNTIME_OUTPUT_DIRECTORY 更改,CMake 无法找到测试

    我正在使用 CMake 构建我的项目 并且尝试为每个模块创建一堆测试套件 显然如果我修改变量CMAKE RUNTIME OUTPUT DIRECTORY那么 ctest 找不到要运行的测试并失败 我做了一个最小的例子来展示我正在谈论的内容
  • 为标签生成成员:我有什么理由应该这样做?

    我在这里读过另一篇文章 因此 如果可能的话 您不应该为标签生成成员 我想知道有什么潜力缺点到这会是 我说的好处是性能提高 对吗 还要别的吗 我有一个带有 100 个标签的 winform 应用程序 不产生成员有什么好处 还是只有在 Web
  • 可以从 Visual Studio Team Studio 中的编码 WebTest 创建独立的 .EXE

    我正在运行 VS Team Studio 2008 我创建了一个 Web 测试 我想用它来监视公司网站 它与站点交互并进行一些往返处理 我想创建一个可以远程运行的独立 EXE 文件 我尝试将其转换为 VB 代码和 C 代码 然后将其编译为
  • 如何根据“配置管理器”创建自己定义的常量?

    当我选择 调试 配置时 DEBUG常数处于活动状态 当我选择 释放 配置时 DEBUG常量处于非活动状态 我如何创建自己的配置 以便它们包含我自己定义的常量 基本上 我想要这样 如果我选择配置 FOOBAR 就会有一个常量FOO and B
  • Visual Studio - 将 Web 应用程序发布到 Azure“重新输入您的凭据”不起作用

    我无法在 Visual Studio 2015 中将 asp net 应用程序发布到 Azure Web App 它要求我重新输入我的凭据 我这样做了 然后看到相同的 租用您的凭据 屏幕 我有两个 Azure 帐户 一个是我的同步 Azur
  • 如何在 e2e AngularJS 测试中进行文件上传?

    在我的一种观点中 我有一个文件上传控件 它支持通过拖放或单击按钮后打开的标准文件对话框上传文件 How to do this in my e2e tests1 1 Just one of the two options will be en
  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开
  • Pywinauto 如何获取返回元素的列表

    我正在使用具有自定义堆栈面板的 WPF 应用程序 它基本上是一个列表 列表中的项目完全相同 因此我无法选择特定文本来唯一标识元素 其他一些值 例如时间 是动态的 有没有办法让我获得返回的元素列表 我知道这是可能的 因为抛出了错误 Eleme
  • 在同一进程中使用不同版本的Python库

    我们正在开发一个Python 库 在开发过程中 我想使用该库的某些部分来测试它的新版本 也就是说 使用稳定的代码来测试开发代码 有没有办法在 python 中做到这一点 Edit 更具体地说 我们有一个库 LibA 里面有很多有用的东西 此
  • 使用 Selenium 导航时的陈旧对象引用

    我一直在尝试一个简单的程序 它可以从新页面导航和获取数据 返回历史记录并打开其他页面并获取数据等等 直到访问所有链接并获取数据 在以下网站上获得结果后 我尝试循环浏览第一列中获得的所有链接 并逐个打开这些链接并从每个页面中提取文本 但下面的
  • COM多线程支持

    第一次使用COM我有这个 COM dll 比如 ABCServer dll 我创建了一个 RCW 并在我的项目中添加了对它的引用 现在 我的应用程序创建了多个线程 每个线程从 COM dll 创建某些类并使用它们 但是 当其他线程正在处理
  • 实际 VS2017 Enterprise 中的 VS Code 小地图? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 VS2017 在我的例子中是企业版 是否有 Visual Studio Code 今年添加的迷你地图功能
  • Visual Studio 2015 中的 React 没有智能感知

    我没有看到任何 ReactJS 的智能感知 例如像这样的方法React createClass虽然我看到 references js文件位于根文件夹 这 references js文件有各种 React js 文件的帮助参考 我的react

随机推荐

  • 为什么 NaN 不是有限的?

    测试isFinite函数我看到NaN is an infinite数 即使是不是一个数字 isFinite NaN returns false 这背后的逻辑是什么 为什么不是NaN finite 正如戴夫 牛顿所说 NaN 不是一个数字 然
  • Jenkins Gradle 集成:调用 Gradle 与使用 Gradle Wrapper 选项

    我刚刚开始在我的项目中使用 Jenkins for CI 和 Gradle 构建工具 I found 使用 Gradle 和 Jenkins 构建持续交付管道我不明白为什么作者建议 始终使用包装器 c 编号 120幻灯片 为什么这比直接涉及
  • 在全局范围内重新定义指针

    In 这个问题我对 C 的这个看似基本的方面感到非常困惑 考虑这两行代码 int ptr ptr 2 gcc 将发出以下警告 main cpp 4 1 warning data definition has no type or stora
  • Google 地图 API v3 放置搜索 - 将另一个参数传递给回调函数

    我正在使用 Google 地图地方 API v3 返回许多 类型 的地点 每个地点由地图上的不同标记表示 我创建一个 google maps places PlacesService 对象 然后为每个地点类型调用一次 搜索 方法 每次 我都
  • 异步任务 获取 VS HttpResponseMessage 获取

    我需要您在以下方面提供帮助 近一个月来 我一直在阅读有关 Tasks 和 async 的内容 我想尝试在一个简单的 Web API 项目中应用我新获得的知识 我有以下方法 并且它们都按预期工作 public HttpResponseMess
  • 如何在 PHP 中解析和处理 HTML/XML?

    如何解析 HTML XML 并从中提取信息 Answer recommended by PHP Collective 原生 XML 扩展 我更喜欢使用其中之一原生 XML 扩展因为它们与 PHP 捆绑在一起 通常比所有第 3 方库更快 并为
  • 比较 android 中的语音 wav 或语音标签(语音命令)API

    我正在开发一个应用程序 我需要某种方法来比较两个语音是否匹配 我知道语音识别器是一种方法 但因为 我认为 它需要首先将语音转换为字符串 所以除了语音识别器支持的语言之外 不太适合其他语言 有什么想法吗 就像过去的电话一样 语音标签只是将语音
  • 用 C 语言模仿 Python 的 strip() 函数

    我最近开始用 C 语言开发一个小玩具项目 并且一直在摸索模仿 python 字符串对象的 strip 功能的最佳方法 阅读 fscanf 或 sscanf 发现字符串被处理到遇到的第一个空格 fgets 也没有帮助 因为我仍然有换行符 我确
  • HTML5 History API 后退按钮,部分页面加载

    为了提高网站的性能 响应能力 我使用 AJAX replaceState pushState 和 popstate 侦听器实现了部分页面加载 我基本上将页面的中心部分 HTML 存储为历史记录中的状态对象 单击链接时 我仅从服务器请求页面的
  • 无法使用 Cocoapods 动态框架导入 RestKit

    我安装了 cocoapods 的预发布版本 0 26 并尝试安装最新版本的 RestKit 在我的podfile我已经打开了use frameworks 强制 cocoapods 使用动态框架的标志 Putting import RestK
  • SQL Server触发器-使用deletetime将删除的记录插入到另一个表中

    目前我有一个 Item 表和一个 ItemWaste 表 两个表都会有一些字段 例如 名称 金额等 但是 ItemWaste 表还会多一个字段 即 TimeWasted 我希望自动将 Item 表中的 DELETED 项目插入到 ItemW
  • 如何在Qt中实现下拉单词建议?

    假设我有 10 个名字QListWidget 这是隐藏的 和一个aQLineEdit 现在 如果我在 编辑 行中输入字母 a 它应该显示列表小部件中以字母 A 开头的所有名称的下拉列表 用户可以使用鼠标或键盘进行选择 因为会有一个垂直滚动条
  • 将 JSON 字符串解码为类对象

    private func createWeatherObjectWith json Data x Any Type completion escaping data Any error Error gt Void do let decode
  • 指针和数组的区别[重复]

    这个问题在这里已经有答案了 可能的重复 char str STRING 和 char str STRING 之间的区别 C 指针和数组的区别 Hi 谁能告诉我以下陈述之间的区别 char p This is a test char a Th
  • android 中如何知道某个应用程序将被卸载?

    我想实现像 AppLock 应用程序正在做的事情 如果在其设置中设置为锁定应用程序卸载 安装 则在卸载任何应用程序时 恰好单击卸载按钮 会出现一个锁屏 要求输入密码 图案 只有输入密码后 用户才可以卸载应用程序 当一个人得到的意图是什么 或
  • 在事件处理程序中使用它

    我试图寻找它的意义thisDOM 级别 3 事件规范中事件处理函数内的关键字 根据我的实验this指的是event currentTarget object 标准中是否提到了这种行为 根据 JavaScript 权威指南 一书this指的是
  • iOS Safari 滚动到顶部在某些页面上不起作用。为什么?

    免责声明 该网站同时已更新 新版本的设计不再出现此问题 在我建立的一个新网站上 我注意到 Safari iOS 5 中有一个奇怪的怪癖 通常 您可以点击 Safari 顶部的黑条来滚动到任何网页的顶部 在我的新网站上 这适用于主页 但不适用
  • 如何在经典 ASP 中使变量静态(或“全局”)?

    我想让我的变量静态或 全局 因此与 NET 中的静态效果相同 访问它的每个会话都会得到相同的结果 如果一个会话修改它 它也会影响其他所有人 如何在经典 ASP 中实现这一目标 如果您想要一个可在应用程序范围内访问的变量 则可以使用应用程序对
  • 在 numpy 数组中设置空值

    如何根据条件将 numpy 数组中的某些值设为 null 我不明白为什么在不满足条件的情况下我最终会得到 0 而不是 null 或空值 b 是一个填充有 0 和 1 值的 numpy 数组 c 是另一个完全填充的 numpy 数组 所有阵列
  • Visual Studio 2008 中的 WatiN - 第二个测试方法失败

    当尝试在 Visual Studio 2008 中运行一个非常简单的 WatiN 2 0 CTP3 测试时 我发现第一个测试总是执行得很好 第二个测试方法似乎破坏了 IE 对象中的某些内容 产生以下异常 测试方法 testProject W