我正在使用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,但这并不能解决问题。没有:可见的过滤器,它工作正常。当我直接在浏览器的控制台窗口中执行该选择器时(使用jQuery),它返回我想要的内容。
要解决这个问题,我可以使用WatiN的内置功能来执行我自己的JavaScript来返回一个元素,但我想知道是否有其他人成功使用了:使用Find.BySelector可见。
答案 0 :(得分:0)
现在,我和this solution一起去了。它使用页面上已有的“真实”jQuery副本在JavaScript中执行选择器。我已经修改了一下,根据它是否已被插入动态插入辅助JavaScript。它也是通用的,因此您可以指定要返回的Element的类型。以下是浏览器对象的所有相关扩展方法:
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));
}