2017-04-06 114 views
0

我正在描述使用Selenium的網格或表格視圖。 我想要做的是開發一個抽象類表,從中繼承另一個類。 這裏的理念是: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); 
     } 
    } 
} 

AbstractPageElement與用於FieldDecorator默認實現使用。
項目結構是這樣的:

enter image description here

此外,您還可以看看到yandex-qatools htmlelements。他們爲元素創建了自定義裝飾器和包裝類。

BTW:他們有Table