Selenium 中的通用字段初始化

Generic fields initialization in Selenium

我正在描述使用 Selenium 的网格或 table 视图。 我想做的是开发一个抽象 class Table,另一个 classes 将从中继承。 这是想法:

摘要Table class:

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 class:

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

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

我的Table class:

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 }
}

假设有不止一个class类似于MyTable.

所以,我的主要问题是:class MyTable 的内部 class 是否会被装饰和初始化?或者,如果没有,那么也许有一种方法可以更有效地做到这一点?

我过去也尝试过类似的事情。然而,它要简单得多。

这是代码片段:

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.
的默认实现 项目结构如下:

另外,你可以去yandex-qatools htmlelements看看。他们为元素创建了自定义装饰器和包装器 类。

顺便说一句:他们有 Table

的实现