2017-04-06 22 views
0

私は、Seleniumを使用してグリッドまたはテーブルビューについて説明しています。 私がしたいことは、別のクラスが継承する抽象クラステーブルを開発することです。セレンの一般的なフィールド初期化

AbstractTableクラス:ここ はアイデアです

public abstract class AbstractTable extends HtmlElement { 
    public abstract Class<? extends AbstractRow> getHeader(); 
    public abstract Class<? extends AbstractRow> getRow(); 

    private Class<? extends AbstractRow> tableHeader = getHeader(); 
    private Class<? extends AbstractRow> tableRow = getRow(); 

    public AbstractTable() { // init method } 
} 

AbstractRowクラス:

@FindBy(xpath = ".//thead/tr") 
public abstract class AbstractRow extends HtmlElement { 

    @Override 
    public Rectange getRect() { return null; } 
} 

MyTableというクラス:

class MyTable extends AbstractTable { 

    @Override 
    public Class<? extends AbstractRow> getHeader() { return TableHead.class; } 
    @Override 
    public Class<? extends AbstractRow> getRow() { return TableRow.class; } 

    @FindBy(xpath = ".//thead/tr") 
    public static class TableHead extends AbstractRow { // some fields } 

    @FindBy(xpath = ".//tbody/tr[not(@class = 'clicked')]") 
    public static class TableRow extends AbstractRow { // some fields } 
} 

ある複数のクラスがあることを想像してみてMyTableに似ています。

私の主な質問は、クラスMyTableの内部クラスを装飾して初期化するかどうかです。そうでない場合は、これをより効率的に行う方法があるかもしれません。

+1

注実装を持つ抽象メソッドからプライベートフィールドを初期化することは本当に悪い考えです。それはコンストラクタからオーバーライド可能なメソッドを呼び出すこととまったく同じです(これは実際にあなたがやっていることなので)。代わりに、 'Class <? AbstractRow> '(または' AbstractRow'のインスタンス)をコンストラクタパラメータとして拡張します。 –

+0

さて、これをメモとして取っておきます。たぶんあなたは私にこれを行うより効率的な方法をアドバイスできますか?問題は、Seleniumで汎用クラス定義を使用することはできないということです。 –

+0

あなたが対処しようとしているシナリオ、これらのクラスの使用方法などについて詳細を追加してください。 – JeffC

答えて

1

私は過去に同様のことをやろうとしました。しかし、はるかに簡単でした。

public class Table extends AbstractPageElement { 

    public Table(WebElement wrappedElement, String name, String page) { 
     super(wrappedElement, name, page); 
    } 

    public static final String ROW_XPATH_LOCATOR = "//tbody/tr"; 

    private static String getCellXpathLocator(int row, int column) { 
     return ROW_XPATH_LOCATOR + "[" + row + "]/td[" + column + "]"; 
    } 

    public int getRowCount() { 
     return findAllByXPath(ROW_XPATH_LOCATOR).size(); 
    } 

    public String getCellValue(int row, int column) { 
     Cell cell = new Cell(row, column, this.name, this.page); 
     return cell.getText(); 
    } 


    public class Cell extends AbstractPageElement { 
     private int row; 
     private int column; 

     public Cell(WebElement wrappedElement, String name, String page) { 
      super(wrappedElement, name, page); 
     } 

     public Cell(int row, int column, String name, String page) { 
      super(Table.this.findByXPath(getCellXpathLocator(row, column)), name, page); 
      this.row = row; 
      this.column = column; 
     } 

     public String getText() { 
      return wrappedElement.getText(); 
     } 

     public Cell nextInRow() { 
      return new Cell(row, column + 1, name, page); 
     } 

     public Cell previousInRow() { 
      return new Cell(row, column - 1, name, page); 
     } 

     public Cell nextInColumn() { 
      return new Cell(row + 1, column, name, page); 
     } 

     public Cell previousInColumn() { 
      return new Cell(row - 1, column, name, page); 
     } 
    } 
} 

AbstractPageElementFieldDecoratorのためのデフォルトの実装で使用されました:

は、ここでは、コードスニペットです。また

enter image description here

は、あなたがyandex-qatools htmlelementsに外観を持つことができます。
プロジェクト構造は次のようでした。彼らは要素のためのカスタムデコレータとラッパークラスを作成しました。

はところで:彼らはTable

関連する問題