Друзья! Доброго времени суток!
Буду признателен, если поможете разобрать следующую ситуацию. Пишу фреймворк с использованием PageFactory и до тех пор пока пользовался интерфейсом WebElement в сочетании с аннотацией @FindBy для описания элементов страницы в page object классах проблем не возникало. Когда решил воспользоваться стандартным Select для описания select элемента, то уже пришлось вызывать конструктор при описании поля:
Select mySelect = new Select(driver.findElement(By.id("select_id")));
Конструкция типа:
@FindBy(id = "foo") private WebElement wannabeSelect;
Select realSelect = new Select(wannabeSelect);
также не срабатывала.
Но самое интересное началось когда я решил использовать свои интерфейсы для контролов на странице:
public class MainPage extends BasePage {
@FindBy(id = "text_id")
private TextField myField;
@FindBy(css = "input[type=\"submit\"]")
private Button myButton;
public MainPage(WebDriver driver) {
super(driver);
PageFactory.initElements(driver, this); // ! в таком виде initElements() не может инициализировать элементы страницы, которые не являются WebElement !
}
...
}
В общем, в данном случае нужно использовать другой вариант метода initElements(), а именно:
static void initElements(FieldDecorator decorator, java.lang.Object page)
В документации сказано: "Similar to the other "initElements" methods, but takes an FieldDecorator which is used for decorating each of the fields."
В общем, насколько я понимаю нужно реализовать свой декоратор, так как именно он вызывается PageFactory применительно к полям с типом отличным от WebElement.
Если кто-то реализовывал свои декораторы, пожалуйста, поделитесь опытом как это правильно делать.