1

抽象化と再利用のために、Webページ上の要素をクラスとしてモデル化する理想的な方法は何でしょうか。
現在、私が作成したのは、次のメンバー変数を含むBaseElement.javaクラスです。

WebDriver webdriver;

コンストラクター:

protected BaseElement(WebDriver driver)
 {
  //Initialization.
 }

次に、このクラスを、Webページ上の特定の要素を表す他のクラスに拡張します。
たとえば、BaseElement.javaを拡張するButton.javaクラスがあります。

  public class ButtonElement extends BaseElement {


        String locator;
        By by;
        WebElement button;

        protected ButtonElement(WebDriver driver, String locator, By by) {
            super(driver);
            this.by = by;
            this.locator = locator;

           //code to find the element using driver.findElement()
           // I am not sure how to use By in here depending upon what I pass in the constructor when I create an object of this class. Any suggestions?
        }

        public void click() {

          button.click();
        }

        //Other methods which will interact with the element in other ways.
  }

したがって、私のPageObjectクラスでは、次のように上記を利用します。

Button loginButton = new Button(driver,"btn-Login",By.id);
loginButton.click();

これは正しいアプローチですか?Webドライバーの観点から、抽象化し、複雑なロジックを単一のクラスで非表示にし、ボタン、テキストボックス、選択リストなどの要素を再利用するためのより良い方法はありますか?前もって感謝します!

4

3 に答える 3

2

要素を見つけるたびにドライバーを渡すことが道のりだとは思いませんが、コードの繰り返しを避けることを目指していると思います。代わりに、コードの開始時にインスタンス化されるドライバークラスにアクセスするクラスを作成することもできます。このようにして、実装された要素を見つける「タイプ」と「属性」を渡すことができます。例えば。タイプ:Id、Class、XPath; および属性: "text"、 "// div [@ class =" class "] /div[2]"。

したがって、
DriverClass:タイプごとにスイッチを備えたFindElementを実装するWebDriverがあります。
WrapperClass:DriverClassを使用して機能を実装する「Click」や「DoesElementExist」などのクラスがあります。
TestClass:WrapperClassの呼び出しを使用して、コードロジックを実装します。

さらに進んで、WrapperClassを利用する別のクラスでアクションの一般的なグループ化を実装して、TestClassがよりクリーンになるようにすることができます。

于 2013-03-21T21:36:27.720 に答える
2

さて、この場合、それを行うための正しい方法は複数あります。

最初に車輪の再発明をしないでください-おそらくあなたが望むのと同じことをするPageObjectが存在します:それについてここで読んでください

2つ目の個人的なアプローチは、アクセスするすべてのページにクラスを設定し、メソッドをモデル化して、それらが何をしているかを説明することです。このようなもの:

 class InitPage {
   private Webdriver driver;

   public InitPage(){
     driver = new FirefoxDriver();
     driver.get("http://my-test-page.com");
   }

    public WebDriver getDriver(){
     return driver;
    }

    public AdminPage loginToSite(String username, String Password){#
     WebElement login = driver.FindElement(By.id("adm-login");
     login.sendKeys(username);
     WebElement pwd = driver.FindElement(By.id("adm-pwd");
     pwd.sendKeys(password);
     WebElement confirmButton = driver.FindElement(By.id("login-submit");\
     confirmButton.click();
     return new AdminPage(this);

   }

 }


class AdminPage{
  private InitPage initPage

  public AdminPage(InitPage init){
     this.initPage = init;
  }

  public String getLoggedInUser();
  WebElement user = initPage.getDriver().findElement(By.id("usr-credential-name")); //just show off how you approach the webDriver
  return user.getText();   

}

そして後でテストで:

@Test
public void TestLoging(){
  InitPage firstPage = new InitPage();
  AdminPage administration = firstPage.login("Pavel", "omgTooSecretToTellYou!");
  Assert.assertEquals(administration.getLoggedInUser(), "Pavel"); //example how you can do the tests
}
于 2013-03-18T10:57:01.840 に答える
1

私はAbhijeetとPavelに部分的に同意します。Webelementを抽象化するときは、Webelementsインターフェイスのすべてのメソッドをすでに実装しているクラスを拡張するのが良いでしょう。そうでなければ、Pavelが言ったように、車輪の再発明のようになります。私の個人的な意見はフォームのようなより大きなWebElementsを抽象化することで、複数のWebelementsを作成します。フォームは小さなページのようなものです...しかし、これも私の個人的な意見です。

于 2015-04-08T14:07:03.830 に答える