2012-04-06 15 views
1

私はセレンの初心者であり、多くの研究の後、私は停止するようになりました。私は以下の持っているものに似たコードを使用してさまざまな例を見てきました:コーディングプラクティスに関するセレンの懸念

 
class LoginPage 
{ 
    private IWebDriver driver; 

    public LoginPage(IWebDriver driver) 
    { this.driver = driver; } 

    //HomePage appears when Login successful 
    public HomePage DoLogin(string user, string pass) 
    { 
     driver.FindElement(By.Name("userfield")).SendKeys(user); 
     driver.FindElement(By.Name("passfield")).SendKeys(pass).Submit(); 

     //what is the above fails and i stay on the LoginPage? returning a HomePage object will be a bad idea here 

     HomePage homepage = new HomePage(driver) 
     PageFactory.InitElements(driver, homepage) 
     return homepage; 
    } 
} 

class HomePage{ 
    public HomePage(WebDriver driver) 
    { this.driver = driver; } 

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

    public LoginPage logout() 
    { 
     clickExitButton(); 

     LoginPage loginpage = new LoginPage(driver) 
     PageFactory.InitElements(driver, loginpage); 
     return loginpage; 
    } 
} 

私の質問:

  1. 何のクラスのいずれかは、彼らが行うことになっているものを行うに失敗していますか?ログインに失敗したらどうなりますか?それでもHomePageオブジェクトは返されます。これは当てはまらないはずですよね?失敗に取り組むためには何ができるでしょうか?私が見た例のほとんどは、物事が「うまくいく」ことが正しく働くと想定しています。

  2. 上記の実装はC#では正しいですか?私が見てきた例のほとんどは、Javaのためのものである - 私はC#のを知っているように、単にCの#に変換したい:)

ありがとう!

答えて

1

あなたが最初に質問したのは、これまでに対処してきた方法は、各ページクラスに、Seleniumが現在ページに表示されているかどうかを示す関数を含めることです。あなたは、その後に不一致を処理するのは自由です

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

:あなたは新しいHomepageを作成するときに、あなたはすぐにそれが有効であることを確認し

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

:たとえば、Homepageクラスのようなものを持っているでしょうどのような方法であれ、あなたの目的に適しています。もちろん、この方法はだまされる可能性があるので、ページ名(例:homepage.html)のURLを確認することもできます。あなたのページチェックの厳格さは、どれくらいの精度と柔軟性が必要かによって異なります。

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

+0

ありがとうございました!それはまさに私が探していたものです。 –

+1

この確認は 'HomePage'を使ったコードではなく、ホームページのコンストラクタが現在表示されているページが実際にホームページであることを確認し、そうでなければ例外をスローするべきです。現在のページでない限り、 'HomePage'をインスタンス化しようとしないでください。 –

+0

こんにちはロス、あなたのフィードバックに感謝します。しかし興味深いことですが、コンストラクタに例外をスローするのは良い方法ですか? –

0

あなたの最初の質問については、「userfield」または「passfield」のいずれかを見つけられなかった場合、Seleniumは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")); 
+0

ブライアン、そうです。 FindElementを使用して例外を回避する方法が必要だと思っていましたが、そうではなく、私はこのようにうれしいです。私はまだWebDriverとC#を学んでいますので、NUnitで作業する機会はありませんでしたが、私が読んだことから、あなたが言っていることが分かります。ご意見ありがとうございます! –

+1

try/catchブロックでラップすることで、例外を回避できます。これは本質的にあなたのテストをかなり遅くすることに留意してください。これは、Seleniumがそこに座り、例外をスローする(そしてキャッチされる)前に、 "ImplicitWait"の時間に設定した値を待つためです。 –

関連する問題