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
的实现
我正在描述使用 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
的实现