0

我正在使用 WatiN 2.1 驱动 Internet Explorer 进行自动化集成测试。对于我的一个测试,我想在单击创建菜单的按钮后在动态创建的弹出菜单中选择一个项目。菜单本身是一个 jQuery 插件,可以创建具有特定类的无序列表。

我正在使用 WatiN 2.0 的新 Find.BySelector 方法通过这个特定的类进行搜索,效果很好。但是,在创建多个菜单的测试中,我很难选择当时可见的菜单。为此,我想我会使用 :visible 过滤器将我的结果限制为只有那些可见的菜单(一次只能看到一个)。但是,当我使用以下代码时:

WebBrowser.Current.ElementOfType<List>(Find.BySelector("li.fg-menu:visible"));

我收到 WatiN.Core.Exceptions.RunScriptException 抛出的消息:“System.Runtime.InteropServices.COMException:HRESULT 的异常:0x80020101” 在搜索这个特定的 HRESULT 时,人们建议以管理员身份运行 Visual Studio,但这确实不解决问题。如果没有 :visible 过滤器,它可以正常工作。当我直接在浏览器的控制台窗口中执行该选择器(使用 jQuery)时,它会返回我想要的。

为了解决这个问题,我可以使用 WatiN 的内置功能来执行我自己的 JavaScript 以返回一个元素,但我想知道是否有其他人成功地将 :visible 与 Find.BySelector 一起使用。

4

1 回答 1

0

现在,我已经使用了这个解决方案。它使用页面上已有的“真实”jQuery 副本在 JavaScript 中执行选择器。我对其进行了一些修改,以根据它是否已被插入来动态插入辅助 JavaScript。它也是通用的,因此您可以指定要返回的元素类型。以下是浏览器对象的所有相关扩展方法:

    public static bool IsJavascriptEvaluateTrue(this Browser browser, string javascript)
    {
        var evalResult = browser.Eval("if (" + javascript + ") {true;} else {false;}");
        return evalResult == "true";
    }

    public static TElementType FindViaJQuery<TElementType>(this Browser browser, string cssSelector) where TElementType : Element
    {
        if (!browser.IsJavascriptEvaluateTrue("typeof('WatinSearchHelper') == 'function'"))
        {
            var js = "WatinSearchHelper = function () { " +
                     "    var earTagId = 1; " +
                     "    var getElementId = function (cssSelector) { " +
                     "        var resultId = \"_no_element_\"; " +
                     "        var el = $(cssSelector); " +
                     "        if (el.length > 0) { " +
                     "            var firstEl = el[0]; " +
                     "            if (firstEl.id == \"\") { " +
                     "                firstEl.id = \"_watin_search_\" + earTagId++; " +
                     "            } " +
                     "            resultId = firstEl.id; " +
                     "        } " +
                     "        return resultId; " +
                     "    }; " +
                     "    return { getElementId: getElementId }; " +
                     "} (); ";

            browser.Eval(js);
        }

        var elementId = browser.Eval(string.Format("WatinSearchHelper.getElementId(\"{0}\")", cssSelector));

        if (elementId == "_no_element_")
        {
            throw new ArgumentException("Unable to find element on page with selector '" + cssSelector + "'", "cssSelector");
        }
        return browser.ElementOfType<TElementType>(Find.ById(elementId));
    }
于 2013-03-01T14:39:18.937 回答