1

ボタンをクリックすると別のページに移動する Web プロジェクトがあります。新しいページは、サーバー内のデータに応じて、3 つの可能なページのいずれかになります。(そのうちの 2 ページの URL は同じかもしれません)

PageObject モデルを使用して、各ページに期待される要素を表す 3 つのクラスがあります。

実際にロードされたページを実際に見つける最良の方法は何ですか? 3 つの一意の要素を待機して、実際に読み込まれた要素を取得できる OR 型の待機はありますか?

4

2 に答える 2

0

ログインが新しいユーザー向けであるかどうかを検出する必要があるという同様の問題がありました(ログインページは、ホームページに直接ではなく、利用規約のページに移動します)。

最初は待ってから2ページ目をテストしましたが、これは面倒だったので、これを思いつきました.

これで結果をテストするには:

var whichScreen = waitForEitherElementText(By.CssSelector(HeaderCssUsing), "HOME SCREEN", "home", terms.getHeaderLocator(), terms.headerText, "terms", driver, MAX_STALE_RETRIES);

        if(whichScreen.Item1 && whichScreen.Item2 == "terms")
        {
            terms.aggreeToTerms();
        }

これが呼び出すメソッドは次のとおりです。

    protected Tuple<bool, string> waitForEitherElementText(By locator1, string expectedText1, string return1Ident,
        By locator2, string expectedText2, string return2Ident, IWebDriver driver, int retries)
    {
        var retryCount = 0;
        string returnText = "";
        WebDriverWait explicitWait = new WebDriverWait(driver, TimeSpan.FromSeconds(globalWaitTime));
        driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0.5));
        while (retryCount < retries)
        {
            try
            {
                explicitWait.Until<bool>((d) =>
                {
                    try
                    {
                        if (Equals(d.FindElement(locator1).Text, expectedText1)) { returnText = return1Ident; };
                    }
                    catch (NoSuchElementException)
                    {
                        if (Equals(d.FindElement(locator2).Text, expectedText2)) { returnText = return2Ident; };
                    }
                    return (returnText != "");
                });
                return Tuple.Create(true, returnText);
            }
            catch (StaleElementReferenceException e)
            {
                Console.Out.WriteLine(DateTime.UtcNow.ToLocalTime().ToString() +
                    ":>>> -" + locator1.ToString() + " OR " + locator2.ToString() + "- <<< - " +
                    this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name +
                    " : " + e.Message);
                retryCount++;
            }
        }
        return Tuple.Create(false,"");
    }

明示的な待機はブール値を使用するため、完全な待機時間の間ループします (テストサーバーが非常に遅いため、これを 60 秒に設定します)。暗黙の待機は 0.5 秒に設定されているため、要素テストは 0.5 秒ごとに試行され、true が返されるか失敗するまでループします。私は Tuple を使用して、自分がどの画面にいるのかを検出できるようにしています。この場合、利用規約に同意すると、通常のページ パスに戻ります。

于 2014-06-09T13:38:55.537 に答える
0

はい、一意の要素 (ページを識別する) の存在を確認し、フレームワークでそれぞれのページを返すことができます。

ただし、テストでは、次に予想されるページを知っている必要があり、正しいページが読み込まれたと想定して、さらにアクション/アサーションを実行する必要があります。ここにアサーションを配置して、正しいページが読み込まれたことを確認することもできます。別のページがロードされた場合、アサーションが失敗するため、テストは最終的に失敗します。このようにして、テストはより読みやすくなり、アプリケーションの流れを説明します。

また、テスト用に事前にテスト データを設定することをお勧めします。このようにして、サーバーで利用可能なデータを知り、テストでどのページがレンダリングされるかを知ることができます。

于 2012-11-21T15:04:58.133 に答える