1

私はセレンの初心者であり、多くの調査の結果、停止しました。以下のようなコードでさまざまな例を見てきました。

クラス LoginPage
{
    プライベート IWebDriver ドライバー。

    public LoginPage (IWebDriver ドライバー)
    { this.driver = ドライバー; }

    //ログインに成功するとホームページが表示される
    public HomePage DoLogin (文字列ユーザー、文字列パス)
    {
        driver.FindElement(By.Name("ユーザーフィールド")).SendKeys(ユーザー);
        driver.FindElement(By.Name("passfield")).SendKeys(pass).Submit();

        // 上記が失敗し、LoginPage に留まるとは何ですか? ここで HomePage オブジェクトを返すのは悪い考えです

        HomePage ホームページ = 新しい HomePage(ドライバ)
        PageFactory.InitElements(ドライバー、ホームページ)
        ホームページを返す;
    }
}

クラスホームページ{
    公開ホームページ(WebDriverドライバー)
    { this.driver = ドライバー; }

    public void clickExitButton()
    {
        exitButton.click();
    }

    public LoginPage ログアウト()
    {
        clickExitButton();

        LoginPage loginpage = new LoginPage(driver)
        PageFactory.InitElements(ドライバー、ログインページ);
        ログインページを返します。
    }
}

私の質問:

  1. どちらかのクラスが本来の目的を果たせていないのは何ですか? ログインに失敗したら?それでも HomePage オブジェクトが返されます。これはあってはならないことですよね?失敗に立ち向かうために何ができるでしょうか?私が見た例のほとんどは、物事が正しく「うまくいく」ことを前提としています。

  2. 上記の実装は C# で正しいですか? 私が見た例のほとんどはJava用です-私がC#を知っているように、それらをC#に変換したかっただけです:)

ありがとう!

4

2 に答える 2

1

あなたの最初の質問については、私が以前に対処した方法は、Selenium が現在期待されるページにあるかどうかを示す関数を各ページ クラスに含めることです。たとえば、Homepageクラスには次のようなものがあります。

public bool IsCurrentPage()
{
    try
    {
        driver.FindElement(By.LinkText("Logout"));
    }
    catch (Exception)
    {
        return false;
    }
    return true;
}

したがって、新しい を作成するとHomepage、すぐにそれが有効であることを確認します。

HomePage homepage = new HomePage(driver);
if (!homepage.IsCurrentPage())
   throw new Exception("Invalid homepage object");

その後、目的に適した方法で不一致を自由に処理できます。もちろん、メソッドはだまされる可能性があるため、別のオプションとして、ページ名 (homepage.html など) の URL をチェックすることもできます。ページチェックをどれだけ厳密にするかは、必要な精度と柔軟性に応じてあなた次第です.

2 番目の質問については、セミコロンがいくつか欠けていることを除けば、コードは正常に見えます。

于 2012-04-06T15:22:41.880 に答える
0

最初の質問: Selenium は、「userfield」または「passfield」のいずれかが見つからない場合、Homepage オブジェクトを返しません。

FindElementBy(...) メソッドを使用することで、それらのフィールドが存在する必要があるという暗黙の前提を作成しています。Selenium がページ上に「userfield」または「passfield」要素を見つけられない場合、例外がスローされます。その場でテストを事実上「失敗」させます。

通常、このプロセスが機能する方法は、nUnit が統合テストを開始することです。Selenium が続行に必要な要素の 1 つを見つけられない場合、その特定の統合テストは失敗します。

私の意見では、これが、統合テストを可能な限り区分化することが有益である理由です。確実に機能する動作のテストに必要なセットアップ作業が多すぎないことを確認します。

また、特定の要素がページ上にないことを確認するために、この拡張メソッドが非常に役立つこともわかりました。この拡張メソッドは、Selenium の "ImplicitWait" 時間の餌食になることに注意してください。この 1 回の呼び出しでは、先に進む前に実質的に N 秒が経過する必要があります。

public static class RemoteWebDriverExtensions
{
    public static bool ElementDoesNotExist(this RemoteWebDriver driver, By by)
    {
        try
        {
            var element = driver.FindElement(by);

            return false;
        }
        catch (Exception)
        {
            return true;
        }
    }
}

最終的には次のように使用できます。

driver.ElementDoesNotExist(By.LinkText("Logout"));
于 2012-04-10T15:24:25.500 に答える