0

自動化された統合テストのために、WatiN 2.1 を使用して Internet Explorer を駆動しています。私のテストの 1 つでは、メニューを作成するボタンをクリックした後、動的に作成されたポップアップ メニューの項目を選択したいと考えています。メニュー自体は、特定のクラスで順序付けられていないリストを作成する jQuery プラグインです。

私は WatiN 2.0 の新しい Find.BySelector メソッドを使用して、この特定のクラスを介して検索していますが、うまく機能します。ただし、複数のメニューを作成するテストでは、その時点で表示されているメニューを選択するのに苦労しています。このため、:visible フィルターを使用して、表示されるメニューのみに結果を制限すると考えました (一度に表示できるのは 1 つだけです)。ただし、次のコードを使用すると:

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

「System.Runtime.InteropServices.COMException: HRESULT からの例外: 0x80020101」というメッセージとともに WatiN.Core.Exceptions.RunScriptException がスローされます問題を修正しません。:visible フィルターがなくても問題なく動作します。そのセレクターをブラウザーのコンソール ウィンドウで (jQuery を使用して) 直接実行すると、必要なものが返されます。

これを修正するには、WatiN の組み込み機能を使用して、独自の JavaScript を実行して要素を返すことができますが、Find.BySelector で :visible を使用して成功した人が他にいるかどうか疑問に思っています。

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 に答える