2017-04-06 106 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