10

Selenium Webdriver のページ オブジェクトに関する簡単な質問です。私たちのサイトは非常に動的で、多くの ajax とさまざまな認証状態があります。各ページ オブジェクトを定義する方法を理解するのは難しいですが、サイトを表すいくつかのページ オブジェクトを理解して定義したとしましょう。

ページからページへのクロスをどのように処理しますか。したがって、ホームページ用のページ オブジェクト、アカウント ページ用のページ オブジェクト、および結果ページ用のページ オブジェクトを取得します。次に、すべてのページを走査して複数のアクションを実行するユーザーをシミュレートするテストを作成する必要があります。

新しい用途を作成するために HomePage オブジェクトを渡してください -> 次にアカウント ページ オブジェクトを取得していくつかのユーザー アクションを実行し、次に結果ページ オブジェクトを取得してそれらのアクションをすべて 1 つのスクリプトから検証します。

人々はこれをどのように行っていますか?

ありがとう

4

5 に答える 5

10

ユーザーがブラウザーの URL バーに新しい URL を入力することをシミュレートしている場合、必要なページ オブジェクトを作成するのはテスト クラスの役割です。

一方、ブラウザが別のページを指すようにする操作をページで実行している場合 (たとえば、リンクをクリックしたり、フォームを送信したりする場合)、そのページ オブジェクトは、次のページ オブジェクト。

ホームページ、アカウント ページ、および結果ページの間の関係について十分に理解していないため、サイトでどのように機能するかを正確に伝えることができないため、代わりにオンライン ストア アプリを例として使用します。

SearchPage があるとします。SearchPage でフォームを送信すると、ResultsPage が返されます。結果をクリックすると、ProductPage が表示されます。したがって、クラスは次のようになります (関連するメソッドのみに省略されます)。

public class SearchPage {

    public void open() {
        return driver.get(url);
    }

    public ResultsPage search(String term) {
        // Code to enter the term into the search box goes here
        // Code to click the submit button goes here
        return new ResultsPage();
    }

}

public class ResultsPage {

    public ProductPage openResult(int resultNumber) {
        // Code to locate the relevant result link and click on it
        return new ProductPage();
    }

}

このストーリーを実行するためのテスト メソッドは次のようになります。

@Test
public void testSearch() {

    // Here we want to simulate the user going to the search page
    // as if opening a browser and entering the URL in the address bar. 
    // So we instantiate it here in the test code.

    SearchPage searchPage = new SearchPage();
    searchPage.open(); // calls driver.get() on the correct URL

    // Now search for "video games"

    ResultsPage videoGameResultsPage = searchPage.search("video games");

    // Now open the first result

    ProductPage firstProductPage = videoGameResultsPage.openResult(0);

    // Some assertion would probably go here

}

ご覧のとおり、ページ オブジェクトの「連鎖」があり、それぞれが次のオブジェクトを返します。

その結果、多くの異なるページ オブジェクトが他のページ オブジェクトをインスタンス化することになります。そのため、かなりのサイズのサイトがある場合は、それらのページ オブジェクトを作成するために依存性注入フレームワークを使用することを検討できます。

于 2012-04-26T02:03:46.673 に答える
4

さて、ページを表す独自の Java クラスを作成しました。

たとえば、以下はホームページを表すコードです。ここでユーザーはログインできます:

public class HomePage{
  private WebDriver driver;
  private WebElement loginInput;
  private WebElement passwordInput;
  private WebElement loginSubmit;

  public WebDriver getDriver(){
    return driver;
  }

  public HomePage(){
    driver = new FirefoxDriver();
   }

  public CustomerPage login(String username, String password){
     driver.get("http://the-test-page.com");
     loginInput = driver.findElement(By.id("username"));
     loginInput.sendKeys(username);
     passwordInput = driver.findElement(By.id("password"));
     passwordInput.sendKeys(password);
     loginSubmit = driver.findElement(By.id("login"));
     loginSubmit.click();
     return new CustomerPage(this);
  }


}

Customer のページは次のようになります。ここで、たとえば、ログインしているユーザーを取得する方法を示しています。

public class CustomerPage{
    private HomePage homePage;
    private WebElement loggedInUserSpan;

 public CustomerPage(HomePage hp){
    this.homePage = hp;
  }

 public String getLoggedInUser(){
      loggedInUserSpan = homePage.getDriver().findElement(By.id("usrLongName"));
      return loggedInUserSpan.getText();
 }

}

そして、テストは次のようになります。

@Test
public void testLogin(){
  HomePage home = new HomePage();
  CustomerPage customer = home.login("janipav", "extrasecretpassword");
  Assert.assertEquals(customer.getLoggedInUser(), "Pavel Janicek");
}
于 2012-04-25T13:42:47.570 に答える
1

Page Object パターンを使用して Selenium Webdriver テストを作成することを楽しんでいます。しかし、個人的には、常に明示的にインスタンス化して次のページまたはページ コンポーネントを返さなければならない冗長さと繰り返しに悩まされていました。そこで、Python のメタクラスを利用して、Selenium ページ オブジェクトのメソッド呼び出しから何が返されるべきかを自動的に判断する Keteparaha というライブラリを作成しました

于 2015-03-11T08:34:53.860 に答える
1

I suggest you use a framework that provides support for these patterns. Geb is one of the best one out there. Below is an example taken from their manual

Browser.drive {
    to LoginPage
    assert at(LoginPage)
    loginForm.with {
        username = "admin"
        password = "password"
    }
    loginButton.click()
    assert at(AdminPage)
}

class LoginPage extends Page {
    static url = "http://myapp.com/login"
    static at = { heading.text() == "Please Login" }
    static content = {
        heading { $("h1") }
        loginForm { $("form.login") }
        loginButton(to: AdminPage) { loginForm.login() }
    }
}

class AdminPage extends Page {
    static at = { heading.text() == "Admin Section" }
    static content = {
        heading { $("h1") }
    }
}
于 2012-04-26T03:40:24.223 に答える