Selenium框架源码解析-1 PageFactory
前提:
几天前接触到Selenium,看到定义的变量不需要实例化就可以直接运行,觉得挺稀奇,故想一览其中之奥妙,取其中之精华。
直接上码:
package com.prs.t;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.PageFactory;
public class LoginPage {
private WebDriver webdriver;
public WebElement su;
public WebElement kw;
public LoginPage(WebDriver webdriver){
this.webdriver = webdriver;
PageFactory.initElements(webdriver, this);
}
public void inputAndClickSerch() throws InterruptedException{
kw.sendKeys("selenium测试");
su.click();
Thread.sleep(3000);
System.out.println("getTitle--->"+webdriver.getTitle());
}
}
问题:上面WebElement su及WebElement kw是怎么被实例化的?
PageFactory.initElements(webdriver, this)
这句代码,初始化Element,跑进去看看
public static void initElements(WebDriver driver, Object page) {
final WebDriver driverRef = driver;
initElements(new DefaultElementLocatorFactory(driverRef), page);
}
并没有看到赋值继续走
public static void initElements(ElementLocatorFactory factory, Object page) {
final ElementLocatorFactory factoryRef = factory;
initElements(new DefaultFieldDecorator(factoryRef), page);
}
继续
public static void initElements(FieldDecorator decorator, Object page) {
Class<?> proxyIn = page.getClass(); // 取得LoginPage.class
while (proxyIn != Object.class) {
proxyFields(decorator, page, proxyIn); //跟进去看看
proxyIn = proxyIn.getSuperclass();
}
}
看到下面的代码有没有熟悉的感觉,没错就是根据反射取得该类的Filed: Field[] fields = proxyIn.getDeclaredFields();
在对其进行赋值操作:
field.setAccessible(true);
field.set(page, value);
private static void proxyFields(FieldDecorator decorator, Object page, Class<?> proxyIn) {
Field[] fields = proxyIn.getDeclaredFields();
for (Field field : fields) {
Object value = decorator.decorate(page.getClass().getClassLoader(), field);
if (value != null) {
try {
field.setAccessible(true);
field.set(page, value);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
}
以上就是PageFactory如何对WebElenment赋值操作的,但是问题又来了值从哪儿来?见下回分解