【问题标题】:WatiN won't work with MSpec - UnauthorizedAccessExceptionWatiN 不适用于 MSpec - UnauthorizedAccessException
【发布时间】:2011-03-11 16:11:55
【问题描述】:

我正在尝试使用 TestDriven.Net 让 WatiN 在 VS2010 中使用 MSpec。我的代码如下:

[Subject("Whatever")]
public class when_on_home_page {

    private static IE browser;

    Establish context = () =>
        browser = new IE();

    Because of = () => {
        browser.GoTo("http://localhost:1234/");
        browser.WaitForComplete();
    };

    It should_show_add_details_link = () =>
        browser.Link(Find.ByValue("Add Details")).Exists.ShouldBeTrue();
}

当我运行这个时,浏览器会加载页面,但是当它检查链接时,我得到:

无论如何,在主页上时
» 应该显示添加详细信息链接(失败)

测试“应该显示添加详细信息链接”失败: System.UnauthorizedAccessException:访问被拒绝。 (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED)) 在 mshtml.IHTMLElementCollection.tags(对象标签名) 在 WatiN.Core.Native.InternetExplorer.IEElementCollection.GetElementsByTag(String tagName) 在 WatiN.Core.NativeElementFinder.FindElementsByTag(String tagName) 在 WatiN.Core.NativeElementFinder.d__2.MoveNext() 在 WatiN.Core.ElementFinder.FindFirst() 在 WatiN.Core.Element.FindNativeElementInternal() 在 WatiN.Core.Element.get_Exists() NavigationSpecs.cs(20,0):在 RoboWeb.Specs.when_on_home_page.<.ctor>b__2() 在 Machine.Specifications.Model.Specification.InvokeSpecificationField() 在 Machine.Specifications.Model.Specification.Verify()

环顾四周,我检查了以下内容:

  • VS 正在以管理员身份运行
  • TestDriven.Net 显然在 STA 模式下运行一切
  • IE 已关闭“保护模式”
  • 我无法将该网站添加到受信任的网站,可能是因为它在本地运行
  • 我调用了WaitForComplete(),也试过Thread.Sleep()

我也尝试过使用 FireFox,但它只是崩溃了。

知道我在这里做错了什么吗?

【问题讨论】:

    标签: visual-studio-2010 c#-4.0 watin testdriven.net mspec


    【解决方案1】:

    These specifications 为我工作。实际上,这是我的第一个 WatiN 规范;我在尝试重现您收到的错误时写道。 :-)

    我唯一需要做的就是关闭 IE 的保护模式。我跑了规格

    • 在命令行上(参见 repo 中的WebSpecs-Watin.cmd,请在运行 cmd 之前编译 specs 项目并从 VS 运行 Web 应用程序)
    • 使用 TD.Net 跑步者
    • 使用 ReSharper

    他们在所有三种情况下都成功了。我没有以管理员身份运行。

    您能否尝试使用上面链接的项目重现错误?如果您没有安装 Git,顶部有一个下载按钮。

    【讨论】:

    • 命令行可以工作,但 Td.Net 不行——奇怪的是,找不到页面中的元素。我尝试了我的命令行运行程序,它可以工作,所以我猜是我的 Td.Net 运行程序有问题。我有最新版本,我尝试在 packages\(mspec)\tools 中运行“InstallTDNetRunner”批处理文件,但没有任何乐趣。至少我知道现在问题出在哪里,所以我可以进一步调查。谢谢
    • 如果您使用的是 TD.Net >= 2.24,则无需安装 TD.Net 运行器。只需确保 MSpec.tdnet、MSpec.TDNetRunner.dll 和 MSpec.dll 文件位于同一文件夹中即可。
    • 是的,我意识到 - 我正在使用 v3,但无论哪种方式都没有什么不同。一切都在正确的文件夹中(我的文件夹是从 NuGet 安装的,而你的文件夹是对的),但我仍然得到相同的结果。它确实运行了 MSpec 测试,似乎是 WatiN 方面存在问题。我现在只从命令行运行它。感谢您的帮助
    【解决方案2】:

    System.UnauthorizedAccessException 可能在多种情况下发生。如果页面没有完全加载并且您尝试访问一个对象,并且根本不是正确的用户。我会先手动调试脚本,然后以管理员身份运行测试运行程序。

    如果可行,请尝试管理员和全速、非管理员和全速以及管理员和调试的组合。那么你应该对真正的问题有一个好主意。在极少数情况下(使用早期早期版本的 WatiN),我必须将调用包装在 try - catch 然后处理此异常,然后在短暂等待后重试。

    【讨论】:

    • 谢谢,但不高兴:在 Watin.Core.dll 的 IEElementCollection.cs 的这一行中,调试给出了同样的错误:'(IHTMLElementCollection)elementCollection.tags(tagName)'。捕获、等待、重试会得到相同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多