web-dev-qa-db-ja.com

Selenium2とwebdriverの良い動作例

私はSelenium 1を使用してきましたが、今Selenium2/webdriverに移行したいと考えています。正直なところ、Selenium2/webdriverから始めるのは少し難しいと思います。本質的には、ページオブジェクト間での作業方法がわかりません。これが私の例です:

public class LoginPage {
    private final WebDriver driver;

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

    public void loginAs(String username, String password) {
        driver.get("http://url_to_my_webapp");        
        driver.findElement(By.id("username")).sendKeys(username);
        driver.findElement(By.id("pwd")).sendKeys(password);
        driver.findElement(By.className("button")).submit();                  
    }

    public static void main(String[] args){
        LoginPage login = new LoginPage(new FirefoxDriver());
        login.loginAs("user", "pass");
    }
}

これで、ユーザーがログインした後、別のページへのリダイレクトが発生します。私が理解している限りでは、現在のページを表す新しいページオブジェクトを作成する必要があります... 「Hello World」レベルを超える優れた実用例はどこにありますか?この例をどのように続ければよいですか?

前もって感謝します!

12
babazumbula

これらのサイトには、いくつかの例があります。

http://luizfar.wordpress.com/2010/09/29/page-objects/

http://www.wakaleo.com/blog/Selenium-2-web-driver-the-land-where-page-objects-are-king

このページでは、PageFactoryを使用してページオブジェクトをサポートする方法について詳しく説明します。 http://code.google.com/p/Selenium/wiki/PageFactory

各ページのクラスを作成することにより、例を拡張してページオブジェクトを処理することができます。例:

public class MainPage 
{ 
  private final WebDriver driver;  

  public MainPage(WebDriver driver) 
  {     
    this.driver = driver;  
  }   

  public void doSomething() 
  {      
    driver.findElement(By.id("something")).Click;     
  }
} 

ログイン後にブラウザが移動するページを表すクラスを返すようにloginAsを変更します。

public MainPage loginAs(String username, String password) 
{       
    driver.get("http://url_to_my_webapp");             
    driver.findElement(By.id("username")).sendKeys(username);     
    driver.findElement(By.id("pwd")).sendKeys(password);     
    driver.findElement(By.className("button")).submit();
    // Add some error checking here for login failure
    return new MainPage(driver);                   
}
9
Naishy

この質問はかなり古いですが、共有する価値があるかもしれないと思いました。

通常、最初に必要なページオブジェクトクラスを作成します。次に、テストロジック用に別のクラスを作成します。ここで、クリックやその他のページ操作の「ユーザーワークフロー」を配置します。提供されているサンプルコードから、このクラスがmain()を置き換えると想定しています。これは、testNG/junit、testアノテーション、dataProvidersなどを含めるクラスでもあります(厳密には必須ではありませんが、これらを使用する場合、注意が必要な場合があります)このクラスでは、ページのクラスをインスタンス化できますasと対話します。作成したwebdriverオブジェクトは、ページクラスではなくブラウザを制御するため、それらが必要です。

この方法で行うことで、テストワークフローへの簡単な変更が可能になり、実際のページが変更された場合や、新しいテスト要件がある場合に備えて、ページオブジェクトも変更できます。

このメソッドの私のお気に入りの副作用は、ワークフローを含むクラスが、loginPage.Login()やloginPage.LoginSucceeded()のような呼び出しの下に隠された実際のテストの醜い詳細のすべてを含むテストの非常に読みやすい「スクリプト」になる可能性があることですそのため、カジュアルなパスでは、ユーザーの資格情報の検索、404/400の処理、ログインボタンの検索とクリックなどの詳細は表示されません。

5
robert arles