Мне действительно нравится, как селен 2 по соглашению подталкивает вас к использованию PageObjects в качестве POJO, а затем просто к использованию PageFactory для создания экземпляров полей в этом классе.
Что я считаю ограничивающим, так это то, что мы многократно используем многоэлементов на разных страницах.Большая проблема заключается в том, что эти повторно используемые компоненты не имеют одинаковый идентификатор / имя, когда они появляются на разных страницах;однако тесты, которые мы будем выполнять для каждого из них, одинаковы.
В качестве примера мы собираем даты во многих местах.Таким образом, пример объекта страницы для этого может быть (месяц, поля дня удалены):
public class DatePageObject {
private WebDriver driver;
DatePageObject(WebDriver driver) {
this.driver = driver;
}
@FindBy( id = "someIdForThisInstance")
private WebElement year;
public void testYearNumeric() {
this.year.sendKeys('aa');
this.year.submit();
//Logic to determine Error message shows up
}
}
Тогда я мог бы просто проверить это с кодом ниже:
public class Test {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
DatePageObject dpo = PageFactory.initElements(driver, DriverPageObject.class);
driver.get("Some URL");
dpo.testYearNumeric();
}
}
Что бы ямне действительно нравится делать настройки, с помощью которых я могу вставить этот идентификатор / имя / xpath и т. д. в приложение в Spring.
Есть ли способ, которым я могу сделать это, не теряя возможности использовать PageFactory?
Редактировать 1 - Добавление идеальных классов базового уровня, работающих на пользовательских локаторах и фабриках.
public class PageElement {
private WebElement element;
private How how;
private String using;
PageElement(How how, String using) {
this.how = how;
this.using = using;
}
//Getters and Setters
}
public class PageWidget {
private List<PageElement> widgetElements;
}
public class Screen {
private List<PageWidget> fullPage;
private WebDriver driver;
public Screen(WebDriver driver) {
this.driver = driver;
for (PageWidget pw : fullPage) {
CustomPageFactory.initElements(driver, pw.class);
}
}
Редактировать 2 - В качестве примечания, пока вы работаете с Selenium 2.0.a5 или выше, вы можете дать драйверу неявное значение тайм-аута.
Таким образом, вы можете заменить свойкод с:
private class CustomElementLocator implements ElementLocator {
private WebDriver driver;
private int timeOutInSeconds;
private final By by;
public CustomElementLocator(WebDriver driver, Field field,
int timeOutInSeconds) {
this.driver = driver;
this.timeOutInSeconds = timeOutInSeconds;
CustomAnnotations annotations = new CustomAnnotations(field);
this.by = annotations.buildBy();
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS); //Set this value in a more realistic place
}
public WebElement findElement() {
return driver.findElement(by);
}
}