熟悉PageObject模式的朋友一定对 FindBy,FindBys,FindAll 这三个annotation不陌生,借助这三个注解WebDriver提供了一种比较直观的元素管理的解决方案.
但是如果单一页面的元素比较多的时候,都写在一个类里反而不太好管理,这里我们可能会采用两种方式来解决
1 把页面再次分解
2 把元素的xpath等信息写在文件里.
页面分解很好理解,把一个复杂的页面分成若干个类来管理.但是把元素的信息写到文件里又会碰到一个问题,文件的读写.这里我们就可以用自定义annotation来解决。
首先我们先来了解一下,WebDriver是如何通过一个 @FindBy 来组合我们的元素的。提示:以下内容包含大量Java反射内容,最好有所了解.
假如 你有这么一个类
public class BaiduHomePage {
public BaiduHomePage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
@FindBy(id = "kw")
private WebElement inputSearch;
@FindBy(id = "su")
private WebElement buttonSearch;
public void searchByKeyWords(String keyWord) {
inputSearch.clear();
inputSearch.sendKeys(keyWord);
buttonSearch.click();
}
}
那么一切要从
PageFactory.initElements(driver, this);
这一行开始说起
查看源码可以得知
public static void initElements(WebDriver driver, Object page) {
final WebDriver driverRef = driver;
initElements(new DefaultElementLocatorFactory(driverRef), page);
}
注意这里的
DefaultElementLocatorFactory
从名字看就可以知道这是一个元素定位工厂类,具体实现暂且不谈继续往下看
又调用了另一个方法
public static void initElements(ElementLocatorFactory factory, O