Selenium中的通用字段初始化

时间:2017-04-06 15:02:27

标签: java selenium generics selenium-webdriver autotest

我正在使用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 个答案:

答案 0 :(得分: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。他们为元素创建了自定义装饰器和包装类。

BTW:他们实施了Table