我真的很喜歡selenium 2按照慣例推動你使用PageObjects作爲POJO,然後使用PageFactory來實例化這個類中的字段。硒頁面對象重用
我發現限制的是我們在很多不同的頁面上重複使用了很多元素。最大的問題是這些重複使用的組件在它們出現在不同的頁面上時沒有相同的ID /名稱;然而我們爲每個人運行的測試都是一樣的。
作爲一個例子,我們在很多地方收集日期。因此,對於這樣的一個例子頁面對象可以是(月,日字段中刪除):
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();
}
}
我真正喜歡做的事是有一個設置,藉此Spring可以將該id/name/xpath等注入到應用程序中。
有沒有一種方法可以做到這一點,而不會失去利用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 - 正如一個音符,只要您運行的硒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);
}
}
這無疑得到了我正確的軌道上。我希望進一步擴展它不僅僅是ID(你可以注入任何需要的方法,然後找到)。我的問題是我沒有看到這些Field是如何創建的 - 這導致我無法正確掌握ElementLocator。 – Scott 2010-10-21 16:56:23