2017-10-18 14 views
0

ウェブページの自動テストを作成しようとしています。 Webページにはフィルタフォームとテーブルがあります。表には、データを提示するための5-6の異なる方法があります。セレンテストで操作を一般化する

データ提示方法ごとにPageObjectsを作成しました(すべてが異なる列のテーブルだけです)。今私はテーブルを見つけることができ、それから行を尋ねることができるこの汎用Pageobjectを持っています。

しかし、私はテーブルのすべての行をフェッチするコードの作業を取得することはできません。

public <T> List<T> getAllRows(){ 
     List<AbstractTableRow> allRows = table.findElements(By.xpath("//tr[@role='row']").className("jqgrow")).stream() 
      .map(AbstractTableRow::new).collect(Collectors.toList()); 
     if(allRows != null) { 
      return (List<T>)allRows; 
     } 

     return null; 
    } 

概要TableRowは他のすべての行の親です。しかし、実際に抽象クラスではありません(私はその方法を試してみて、ジェネリックの厄介なビジネスに終わってしまいました。だから今私は、子供を親に捨て去るために何かを必要とするか、または誰かが反射とジェネリックを使って(私は再びAbstratTableRowの要約を作ることができる)例を挙げることができます。すべてのtablerow型はWebElement型であり、すべてのrowobjectはコンストラクタとして

public SomeRow(WebElement element) 

を持っています。メソッドはListを返す必要があります。ここで、SomeRowは5-6行のいずれかの型です。

答えて

0

TableRowインターフェイスを実装する(または抽象的なAbstractTableRowクラスを拡張する)オブジェクトを生成するファクトリクラスが必要です。

これは通常、このような方法で行われます:

public interface TableRow { 
    /*methods..*/ 
} 

public class NiceRow implements TableRow { 
    public NiceRow(WebElement element) { 
    //implementation 
    } 
    /*Implementation..*/ 
} 

public class CuteRow implements TableRow { 
    public CuteRow(WebElement element) { 
    //implementation 
    } 
    /*Implementation..*/ 
} 

public class TableRowFactory { 
    public static TableRow getRow(WebElement element) { 
    switch(element.getAttribute("class")) { 
     case "nice": 
     return new NiceRow(element); 
     /*...*/ 
    } 
    } 
} 

今、あなたはファクトリオブジェクトを取得し、行を生成するためにそれを使用することができます:

TableRowFactory factory = new TableRowFactory(); 
List<TableRow> allRows = 
    table.findElements(By.xpath("//tr[@role='row']")).stream() 
     .map(element -> factory.getRow(element)) 
     .collect(Collectors.toList());  

EDIT: ことのgetAttributeは(注意してください"class")はおそらく単なるクラスよりも何かを生成するでしょうし、クラス間を区別する目的のためだけに私のコードにあります。

0

concrete SomeRow typeのクラスに合格することができます。また、RowTableをabstractに切り替えることもできます。抽象メソッドには、WebElementを単一のパラメータとして持つコンストラクタが含まれ、サブタイプでオーバーロードされます。 (私はこれがすでに存在していると思う)。

public static <T extends RowTable> List<T> getTableData(Class<T> clz) throws Exception { 

      List<WebElement> elems = .....Your query....; 
      Constructor<T> cont = clz.getConstructor(WebElement.class); 

      List<T> data = elems.stream().map(e -> { 
       T type = null; 
       try { 
        type = cont.newInstance(e); 
       } catch (Exception e1) { 
        throw new RuntimeException(e1); 
       }   
       return type; 
      }).collect(Collectors.toList()); 

      return data; 
     } 

好きそれを呼び出す - 同じ結果がちょうど質問からコード内で「マップ(ConcreteRow ::新)」をやって実現することができるようにgetTableData(ConcreteRow.class)

+0

は思えます。少し問題を正確にすべて(これは非常に読み取り可能な一般的な+反射)ロジックを解決する混乱する? – Kudin

関連する問題